Browse Source

功图诊断完善(增加SSIM方式,完善特征检测方式)

chenwen 1 year ago
parent
commit
076a52a6c9

+ 9 - 8
src/main/java/com/hb/proj/analysis/controller/DiagramDiagnoseController.java

@@ -31,7 +31,7 @@ import com.hb.proj.constant.SortCodeConstant;
 import com.hb.proj.data.controller.DataTransUtils;
 import com.hb.proj.data.service.DiagramDataService;
 import com.hb.proj.diagram.diagnose.DiagramChartBuilder;
-import com.hb.proj.diagram.diagnose.DiagramSimilarDetecter;
+import com.hb.proj.diagram.diagnose.SSIMExample;
 import com.hb.proj.model.DiagramDiagnoseStandardPO;
 import com.hb.proj.model.DiagramDiagnoseStandardVO;
 import com.hb.proj.model.DiagramFeature;
@@ -236,21 +236,22 @@ public class DiagramDiagnoseController {
 		String srcChart=createDiagramChart(request,wellId,diagramTime,null);
 		String basePath=request.getSession().getServletContext().getRealPath("");
 		
-		double minVal=Double.MAX_VALUE,temp=0;
-		DiagramDiagnoseStandardVO minVO=stds.get(0);
+		double maxVal=0,temp=0;
+		DiagramDiagnoseStandardVO similarVO=stds.get(0);
 		for(DiagramDiagnoseStandardVO std : stds) {
-			temp=DiagramSimilarDetecter.calcSimilary(basePath+std.getAccessPath(),srcChart);
+			//temp=DiagramSimilarDetecter.calcSimilary(basePath+std.getAccessPath(),srcChart);
+			temp=SSIMExample.calcSimilary(basePath+std.getAccessPath(),srcChart);
 			logger.info("与模板功图【{}】,相似度{}",std.getConclusion(), temp);
-			if(temp<minVal) {
-				minVO=std;
-				minVal=temp;
+			if(temp > maxVal) {
+				similarVO=std;
+				maxVal=temp;
 			}
 			
 		}
 		
 		//FileUtils.deleteQuietly(FileUtils.getFile(srcChart));
 		
-		return RespVOBuilder.ok(minVO);
+		return RespVOBuilder.ok(similarVO);
 	}
 	
 	/**

+ 23 - 4
src/main/java/com/hb/proj/analysis/service/DiagramFeatureDetecter.java

@@ -1,5 +1,6 @@
 package com.hb.proj.analysis.service;
 
+import java.util.Collections;
 import java.util.List;
 
 import com.hb.proj.model.DiagramFeature;
@@ -35,6 +36,7 @@ public class DiagramFeatureDetecter {
 		List<Double>  dwnOth=diagram.getOths().subList(diagram.getTurnIndex(), size);
 		
 		
+		
 		//上冲程增载结束点
 		int addloadEnd=DiagramDetectUtils.indexOfEG(feature.getTheoryMax(),upOth);
 		
@@ -63,17 +65,34 @@ public class DiagramFeatureDetecter {
 		//下冲程位移序列
 		List<Double>  dwnDisp=diagram.getDisps().subList(diagram.getTurnIndex(), size);
 		
+		//上冲程采集值序列
+		List<Double> upOth=diagram.getOths().subList(0,diagram.getTurnIndex());
+		
 		//下冲程采集值序列
 		List<Double>  dwnOth=diagram.getOths().subList(diagram.getTurnIndex(), size);
 		
-		//上冲程采集值序列
-		List<Double> upOth=diagram.getOths().subList(0,diagram.getTurnIndex());
+		
+		int up1_3Idx=(int)Math.floor(diagram.getTurnIndex()/3);
+		int up2_3Idx=up1_3Idx*2;
+		
+		List<Double> upmidOths=diagram.getOths().subList(up1_3Idx,up2_3Idx);
+		double upmidAvg=DiagramDetectUtils.avg(upmidOths);
+		double upmidMax=Collections.max(upmidOths);
+		double upmidMin=Collections.min(upmidOths);
+		
+		int dwn1_3Idx=(int)Math.floor((diagram.getOths().size()-diagram.getTurnIndex())/3);
+		int dwn2_3Idx=dwn1_3Idx*2;
+		
+		List<Double> dwnmidOths=dwnOth.subList(dwn1_3Idx,dwn2_3Idx);
+		double dwnmidAvg=DiagramDetectUtils.avg(dwnmidOths);
+		double dwnmidMax=Collections.max(dwnmidOths);
+		double dwnmidMin=Collections.min(dwnmidOths);
 		
 		//上冲程增载结束点
-		int addloadEnd=DiagramDetectUtils.indexOfEG(diagramFea.getTheoryMax(),upOth);
+		int addloadEnd=DiagramDetectUtils.indexOfEG(upmidAvg,upOth);
 		
 		//上冲程后段有急剧卸载时
-		int upUnloadEnd=DiagramDetectUtils.indexOfEL(diagramFea.getTheoryMin(),diagram.getOths().subList(addloadEnd,diagram.getTurnIndex()));
+		int upUnloadEnd=DiagramDetectUtils.indexOfEL(dwnmidAvg,diagram.getOths().subList(addloadEnd,diagram.getTurnIndex()));
 		
 		if(upUnloadEnd>=0) {
 			return "管式泵活塞脱出";

+ 20 - 0
src/main/java/com/hb/proj/diagram/diagnose/DiagramSimilarDetecter.java

@@ -7,6 +7,7 @@ import org.opencv.core.Scalar;
 import org.opencv.imgcodecs.Imgcodecs;
 import org.opencv.imgproc.Imgproc;
 
+@Deprecated
 public class DiagramSimilarDetecter {
 
 	// 调用OpenCV库文件
@@ -14,6 +15,25 @@ public class DiagramSimilarDetecter {
         System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
     }
     
+    
+    public static double calcSSIM(Mat image1, Mat image2) {
+    	Mat image1Gray = new Mat();
+        Mat image2Gray = new Mat();
+        Imgproc.cvtColor(image1, image1Gray, Imgproc.COLOR_BGR2GRAY);
+        Imgproc.cvtColor(image2, image2Gray, Imgproc.COLOR_BGR2GRAY);
+        Imgproc.resize(image1Gray, image1Gray, image2Gray.size());
+        
+       
+        
+        Mat ssim_map = new Mat();
+
+       // Imgproc.cvtColor(image1Gray, image2Gray, ssim_map, Imgproc.CV_32F);
+
+        double ssim = Core.mean(ssim_map).val[0];
+        
+    	return ssim;
+    }
+    
     public static double calcViaMSE(Mat image1, Mat image2) {
     	Mat image1Gray = new Mat();
         Mat image2Gray = new Mat();

+ 9 - 0
src/main/java/com/hb/proj/model/MultiDataVO.java

@@ -52,4 +52,13 @@ public class MultiDataVO {
 	 */
 	private Integer turnIndex;
 	
+	/**
+	 * 上冲程最大
+	 */
+	private Double upstrokeMax;
+	
+	/**
+	 * 下冲程最大
+	 */
+	private Double downstrokeMax;
 }