一、安裝包
<PackageReference Include="OpenCvSharp4" Version="4.10.0.20241108" />
<PackageReference Include="OpenCvSharp4.runtime.win" Version="4.10.0.20241108" />
二、準備兩張圖片
三、編寫代碼
using OpenCvSharp;
using System;
using System.Diagnostics;
using System.IO;
using static OpenCvSharp.FileStorage;
using static System.Net.Mime.MediaTypeNames;namespace OpenCvSharpDemo
{internal class Program{static void Main(string[] args){Compare();}static void Compare(){var path1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images/A1.png");var path2 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Images/A2.png");// 讀取兩張圖片Mat image1 = Cv2.ImRead(path1, ImreadModes.Color);Mat image2 = new Mat();Cv2.Resize(Cv2.ImRead(path2, ImreadModes.Color), image2, new OpenCvSharp.Size(image1.Size().Width, image1.Size().Height));if (image1.Empty() || image2.Empty()){Console.WriteLine("無法正確讀取圖片,請檢查圖片路徑是否正確。");return;}// 確保兩張圖片尺寸一致,如果不一致可以進行調整(這里簡單示例假設尺寸相同)if (image1.Size() != image2.Size()){Console.WriteLine("兩張圖片尺寸不一致,請先處理為相同尺寸。");return;}// 計算兩張圖片像素差值(逐像素相減)Mat diff = new Mat();Cv2.Absdiff(image1, image2, diff);// 將差異圖像轉換為灰度圖(方便后續閾值處理等操作)Mat grayDiff = new Mat();Cv2.CvtColor(diff, grayDiff, ColorConversionCodes.BGR2GRAY);//膨脹3次var kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(5, 5));Cv2.Dilate(grayDiff, grayDiff, kernel, null, 3);// 應用閾值,將差異明顯的地方凸顯出來,這里閾值可以根據實際情況調整Mat thresholded = new Mat();Cv2.Threshold(grayDiff, thresholded, 30, 255, ThresholdTypes.Binary);// 查找輪廓,輪廓所在區域就是不同之處Point[][] contours;HierarchyIndex[] hierarchy;Cv2.FindContours(thresholded, out contours, out hierarchy, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);// 在原始圖片(這里選擇image1)上繪制出不同之處的輪廓(標記為紅色)for (int i = 0; i < contours.Length; i++){Cv2.DrawContours(image1, contours, i, new Scalar(0, 0, 255), 2);}// 顯示標記出不同之處的圖片Cv2.ImShow("Differences", image1);Cv2.WaitKey(0);Cv2.DestroyAllWindows();}}
}
運行: