diff --git a/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java b/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java index 88cc901..95896b4 100644 --- a/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java +++ b/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java @@ -58,6 +58,11 @@ public class InfraredInfo { // 指定点的温度 private float pointTemperature; + @JsonIgnore + private Integer maxTempX; + @JsonIgnore + private Integer maxTempY; + //标注后图片路径 private String outPath; diff --git a/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java b/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java index 1b7c72d..6d77c6d 100644 --- a/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java +++ b/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java @@ -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 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; }