From 733500850e81be2a7cd8ed9207981035607f384f Mon Sep 17 00:00:00 2001
From: 820689062 <820689062@qq.com>
Date: Thu, 27 Jun 2024 18:09:39 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86=E5=8D=B7=E7=A7=AF?=
=?UTF-8?q?=E5=8C=B9=E9=85=8D=EF=BC=88=E5=8F=AF=E4=BB=A5=E8=AF=95=E4=B8=80?=
=?UTF-8?q?=E8=AF=95=EF=BC=8C=E4=B8=8D=E4=B8=80=E5=AE=9A=E5=A5=BD=E7=94=A8?=
=?UTF-8?q?=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
HisenceYoloDetection/CheckDiffSciHelper.cs | 115 ++++++---------------
1 file changed, 31 insertions(+), 84 deletions(-)
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))