using AForge.Controls; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ShenTun.ImageCollection.AForgeCamera { public partial class FrmComparison : Form { private string selectedImagePath1; private string selectedImagePath2; public FrmComparison(string path1,string path2) { InitializeComponent(); selectedImagePath1 = path1; selectedImagePath2 = path2; } private void Set() { //加载两张图片 using (Mat image1 = Cv2.ImRead(selectedImagePath1)) { using (Mat image2 = Cv2.ImRead(selectedImagePath2)) { using (Mat result_image = image2.Clone()) { // 调整图像尺寸使其匹配 if (image1.Size() != image2.Size()) { Cv2.Resize(image1, image1, image2.Size()); }// 调整图像通道数使其匹配 if (image1.Channels() != image2.Channels()) { if (image1.Channels() == 1 && image2.Channels() == 3) { Cv2.CvtColor(image1, image1, ColorConversionCodes.GRAY2BGR); } else if (image1.Channels() == 3 && image2.Channels() == 1) { Cv2.CvtColor(image2, image2, ColorConversionCodes.GRAY2BGR); } } //创建一个空的Mat对象用于存储差异 using (Mat difference = new Mat()) { //计算两张图片的差异 Cv2.Absdiff(image1, image2, difference); //模糊 Cv2.Blur(difference, difference, new OpenCvSharp.Size(5, 5)); //转换为灰度图 Cv2.CvtColor(difference, difference, ColorConversionCodes.BGR2GRAY); //膨胀5次 using (Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(5, 5))) { Cv2.Dilate(difference, difference, kernel, null, 5); //二值化 Cv2.Threshold(difference, difference, 20, 200, ThresholdTypes.Binary); //找出轮廓 OpenCvSharp.Point[][] contours = null; HierarchyIndex[] hierarchly; Cv2.FindContours(difference, out contours, out hierarchly, RetrievalModes.External, ContourApproximationModes.ApproxNone, new OpenCvSharp.Point(0, 0)); Rect rect; for (int i = 0; i < contours.Length; i++) { rect = Cv2.BoundingRect(contours[i]); Cv2.Rectangle(result_image, rect, new Scalar(0, 255, 0), 2, LineTypes.Link8); } if (pictureBox.Image != null) pictureBox.Image.Dispose(); pictureBox.Image = new Bitmap(result_image.ToMemoryStream()); } } }; }; } } private void loadImage() { Image selectedImage = Image.FromFile(selectedImagePath1); if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); pictureBox1.Image = selectedImage; Image selectedImage1 = Image.FromFile(selectedImagePath2); if (pictureBox2.Image != null) pictureBox2.Image.Dispose(); pictureBox2.Image = selectedImage1; } private void FrmComparison_Load(object sender, EventArgs e) { try { loadImage(); } catch (Exception ex) { MessageBox.Show("打开图像比对失败:" + ex.Message); } } private void btnClose_Click(object sender, EventArgs e) { if (pictureBox1.Image != null) pictureBox1.Image.Dispose(); if (pictureBox2.Image != null) pictureBox2.Image.Dispose(); DialogResult = DialogResult.Cancel; } private void btnComp_Click(object sender, EventArgs e) { try { Set(); } catch (Exception ex) { MessageBox.Show("生成差异图失败:" + ex.Message); } } } }