Browse Source

在画框区域,标出画框最高温度点的位置

master
hsc 6 months ago
parent
commit
4760f80aaf
2 changed files with 63 additions and 11 deletions
  1. +5
    -0
      src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java
  2. +58
    -11
      src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java

+ 5
- 0
src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java View File

@ -58,6 +58,11 @@ public class InfraredInfo {
// 指定点的温度
private float pointTemperature;
@JsonIgnore
private Integer maxTempX;
@JsonIgnore
private Integer maxTempY;
//标注后图片路径
private String outPath;


+ 58
- 11
src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java View File

@ -33,7 +33,6 @@ import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPSClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -536,6 +535,10 @@ public class HikVisionServiceImpl implements HikVisionService {
InfraredInfo infraredInfo = new InfraredInfo();
//存储框选矩阵温度值
List<Float> values = new ArrayList<>();
// 用于记录最高温度的坐标
int maxTempX = -1;
int maxTempY = -1;
float currentMax = Float.MIN_VALUE;
if (ObjectUtil.isNotEmpty(coordinate.getFirstX()) && ObjectUtil.isNotEmpty(coordinate.getSecondX())) {
//if (coordinate.getImgType() != 3)
// {//无人机不需要对比底图
@ -558,7 +561,14 @@ public class HikVisionServiceImpl implements HikVisionService {
if (j < 0 || j >= temperatureMatrix.length) continue;
for (int i = coordinate.getFirstX(); i <= coordinate.getSecondX(); i++) { // 固定列遍历行
if (i < 0 || i >= temperatureMatrix[j].length) continue;
values.add(temperatureMatrix[j][i]);
float temp = temperatureMatrix[j][i];
values.add(temp);
if (temp > currentMax) {
currentMax = temp;
maxTempX = i;
maxTempY = j;
}
}
}
}
@ -566,6 +576,14 @@ public class HikVisionServiceImpl implements HikVisionService {
float frameAverage = (float) values.stream().mapToDouble(f -> f).average().orElse(0);
float frameMax = (float) values.stream().mapToDouble(f -> f).max().orElse(0);
float frameMin = (float) values.stream().mapToDouble(f -> f).min().orElse(0);
// 设置最高温度坐标如果有找到的话
if (maxTempX != -1 && maxTempY != -1) {
infraredInfo.setMaxTempX(maxTempX);
infraredInfo.setMaxTempY(maxTempY);
log.info("最大温度坐标:{}, {}", maxTempX, maxTempY);
}
infraredInfo.setFrameAverage(frameAverage);
infraredInfo.setFrameMax(frameMax);
infraredInfo.setFrameMin(frameMin);
@ -729,6 +747,11 @@ public class HikVisionServiceImpl implements HikVisionService {
InfraredInfo drawStringMatrix = matrixTemperatureShow(c, infraredInfo.getMatrixWidth(), infraredInfo.getMatrixHeight(), infraredInfo.getTemperatureMatrix());
infraredInfo.setFrameMax(Math.round(drawStringMatrix.getFrameMax() * 100) / 100f);
Integer maxTempX = drawStringMatrix.getMaxTempX();
Integer maxTempY = drawStringMatrix.getMaxTempY();
log.info("最高温度值坐标点:" + "maxTempX:" + maxTempX + " maxTempY:" + maxTempY);
// 添加矩形标签
String line1 = "平均温度:" + String.format("%.2f", drawStringMatrix.getFrameAverage());
String line2 = "最高温度:" + String.format("%.2f", drawStringMatrix.getFrameMax());
@ -736,7 +759,34 @@ public class HikVisionServiceImpl implements HikVisionService {
g2d.drawString(line1, rectX + 5, rectY + 15);
g2d.drawString(line2, rectX + 5, rectY + 30);
g2d.drawString(line3, rectX + 5, rectY + 45);
}else {
// 在最高温度点画一个空心圆红色边框
if (maxTempX != null && maxTempY != null) {
log.info("画最高温度的点,坐标:x={}, y={}", maxTempX, maxTempY);
// 边界检查
if (maxTempX >= 0 && maxTempX < originalImage.getWidth() &&
maxTempY >= 0 && maxTempY < originalImage.getHeight()) {
// 设置醒目的颜色
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(5));
// 画空心圆
int circleDiameter = 8;
g2d.drawOval(maxTempX - circleDiameter / 2, maxTempY - circleDiameter / 2,
circleDiameter, circleDiameter);
// 画十字标记
g2d.drawLine(maxTempX - 3, maxTempY, maxTempX + 3, maxTempY);
g2d.drawLine(maxTempX, maxTempY - 3, maxTempX, maxTempY + 3);
log.info("成功绘制最高温度点标记");
} else {
log.warn("最高温度点坐标超出图像范围:x={}, y={}", maxTempX, maxTempY);
}
}
} else {
log.error("画框坐标超出图片范围");
// 确保x1,y1是左上角x2,y2是右下角
int rectX = Math.min(1, 639);
@ -1046,7 +1096,7 @@ public class HikVisionServiceImpl implements HikVisionService {
}
}
return result;
} finally {
} finally {
// 8. 确保资源关闭
IOUtils.closeQuietly(csvParser);
IOUtils.closeQuietly(inputStream);
@ -1167,7 +1217,6 @@ public class HikVisionServiceImpl implements HikVisionService {
}
//异常处理返回本地csv
private float[][] exceptionHandling() throws IOException {
//i.csv文件存放到resources下
@ -1409,7 +1458,7 @@ public class HikVisionServiceImpl implements HikVisionService {
floats = UploadFtpImage(hrUavUrl, null, ftpUrlName);
if (floats != null && floats.length > 0 && floats[0].length > 0) {
infraredInfo.setTemperatureMatrix(floats);
log.info("配置的点位"+infraPictureInfo.getFirstX(),infraPictureInfo.getFirstY());
log.info("配置的点位" + infraPictureInfo.getFirstX(), infraPictureInfo.getFirstY());
String s = ImageOverlays(infraPictureInfo, infraredInfo);
infraredInfo.setOutPath(s);
} else {
@ -1447,14 +1496,13 @@ public class HikVisionServiceImpl implements HikVisionService {
}
@Override
public InputStream downloadCsv(String filePath) {
log.info("解析csv图片地址"+filePath);
log.info("解析csv图片地址" + filePath);
String updatePath = truncateFileNameToCsv(filePath);
InputStream inputStream = downloadFtp(updatePath);
if(inputStream==null){
log.info("图片地址"+updatePath+"无返回");
if (inputStream == null) {
log.info("图片地址" + updatePath + "无返回");
}
// if (!produceEnvironment) {
@ -1517,7 +1565,6 @@ public class HikVisionServiceImpl implements HikVisionService {
String processedFileName = processFileNameToCsv(fileName);
return path + processedFileName;
}


Loading…
Cancel
Save