|
|
|
@ -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; |
|
|
|
} |
|
|
|
|
|
|
|
|