diff --git a/HisenceYoloDetection/CheckDiffSciHelper.cs b/HisenceYoloDetection/CheckDiffSciHelper.cs index 3dc368f..40944c7 100644 --- a/HisenceYoloDetection/CheckDiffSciHelper.cs +++ b/HisenceYoloDetection/CheckDiffSciHelper.cs @@ -22,7 +22,7 @@ namespace HisenceYoloDetection /// 要对比的图像 /// 白板黑字为true /// 存储路径 - public static bool CheckDiffSci(string path1, Mat MatDet,Rect sqlrect,Rect detrect, bool IfWhiteWord, string saveDir) + public static bool CheckDiffSci(string path1, Mat MatDet, Rect sqlrect, Rect detrect, bool IfWhiteWord, string saveDir) { // 读取和处理第一张图片 Mat img1 = Cv2.ImRead(path1, ImreadModes.Color); @@ -31,35 +31,29 @@ namespace HisenceYoloDetection Console.WriteLine($"Error loading image {path1}"); return false; } - // Cv2.Resize(img1, img1, new Size(550, 270)); Mat gimg1 = new Mat(); Cv2.CvtColor(img1, gimg1, ColorConversionCodes.BGR2GRAY); Mat thr1 = new Mat(); - - if(IfWhiteWord) + + if (IfWhiteWord) { - Cv2.Threshold(gimg1, thr1, 0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu); + Cv2.Threshold(gimg1, thr1, 0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu); } else { Cv2.Threshold(gimg1, thr1, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu); } - - - // 读取和处理第二张图片 Mat img2 = MatDet.Clone(); if (img2.Empty()) { - // Console.WriteLine($"Error loading image {path2}"); return false; } - // Cv2.Resize(img2, img2, new Size(550, 270)); Mat gimg2 = new Mat(); Cv2.CvtColor(img2, gimg2, ColorConversionCodes.BGR2GRAY); Mat thr2 = new Mat(); - //Cv2.Threshold(gimg2, thr2, 0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu); + if (IfWhiteWord) { Cv2.Threshold(gimg2, thr2, 0, 255, ThresholdTypes.BinaryInv | ThresholdTypes.Otsu); @@ -68,77 +62,32 @@ namespace HisenceYoloDetection { Cv2.Threshold(gimg2, thr2, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu); } - // Cv2.Threshold(gimg2, thr2, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu); - - - //Rect area2 = new Rect(148,30,229,222); + // 裁剪和设置为黑色 sqlrect.Width += 20; detrect.Width += 20; Mat matCutblack1 = new Mat(thr1, sqlrect); - if (IfWhiteWord) - { - matCutblack1.SetTo(Scalar.Black); - } - else - { - matCutblack1.SetTo(Scalar.Black); - } + matCutblack1.SetTo(Scalar.Black); Mat matCutblack2 = new Mat(thr2, detrect); - if (IfWhiteWord) - { - matCutblack2.SetTo(Scalar.Black); - } - else - { - matCutblack2.SetTo(Scalar.Black); - } + matCutblack2.SetTo(Scalar.Black); + Cv2.Resize(thr1, thr1, new Size(550, 270)); Cv2.Resize(thr2, thr2, new Size(550, 270)); - DateTime dt= DateTime.Now; - string filename= dt.Year.ToString() + dt.Month.ToString() + dt.Day.ToString() + dt.Hour.ToString() + dt.Minute.ToString() + dt.Millisecond.ToString(); - string savePath4 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename+"_thr1.png"); - // 保存结果 - + DateTime dt = DateTime.Now; + string filename = dt.ToString("yyyyMMddHHmmssfff"); + + string savePath4 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename + "_thr1.png"); Cv2.ImWrite(savePath4, thr1); - string savePath3 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename+"_thr2.png"); - // 保存结果 - + string savePath3 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename + "_thr2.png"); Cv2.ImWrite(savePath3, thr2); - // 创建卷积核 - Mat filter1 = new Mat(15, 15, MatType.CV_32F, new Scalar(0)); - filter1.Row(7).SetTo(new Scalar(0.025)); - filter1.Col(7).SetTo(new Scalar(0.025)); - - // 应用卷积 + // 创建和应用卷积核 + Mat filter1 = new Mat(7, 7, MatType.CV_32F, new Scalar(0.025)); Mat final_result1 = new Mat(); - Cv2.Filter2D(thr1, final_result1, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - Cv2.Filter2D(final_result1, final_result1, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - Cv2.Filter2D(final_result1, final_result1, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - Mat final_result2 = new Mat(); - Cv2.Filter2D(thr2, final_result2, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - Cv2.Filter2D(final_result2, final_result2, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - Cv2.Filter2D(final_result2, final_result2, -1, filter1, anchor: new Point(-1, -1), 0, BorderTypes.Reflect); - //裁剪才行 - - - //string savePath2 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + "_final_result1.png"); - //// 保存结果 - ////string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path2) + "_diff.png"); - //Cv2.ImWrite(savePath2, final_result1); - //string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + "_final_result2.png"); - //// 保存结果 - ////string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path2) + "_diff.png"); - //Cv2.ImWrite(savePath, final_result2); - - - - - - + Cv2.Filter2D(thr1, final_result1, -1, filter1, new Point(-1, -1), 0, BorderTypes.Reflect); + Cv2.Filter2D(thr2, final_result2, -1, filter1, new Point(-1, -1), 0, BorderTypes.Reflect); // 计算图像差异 Mat devIMG = new Mat(); @@ -147,20 +96,21 @@ namespace HisenceYoloDetection Cv2.Subtract(final_result2, final_result1, devIMG_); // 对差异图像应用阈值 - Cv2.Threshold(devIMG, devIMG, 50, 255, ThresholdTypes.Binary); - Cv2.Threshold(devIMG_, devIMG_, 50, 255, ThresholdTypes.Binary); + double threshold = 20.0; // 调低阈值 + Cv2.Threshold(devIMG, devIMG, threshold, 255, ThresholdTypes.Binary); + Cv2.Threshold(devIMG_, devIMG_, threshold, 255, ThresholdTypes.Binary); // 结合差异 Mat sumIMG = new Mat(); Cv2.Add(devIMG, devIMG_, sumIMG); - // 应用形态学操作 + // 形态学操作 Mat kernelCL = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3)); Mat blackhatImg = new Mat(); - Cv2.Dilate(sumIMG, blackhatImg, kernelCL); + Cv2.Dilate(sumIMG, blackhatImg, kernelCL); // 使用膨胀操作 - // 处理轮廓和保存结果 - Point[][] contours = new Point[10000][]; + // 检测和绘制轮廓 + Point[][] contours; Cv2.FindContours(blackhatImg, out contours, out _, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple); bool isMatch = true; foreach (var contour in contours) @@ -168,28 +118,25 @@ namespace HisenceYoloDetection if (Cv2.ContourArea(contour) <= 100) { Cv2.DrawContours(blackhatImg, new Point[][] { contour }, -1, Scalar.Black, thickness: Cv2.FILLED); - // 框选轮廓 - } else { Rect boundingRect = Cv2.BoundingRect(contour); Cv2.Rectangle(img2, boundingRect, Scalar.Red, thickness: 2); - isMatch= false; + isMatch = false; } } - string savePath2 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename+"_Rect.png"); - // 保存结果 - //string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path2) + "_diff.png"); + // 保存最终结果 + string savePath2 = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename + "_Rect.png"); Cv2.ImWrite(savePath2, img2); - string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename+"_diff.png"); - // 保存结果 - //string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path2) + "_diff.png"); + string savePath = Path.Combine(saveDir, Path.GetFileNameWithoutExtension(path1) + filename + "_diff.png"); Cv2.ImWrite(savePath, blackhatImg); + return isMatch; } + public static Rect strChangeRect(string strrect) { if (!string.IsNullOrEmpty(strrect))