From 1785759d0fa52500027042344870dbea177d37b6 Mon Sep 17 00:00:00 2001 From: yinhuaiwei Date: Thu, 15 Oct 2026 09:31:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=201.=E4=BC=98=E5=8C=96=E6=B5=8B=E6=B8=A9?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=EF=BC=8C=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E6=9C=80=E9=AB=98/=E6=9C=80=E4=BD=8E/=E5=B9=B3=E5=9D=87?= =?UTF-8?q?=E6=B8=A9=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/Infrared/InfraredInfo.java | 14 ++-- .../domain/algorithm/out/AnalyseResPoint.java | 23 ++++++ .../service/ImageAnnotationService.java | 29 +++++-- .../service/TemperatureDataService.java | 81 +++++++++++++------ .../service/impl/AlgorithmServiceImpl.java | 15 +++- .../service/impl/HikVisionServiceImpl.java | 7 +- 6 files changed, 127 insertions(+), 42 deletions(-) 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 95896b4..4e428bb 100644 --- a/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java +++ b/src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java @@ -41,22 +41,24 @@ public class InfraredInfo { private float[][] temperatureMatrix; // 整个温度矩阵 //全部区域-最高温 - private float maxTemp; + private Float maxTemp; + // 平均温度 + private Float avgTemp; //全部区域-最低温 - private float minTemp; + private Float minTemp; @JsonIgnore //框选区域-平均值 - private float frameAverage; + private Float frameAverage; // @JsonIgnore //框选区域-最大值 - private float frameMax; + private Float frameMax; @JsonIgnore //框选区域-最小值 - private float frameMin; + private Float frameMin; @JsonIgnore // 指定点的温度 - private float pointTemperature; + private Float pointTemperature; @JsonIgnore private Integer maxTempX; diff --git a/src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java b/src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java index d177c5a..11d1ba3 100644 --- a/src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java +++ b/src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java @@ -1,12 +1,15 @@ package com.inspect.simulator.domain.algorithm.out; import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.annotation.JsonInclude; import com.inspect.simulator.domain.algorithm.in.AnalyseConstants; import org.apache.commons.lang3.StringUtils; import java.io.Serializable; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; public class AnalyseResPoint implements Serializable { @@ -19,6 +22,8 @@ public class AnalyseResPoint implements Serializable { private String conf; private String desc; private List pos; + @JsonInclude(JsonInclude.Include.NON_NULL) + private Map extra = new HashMap<>(); public boolean checkSuccess() { return "2000".equals(this.code) && "1".equals(this.value); @@ -104,6 +109,24 @@ public class AnalyseResPoint implements Serializable { this.pos = pos; } + public Map getExtra() { return extra; } + public void setExtra(Map extra) { this.extra = extra; } + + public Object getExtra(String key) { + return extra == null ? null : extra.get(key); + } + + public void putExtra(String key, Object value) { + // 不保存 null 值 + if (value == null) { + return; + } + if (extra == null) { + extra = new HashMap<>(); + } + extra.put(key, value); + } + @Override public boolean equals(Object object) { if (this == object) return true; diff --git a/src/main/java/com/inspect/simulator/service/ImageAnnotationService.java b/src/main/java/com/inspect/simulator/service/ImageAnnotationService.java index a2a2de1..7ac0612 100644 --- a/src/main/java/com/inspect/simulator/service/ImageAnnotationService.java +++ b/src/main/java/com/inspect/simulator/service/ImageAnnotationService.java @@ -73,9 +73,17 @@ public class ImageAnnotationService { public BufferedImage annotate(BufferedImage originalImage, InfraredInfo infraredInfo, List coordinates, boolean genThermal) { // 转为标注数据 TemperatureDataService tempData = new TemperatureDataService(); - tempData.load(infraredInfo.getTemperatureMatrix()); + float[][] temperatureMatrix = infraredInfo.getTemperatureMatrix(); + if (!TemperatureDataService.hasTemperatureData(temperatureMatrix)) { + infraredInfo.setMaxTemp(null); + infraredInfo.setAvgTemp(null); + infraredInfo.setMinTemp(null); + return originalImage; + } + tempData.load(temperatureMatrix); infraredInfo.setMaxTemp(tempData.getMaxTemp()); + infraredInfo.setAvgTemp(tempData.getAvgTemp()); infraredInfo.setMinTemp(tempData.getMinTemp()); int originalWidth = originalImage.getWidth(); @@ -131,7 +139,7 @@ public class ImageAnnotationService { log.info("最低温度: {}, 表格坐标: ({},{}), 图片坐标: ({},{})", tempData.getMinTemp(), tempData.getMinCol(), tempData.getMinRow(), minX, minY); } - if (coordinates.size() > 0) { + if (coordinates != null && !coordinates.isEmpty()) { Coordinate coordinate = coordinates.get(0); int[] points = coordinate.getPoints(); int coordinateWidth = coordinate.getWidth(); @@ -153,7 +161,7 @@ public class ImageAnnotationService { } g.setColor(Color.white); - g.setStroke(new BasicStroke(3)); + g.setStroke(new BasicStroke(2)); g.draw(region); TemperatureDataService.RegionStats stats = tempData.calcRegion(xs, ys); @@ -169,10 +177,15 @@ public class ImageAnnotationService { int rMinY = Math.round(stats.getMinRow() * scaleY); drawDot(g, rMaxX, rMaxY, MAX_TEMP_COLOR); drawDot(g, rMinX, rMinY, MIN_TEMP_COLOR); - } - infraredInfo.setFrameMax(stats.getMax()); - infraredInfo.setFrameMin(stats.getMin()); + infraredInfo.setFrameMax(stats.getMax()); + infraredInfo.setFrameMin(stats.getMin()); + infraredInfo.setFrameAverage(stats.getAvg()); + + infraredInfo.setMaxTemp(stats.getMax()); + infraredInfo.setAvgTemp(stats.getAvg()); + infraredInfo.setMinTemp(stats.getMin()); + } } drawLabels(g, labels, canvas.getWidth(), canvas.getHeight()); @@ -249,9 +262,9 @@ public class ImageAnnotationService { */ private void drawDot(Graphics2D g, int x, int y, Color color) { int dotR = 3; - int ringR = 5; + int ringR = 4; g.setColor(Color.WHITE); - g.setStroke(new BasicStroke(2)); + g.setStroke(new BasicStroke(1)); g.drawOval(x - ringR, y - ringR, ringR * 2, ringR * 2); g.setColor(color); g.fillOval(x - dotR, y - dotR, dotR * 2, dotR * 2); diff --git a/src/main/java/com/inspect/simulator/service/TemperatureDataService.java b/src/main/java/com/inspect/simulator/service/TemperatureDataService.java index a3390d6..569950d 100644 --- a/src/main/java/com/inspect/simulator/service/TemperatureDataService.java +++ b/src/main/java/com/inspect/simulator/service/TemperatureDataService.java @@ -13,18 +13,54 @@ public class TemperatureDataService { private int maxRow, maxCol; private float minTemp = Float.MAX_VALUE; private float maxTemp = Float.MIN_VALUE; + private float avgTemp; + + private static boolean containsPoint(double[] xs, double[] ys, double px, double py) { + boolean inside = false; + for (int i = 0, j = xs.length - 1; i < xs.length; j = i++) { + double yi = ys[i], yj = ys[j]; + if ((yi > py) != (yj > py)) { + double xi = xs[i], xj = xs[j]; + if (px < (xj - xi) * (py - yi) / (yj - yi) + xi) { + inside = !inside; + } + } + } + return inside; + } @Override public String toString() { return "TemperatureDataService{" + "rows=" + rows + ", cols=" + cols + ", minRow=" + minRow + ", minCol=" + minCol + ", maxRow=" + maxRow + ", maxCol=" + maxCol + ", minTemp=" + minTemp + ", maxTemp=" + maxTemp + '}'; } + public static boolean hasTemperatureData(float[][] temperatureMatrix) { + if (temperatureMatrix == null || temperatureMatrix.length == 0) { + return false; + } + + for (float[] row : temperatureMatrix) { + if (row == null) { + continue; + } + for (float value : row) { + if (!Float.isNaN(value)) { + return true; + } + } + } + return false; + } + public void load(float[][] temperatureMatrix) { temperatures = temperatureMatrix; rows = temperatures.length; cols = temperatures[0].length; + double sum = 0; + int count = 0; for (int r = 0; r < rows; r++) { + System.arraycopy(temperatures[r], 0, this.temperatures[r], 0, cols); for (int c = 0; c < cols; c++) { float v = temperatures[r][c]; if (!Float.isNaN(v)) { @@ -38,22 +74,27 @@ public class TemperatureDataService { maxRow = r; maxCol = c; } + sum += v; + count++; } } } + this.avgTemp = count == 0 ? Float.NaN : (float) (sum / count); } public RegionStats calcRegion(double[] xs, double[] ys) { if (xs == null || ys == null || xs.length != ys.length || xs.length < 3) { - return new RegionStats(0, 0, 0, -1, -1,-1,-1); + return new RegionStats(0, 0, 0, -1, -1, -1, -1); } // Bounding box of the polygon, clamped to the CSV grid double minX = Double.MAX_VALUE, maxX = -Double.MAX_VALUE; double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE; for (int i = 0; i < xs.length; i++) { - minX = Math.min(minX, xs[i]); maxX = Math.max(maxX, xs[i]); - minY = Math.min(minY, ys[i]); maxY = Math.max(maxY, ys[i]); + minX = Math.min(minX, xs[i]); + maxX = Math.max(maxX, xs[i]); + minY = Math.min(minY, ys[i]); + maxY = Math.max(maxY, ys[i]); } int r0 = Math.max(0, (int) Math.floor(minY)); int r1 = Math.min(rows, (int) Math.ceil(maxY)); @@ -69,42 +110,36 @@ public class TemperatureDataService { if (!containsPoint(xs, ys, c + 0.5, r + 0.5)) continue; float v = temperatures[r][c]; if (!Float.isNaN(v)) { - if (v < min) { min = v; minR = r; minC = c; } - if (v > max) { max = v; maxR = r; maxC = c; } + if (v < min) { + min = v; + minR = r; + minC = c; + } + if (v > max) { + max = v; + maxR = r; + maxC = c; + } sum += v; count++; } } } - if (count == 0) return new RegionStats(0, 0, 0, -1, -1,-1,-1); - return new RegionStats(min, max, sum / count, minR, minC, maxR, maxC); - } - - private static boolean containsPoint(double[] xs, double[] ys, double px, double py) { - boolean inside = false; - for (int i = 0, j = xs.length - 1; i < xs.length; j = i++) { - double yi = ys[i], yj = ys[j]; - if ((yi > py) != (yj > py)) { - double xi = xs[i], xj = xs[j]; - if (px < (xj - xi) * (py - yi) / (yj - yi) + xi) { - inside = !inside; - } - } - } - return inside; + if (count == 0) return new RegionStats(0, 0, 0, -1, -1, -1, -1); + return new RegionStats(min, max, (float) (sum / count), minR, minC, maxR, maxC); } @Getter public static class RegionStats { private final float min; private final float max; - private final double avg; + private final float avg; private final int minRow; private final int minCol; private final int maxRow; private final int maxCol; - public RegionStats(float min, float max, double avg, int minRow, int minCol, int maxRow, int maxCol) { + public RegionStats(float min, float max, float avg, int minRow, int minCol, int maxRow, int maxCol) { this.min = min; this.max = max; this.avg = avg; diff --git a/src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java b/src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java index 18a4e15..aeaa23a 100644 --- a/src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java +++ b/src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java @@ -280,16 +280,25 @@ public class AlgorithmServiceImpl implements AlgorithmService { analyseResPoint.setResImageUrl(infraredInfo.getOutPath()); analyseResPoint.setType(typeListStr); - float value = infraredInfo.getFrameMax() == 0.0f ? infraredInfo.getMaxTemp() : infraredInfo.getFrameMax(); + Float maxTemp = infraredInfo.getMaxTemp(); + Float minTemp = infraredInfo.getMinTemp(); + Float avgTemp = infraredInfo.getAvgTemp(); - if (value == 0.0f) { + boolean hasTemperature = + maxTemp != null && minTemp != null && avgTemp != null; + + if (!hasTemperature) { analyseResPoint.setCode("2002"); analyseResPoint.setValue("--"); analyseResPoint.setDesc("分析失败"); } else { analyseResPoint.setCode("2000"); analyseResPoint.setDesc("正常"); - analyseResPoint.setValue(String.format("%.1f", value)); + analyseResPoint.setValue(String.format("%.1f", maxTemp)); + + analyseResPoint.putExtra("maxValue", maxTemp); + analyseResPoint.putExtra("minValue", minTemp); + analyseResPoint.putExtra("avgValue", avgTemp); } if (StringUtils.isNotBlank(analyseResPoint.getImageNormalUrlPath())) { 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 cc026e8..b59212b 100644 --- a/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java +++ b/src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java @@ -1059,10 +1059,13 @@ public class HikVisionServiceImpl implements HikVisionService { requestBody.put("userName", eqpAddress[10]); requestBody.put("password", eqpAddress[11]); log.info("requestBody 请求体: " + requestBody.toString()); - if (StringUtils.isNotNull(redisService.redisTemplate.opsForValue().get(eqpAddress[7] + '_' + eqpchannel.getPresetPosCode()))) { - temperatureData = convertJsonToTemperatureData(redisService.redisTemplate.opsForValue().get(eqpAddress[7] + '_' + eqpchannel.getPresetPosCode()).toString()); + String redisKey = eqpAddress[7] + '_' + eqpchannel.getPresetPosCode(); + if (StringUtils.isNotNull(redisService.redisTemplate.opsForValue().get(redisKey))) { + temperatureData = convertJsonToTemperatureData(redisService.redisTemplate.opsForValue().get(redisKey).toString()); + log.info("TemperatureMeasurement exist: {}, data: {}", redisKey, temperatureData); } else { temperatureData = null; + log.info("TemperatureMeasurement null: {}", redisKey); } return temperatureData;