Browse Source

feat: 1.优化测温返回结果,返回最高/最低/平均温度

master
yinhuaiwei 4 weeks ago
parent
commit
1785759d0f
6 changed files with 127 additions and 42 deletions
  1. +8
    -6
      src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java
  2. +23
    -0
      src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java
  3. +21
    -8
      src/main/java/com/inspect/simulator/service/ImageAnnotationService.java
  4. +58
    -23
      src/main/java/com/inspect/simulator/service/TemperatureDataService.java
  5. +12
    -3
      src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java
  6. +5
    -2
      src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java

+ 8
- 6
src/main/java/com/inspect/simulator/domain/Infrared/InfraredInfo.java View File

@ -41,22 +41,24 @@ public class InfraredInfo {
private float[][] temperatureMatrix; // 整个温度矩阵 private float[][] temperatureMatrix; // 整个温度矩阵
//全部区域-最高温 //全部区域-最高温
private float maxTemp;
private Float maxTemp;
// 平均温度
private Float avgTemp;
//全部区域-最低温 //全部区域-最低温
private float minTemp;
private Float minTemp;
@JsonIgnore @JsonIgnore
//框选区域-平均值 //框选区域-平均值
private float frameAverage;
private Float frameAverage;
// @JsonIgnore // @JsonIgnore
//框选区域-最大值 //框选区域-最大值
private float frameMax;
private Float frameMax;
@JsonIgnore @JsonIgnore
//框选区域-最小值 //框选区域-最小值
private float frameMin;
private Float frameMin;
@JsonIgnore @JsonIgnore
// 指定点的温度 // 指定点的温度
private float pointTemperature;
private Float pointTemperature;
@JsonIgnore @JsonIgnore
private Integer maxTempX; private Integer maxTempX;


+ 23
- 0
src/main/java/com/inspect/simulator/domain/algorithm/out/AnalyseResPoint.java View File

@ -1,12 +1,15 @@
package com.inspect.simulator.domain.algorithm.out; package com.inspect.simulator.domain.algorithm.out;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.inspect.simulator.domain.algorithm.in.AnalyseConstants; import com.inspect.simulator.domain.algorithm.in.AnalyseConstants;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
public class AnalyseResPoint implements Serializable { public class AnalyseResPoint implements Serializable {
@ -19,6 +22,8 @@ public class AnalyseResPoint implements Serializable {
private String conf; private String conf;
private String desc; private String desc;
private List<Pos> pos; private List<Pos> pos;
@JsonInclude(JsonInclude.Include.NON_NULL)
private Map<String, Object> extra = new HashMap<>();
public boolean checkSuccess() { public boolean checkSuccess() {
return "2000".equals(this.code) && "1".equals(this.value); return "2000".equals(this.code) && "1".equals(this.value);
@ -104,6 +109,24 @@ public class AnalyseResPoint implements Serializable {
this.pos = pos; this.pos = pos;
} }
public Map<String, Object> getExtra() { return extra; }
public void setExtra(Map<String, Object> 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 @Override
public boolean equals(Object object) { public boolean equals(Object object) {
if (this == object) return true; if (this == object) return true;


+ 21
- 8
src/main/java/com/inspect/simulator/service/ImageAnnotationService.java View File

@ -73,9 +73,17 @@ public class ImageAnnotationService {
public BufferedImage annotate(BufferedImage originalImage, InfraredInfo infraredInfo, List<Coordinate> coordinates, boolean genThermal) { public BufferedImage annotate(BufferedImage originalImage, InfraredInfo infraredInfo, List<Coordinate> coordinates, boolean genThermal) {
// 转为标注数据 // 转为标注数据
TemperatureDataService tempData = new TemperatureDataService(); 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.setMaxTemp(tempData.getMaxTemp());
infraredInfo.setAvgTemp(tempData.getAvgTemp());
infraredInfo.setMinTemp(tempData.getMinTemp()); infraredInfo.setMinTemp(tempData.getMinTemp());
int originalWidth = originalImage.getWidth(); int originalWidth = originalImage.getWidth();
@ -131,7 +139,7 @@ public class ImageAnnotationService {
log.info("最低温度: {}, 表格坐标: ({},{}), 图片坐标: ({},{})", tempData.getMinTemp(), tempData.getMinCol(), tempData.getMinRow(), minX, minY); log.info("最低温度: {}, 表格坐标: ({},{}), 图片坐标: ({},{})", tempData.getMinTemp(), tempData.getMinCol(), tempData.getMinRow(), minX, minY);
} }
if (coordinates.size() > 0) {
if (coordinates != null && !coordinates.isEmpty()) {
Coordinate coordinate = coordinates.get(0); Coordinate coordinate = coordinates.get(0);
int[] points = coordinate.getPoints(); int[] points = coordinate.getPoints();
int coordinateWidth = coordinate.getWidth(); int coordinateWidth = coordinate.getWidth();
@ -153,7 +161,7 @@ public class ImageAnnotationService {
} }
g.setColor(Color.white); g.setColor(Color.white);
g.setStroke(new BasicStroke(3));
g.setStroke(new BasicStroke(2));
g.draw(region); g.draw(region);
TemperatureDataService.RegionStats stats = tempData.calcRegion(xs, ys); TemperatureDataService.RegionStats stats = tempData.calcRegion(xs, ys);
@ -169,10 +177,15 @@ public class ImageAnnotationService {
int rMinY = Math.round(stats.getMinRow() * scaleY); int rMinY = Math.round(stats.getMinRow() * scaleY);
drawDot(g, rMaxX, rMaxY, MAX_TEMP_COLOR); drawDot(g, rMaxX, rMaxY, MAX_TEMP_COLOR);
drawDot(g, rMinX, rMinY, MIN_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()); 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) { private void drawDot(Graphics2D g, int x, int y, Color color) {
int dotR = 3; int dotR = 3;
int ringR = 5;
int ringR = 4;
g.setColor(Color.WHITE); 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.drawOval(x - ringR, y - ringR, ringR * 2, ringR * 2);
g.setColor(color); g.setColor(color);
g.fillOval(x - dotR, y - dotR, dotR * 2, dotR * 2); g.fillOval(x - dotR, y - dotR, dotR * 2, dotR * 2);


+ 58
- 23
src/main/java/com/inspect/simulator/service/TemperatureDataService.java View File

@ -13,18 +13,54 @@ public class TemperatureDataService {
private int maxRow, maxCol; private int maxRow, maxCol;
private float minTemp = Float.MAX_VALUE; private float minTemp = Float.MAX_VALUE;
private float maxTemp = Float.MIN_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 @Override
public String toString() { public String toString() {
return "TemperatureDataService{" + "rows=" + rows + ", cols=" + cols + ", minRow=" + minRow + ", minCol=" + minCol + ", maxRow=" + maxRow + ", maxCol=" + maxCol + ", minTemp=" + minTemp + ", maxTemp=" + maxTemp + '}'; 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) { public void load(float[][] temperatureMatrix) {
temperatures = temperatureMatrix; temperatures = temperatureMatrix;
rows = temperatures.length; rows = temperatures.length;
cols = temperatures[0].length; cols = temperatures[0].length;
double sum = 0;
int count = 0;
for (int r = 0; r < rows; r++) { for (int r = 0; r < rows; r++) {
System.arraycopy(temperatures[r], 0, this.temperatures[r], 0, cols);
for (int c = 0; c < cols; c++) { for (int c = 0; c < cols; c++) {
float v = temperatures[r][c]; float v = temperatures[r][c];
if (!Float.isNaN(v)) { if (!Float.isNaN(v)) {
@ -38,22 +74,27 @@ public class TemperatureDataService {
maxRow = r; maxRow = r;
maxCol = c; maxCol = c;
} }
sum += v;
count++;
} }
} }
} }
this.avgTemp = count == 0 ? Float.NaN : (float) (sum / count);
} }
public RegionStats calcRegion(double[] xs, double[] ys) { public RegionStats calcRegion(double[] xs, double[] ys) {
if (xs == null || ys == null || xs.length != ys.length || xs.length < 3) { 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 // Bounding box of the polygon, clamped to the CSV grid
double minX = Double.MAX_VALUE, maxX = -Double.MAX_VALUE; double minX = Double.MAX_VALUE, maxX = -Double.MAX_VALUE;
double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE; double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
for (int i = 0; i < xs.length; i++) { 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 r0 = Math.max(0, (int) Math.floor(minY));
int r1 = Math.min(rows, (int) Math.ceil(maxY)); 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; if (!containsPoint(xs, ys, c + 0.5, r + 0.5)) continue;
float v = temperatures[r][c]; float v = temperatures[r][c];
if (!Float.isNaN(v)) { 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; sum += v;
count++; 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 @Getter
public static class RegionStats { public static class RegionStats {
private final float min; private final float min;
private final float max; private final float max;
private final double avg;
private final float avg;
private final int minRow; private final int minRow;
private final int minCol; private final int minCol;
private final int maxRow; private final int maxRow;
private final int maxCol; 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.min = min;
this.max = max; this.max = max;
this.avg = avg; this.avg = avg;


+ 12
- 3
src/main/java/com/inspect/simulator/service/impl/AlgorithmServiceImpl.java View File

@ -280,16 +280,25 @@ public class AlgorithmServiceImpl implements AlgorithmService {
analyseResPoint.setResImageUrl(infraredInfo.getOutPath()); analyseResPoint.setResImageUrl(infraredInfo.getOutPath());
analyseResPoint.setType(typeListStr); 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.setCode("2002");
analyseResPoint.setValue("--"); analyseResPoint.setValue("--");
analyseResPoint.setDesc("分析失败"); analyseResPoint.setDesc("分析失败");
} else { } else {
analyseResPoint.setCode("2000"); analyseResPoint.setCode("2000");
analyseResPoint.setDesc("正常"); 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())) { if (StringUtils.isNotBlank(analyseResPoint.getImageNormalUrlPath())) {


+ 5
- 2
src/main/java/com/inspect/simulator/service/impl/HikVisionServiceImpl.java View File

@ -1059,10 +1059,13 @@ public class HikVisionServiceImpl implements HikVisionService {
requestBody.put("userName", eqpAddress[10]); requestBody.put("userName", eqpAddress[10]);
requestBody.put("password", eqpAddress[11]); requestBody.put("password", eqpAddress[11]);
log.info("requestBody 请求体: " + requestBody.toString()); 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 { } else {
temperatureData = null; temperatureData = null;
log.info("TemperatureMeasurement null: {}", redisKey);
} }
return temperatureData; return temperatureData;


Loading…
Cancel
Save