精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# 使用OpenCvSharp實現模板差異檢測

開發 前端
本文詳細介紹了使用OpenCvSharp實現模板差異檢測的完整方案。通過合適的圖像處理和計算機視覺技術,可以有效地檢測出兩張圖像之間的差異。

本文將詳細介紹如何使用OpenCvSharp來實現模板圖像與待檢測圖像之間的差異檢測。這種技術常用于產品質量檢測、PCB板檢測等場景。上面的示意圖展示了一個簡單的例子,左邊是完整的模板圖像,右邊是缺少部分元件的待檢測圖像。

環境準備

// 需要安裝的NuGet包
// Install-Package OpenCvSharp4
// Install-Package OpenCvSharp4.runtime.win

using OpenCvSharp;
using System;
using System.Collections.Generic;

完整代碼實現

using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OpenCv082902
{
    public class TemplateDifferenceDetector
    {
        /// <summary>  
        /// 檢測結果類  
        /// </summary>  
        public class DetectionResult
        {
            public Point Location { get; set; }
            public double Difference { get; set; }
            public Rect Region { get; set; }
        }

        /// <summary>  
        /// PCB圖像差異檢測的配置參數  
        /// </summary>  
        public class DetectionConfig
        {
            public double Threshold { get; set; } = 0.5;          // 差異閾值  
            public double MinArea { get; set; } = 10;            // 最小檢測面積  
            public int BlurSize { get; set; } = 3;               // 高斯模糊核大小  
            public int MorphSize { get; set; } = 3;              // 形態學操作核大小  
            public bool EnableHistEqualization { get; set; } = true;  // 是否啟用直方圖均衡化  
            public bool EnableNoiseReduction { get; set; } = true;    // 是否啟用降噪  
        }

        /// <summary>  
        /// 執行差異檢測  
        /// </summary>  
        /// <param name="templatePath">模板圖像路徑</param>  
        /// <param name="targetPath">待檢測圖像路徑</param>  
        /// <param name="config">檢測配置參數</param>  
        /// <returns>檢測結果列表</returns>  
        public static List<DetectionResult> DetectDifferences(
            string templatePath,
            string targetPath,
            DetectionConfig config = null)
        {
            config ??= new DetectionConfig();

            // 讀取圖像  
            using var template = Cv2.ImRead(templatePath);
            using var target = Cv2.ImRead(targetPath);

            // 確保圖像成功加載  
            if (template.Empty() || target.Empty())
            {
                throw new Exception("無法加載圖像");
            }

            // 預處理圖像  
            using var processedTemplate = PreprocessImage(template, config);
            using var processedTarget = PreprocessImage(target, config);

            // 計算差異圖  
            using var diff = new Mat();
            Cv2.Absdiff(processedTemplate, processedTarget, diff);

            // 應用閾值處理  
            using var thresholdMat = new Mat();
            Cv2.Threshold(diff, thresholdMat, config.Threshold * 255, 255, ThresholdTypes.Binary);

            // 應用形態學操作來減少噪聲  
            if (config.EnableNoiseReduction)
            {
                var kernel = Cv2.GetStructuringElement(
                    MorphShapes.Rect,
                    new Size(config.MorphSize, config.MorphSize)
                );

                Cv2.MorphologyEx(
                    thresholdMat,
                    thresholdMat,
                    MorphTypes.Open,
                    kernel
                );
            }

            // 尋找輪廓  
            Cv2.FindContours(
                thresholdMat,
                out Point[][] contours,
                out HierarchyIndex[] hierarchy,
                RetrievalModes.External,
                ContourApproximationModes.ApproxSimple
            );

            // 分析差異區域  
            var results = new List<DetectionResult>();
            foreach (var contour in contours)
            {
                // 計算輪廓面積,過濾掉太小的區域  
                double area = Cv2.ContourArea(contour);
                if (area < config.MinArea)
                    continue;

                // 獲取邊界矩形  
                var boundingRect = Cv2.BoundingRect(contour);

                // 計算該區域的平均差異值  
                using var roi = new Mat(diff, boundingRect);
                Scalar meanDiff = Cv2.Mean(roi);

                results.Add(new DetectionResult
                {
                    Location = new Point(boundingRect.X, boundingRect.Y),
                    Difference = meanDiff.Val0 / 255.0, // 歸一化差異值  
                    Region = boundingRect
                });
            }

            return results;
        }

        /// <summary>  
        /// 圖像預處理  
        /// </summary>  
        private static Mat PreprocessImage(Mat input, DetectionConfig config)
        {
            // 轉換為灰度圖  
            var processed = input.CvtColor(ColorConversionCodes.BGR2GRAY);

            // 應用高斯模糊減少噪聲  
            if (config.EnableNoiseReduction)
            {
                Cv2.GaussianBlur(
                    processed,
                    processed,
                    new Size(config.BlurSize, config.BlurSize),
                    0
                );
            }

            // 直方圖均衡化增強對比度  
            if (config.EnableHistEqualization)
            {
                Cv2.EqualizeHist(processed, processed);
            }

            return processed;
        }

        /// <summary>  
        /// 可視化檢測結果  
        /// </summary>  
        public static void VisualizeResults(
            string templatePath,
            string targetPath,
            string outputPath,
            List<DetectionResult> results)
        {
            using var target = Cv2.ImRead(targetPath);
            using var output = target.Clone();

            // 在圖像上標注差異區域  
            foreach (var result in results)
            {
                // 繪制矩形框  
                Cv2.Rectangle(
                    output,
                    result.Region,
                    new Scalar(0, 0, 255), // 紅色  
                    2
                );

                // 添加差異值標注  
                string text = $"Diff: {result.Difference:F2}";
                Cv2.PutText(
                    output,
                    text,
                    new Point(result.Location.X, result.Location.Y - 5),
                    HersheyFonts.HersheySimplex,
                    0.5,
                    new Scalar(0, 0, 255),
                    1
                );
            }

            // 創建對比圖  
            using var comparison = new Mat();
            using var targetResized = target.Resize(new Size(target.Width / 2, target.Height));
            using var outputResized = output.Resize(new Size(output.Width / 2, output.Height));
            Cv2.HConcat(new[] { targetResized, outputResized }, comparison);

            // 添加標題  
            Cv2.PutText(
                comparison,
                "Original",
                new Point(target.Width / 4 - 40, 30),
                HersheyFonts.HersheySimplex,
                1,
                new Scalar(0, 255, 0),
                2
            );

            Cv2.PutText(
                comparison,
                "Detected Differences",
                new Point(target.Width * 3 / 4 - 100, 30),
                HersheyFonts.HersheySimplex,
                1,
                new Scalar(0, 255, 0),
                2
            );

            // 保存結果圖像  
            comparison.SaveImage(outputPath);

        }

        /// <summary>  
        /// 使用示例  
        /// </summary>  
        public static void Example()
        {
            var config = new DetectionConfig
            {
                Threshold = 0.3,             // 降低閾值使檢測更敏感  
                MinArea = 5,                 // 降低最小面積閾值  
                BlurSize = 3,                // 適當的模糊核大小  
                MorphSize = 2,               // 較小的形態學操作核心  
                EnableHistEqualization = true,
                EnableNoiseReduction = true
            };

            var results = DetectDifferences(
                "template.jpg",
                "target.jpg",
                config
            );

            VisualizeResults(
                "template.jpg",
                "target.jpg",
                "output.jpg",
                results
            );

            Console.WriteLine($"Found {results.Count} differences");
            foreach (var result in results)
            {
                Console.WriteLine($"Difference at ({result.Location.X}, {result.Location.Y}) " +
                                $"with difference value: {result.Difference:F2}");
            }
        }
    }
}

使用示例

using OpenCv082902;
using OpenCvSharp;
using System;
using System.Collections.Generic;

class Program
{

    static void Main(string[] args)
    {
        // 使用自定義配置  
        var config = new TemplateDifferenceDetector.DetectionConfig
        {
            Threshold = 0.3,
            MinArea = 5,
            BlurSize = 3,
            MorphSize = 2,
            EnableHistEqualization = true,
            EnableNoiseReduction = true
        };

        var results = TemplateDifferenceDetector.DetectDifferences("pcb_layout.png", "pcb_layout1.jpg", config);

        // 可視化結果  
        TemplateDifferenceDetector.VisualizeResults("pcb_layout.png", "pcb_layout1.jpg", "output.jpg", results);

        Console.ReadKey();
    }

}

圖片圖片

檢測失敗的可能原因:

  1. 圖像對齊問題 - 兩張圖像可能有微小的偏移或旋轉
  2. 閾值設置過高 - 導致小的差異被忽略
  3. 最小面積設置過大 - 導致小的差異區域被過濾
  4. 圖像質量問題 - 如噪聲、模糊等影響檢測效果

總結

本文詳細介紹了使用OpenCvSharp實現模板差異檢測的完整方案。通過合適的圖像處理和計算機視覺技術,可以有效地檢測出兩張圖像之間的差異。代碼實現了基本功能,并提供了良好的擴展性。在實際應用中,可以根據具體需求調整參數和添加其他功能。

責任編輯:武曉燕 來源: 技術老小子
相關推薦

2009-08-14 15:02:24

Service模板C#創建

2009-03-12 13:49:30

DataTemplatWPFC#

2009-08-21 10:28:21

C#異步方法C#同步方法

2009-08-31 15:55:17

C#實現Strateg

2009-08-19 17:00:07

C#實現PrintPa

2009-08-20 14:22:17

C#實現 Contro

2009-08-25 17:55:52

C#實現Strateg

2009-09-01 09:16:57

C#使用SharpZi

2009-08-20 13:23:28

C#使用Crystal

2009-08-19 14:26:58

C# JavaScri

2009-08-18 17:29:02

C#使用指針

2009-08-31 16:12:02

C#使用Singlet

2009-08-14 15:23:10

C#使用ErrorPr

2009-08-25 16:49:44

C#使用if語句

2025-04-03 07:08:05

2009-06-18 13:06:59

C#位運算權限管理

2009-08-31 17:35:19

C#使用GDI+實現餅

2009-07-15 18:25:52

ASP.NET控件數組

2009-03-27 10:10:13

c#遠程啟動遠程管理

2009-09-01 18:29:10

C#繼承C#多態
點贊
收藏

51CTO技術棧公眾號

日本在线观看免费| 中文字幕乱码无码人妻系列蜜桃| 2021年精品国产福利在线| 亚洲成人免费观看| 日韩欧美精品一区二区三区经典 | 日韩欧美国产黄色| 椎名由奈jux491在线播放| 亚洲精品无amm毛片| 久久福利一区| 欧美成人一二三| 成人片黄网站色大片免费毛片| 欧美性aaa| 精品久久久久久中文字幕大豆网| 色噜噜一区二区| 高h震动喷水双性1v1| 日韩二区三区四区| 久久久久久久网站| 日本高清黄色片| 欧美韩一区二区| 日韩一区二区三区三四区视频在线观看 | 一区二区三区欧美视频| 日本一区二区三不卡| 亚洲精品久久久久久久久久 | 欧美日韩在线免费视频| 欧美极品少妇无套实战| 91sp网站在线观看入口| caoporn国产精品| 91精品免费久久久久久久久| 国产精品久久久久久久妇| 天天射成人网| 国产亚洲精品久久久| 国产在线不卡av| www.久久爱.com| 在线观看日韩毛片| 免费国产黄色网址| 色呦呦在线观看视频| 国产精品电影一区二区| 蜜桃精品久久久久久久免费影院| 国产模特av私拍大尺度| 久久香蕉精品| 91精品国产91久久久久福利| 欧美激情图片小说| 99久久精品网| 在线成人一区二区| 性少妇bbw张开| 四虎5151久久欧美毛片| 337p日本欧洲亚洲大胆精品| 亚洲欧洲日韩综合| 一区二区视频| 日韩欧美高清一区| 激情成人在线观看| 成人黄色91| 欧美疯狂做受xxxx富婆| 超碰在线人人爱| 欧美第一视频| 色婷婷狠狠综合| 欧美xxxxx在线视频| 高清不卡亚洲| 欧美在线|欧美| 欧美亚洲日本在线观看| 超碰这里只有精品| 欧美日韩在线免费视频| 色综合色综合色综合色综合| 欧美天堂在线| 欧美精品乱码久久久久久按摩| 亚洲 中文字幕 日韩 无码| 69久成人做爰电影| 在线精品视频一区二区三四| 三级在线免费看| 成人激情视屏| 这里只有精品99re| 免费看91视频| 久久久久97| 日韩大片在线观看视频| 成年人网站免费在线观看| 国产精品亚洲片在线播放| 亚洲丝袜av一区| 久久久国产一级片| 亚洲欧美网站在线观看| 欧美激情videoshd| 国产成人在线免费观看视频| 日韩av一级片| 国产福利不卡视频| 精品一区二区亚洲| 一区二区视频观看| 精品国产91| 久久视频在线播放| 日本熟妇毛茸茸丰满| 先锋影音久久久| 国产一区视频在线播放| 亚洲精品字幕在线| 久久久国产精华| 国产精品一区在线免费观看| sm性调教片在线观看| 欧美伊人精品成人久久综合97 | 成人开心激情| 欧美高清视频www夜色资源网| 在线xxxxx| 人人狠狠综合久久亚洲婷婷 | 日韩pacopacomama| 欧美男同性恋视频网站| xxxxxx黄色| 香蕉视频国产精品| 欧美亚洲日本网站| 99热这里只有精品9| 久久久久久99久久久精品网站| 久久久一二三四| 亚洲精品88| 日韩欧美国产成人一区二区| 国产三级黄色片| 在线综合欧美| av一区二区三区在线观看| 免费福利在线视频| 亚洲图片一区二区| 国产女同无遮挡互慰高潮91| 亚洲精品小区久久久久久| 免费成人高清视频| 亚洲视频在线免费播放| 久久午夜老司机| 精品丰满人妻无套内射| 成人在线视频www| 亚洲欧美日韩爽爽影院| 三级在线观看免费大全| 日韩视频二区| 99一区二区| 麻豆视频在线观看免费| 色婷婷综合久久久中文字幕| 亚洲一区二区三区四区av| 亚洲精品小说| 国产精自产拍久久久久久蜜| 天堂网av2014| 亚洲综合区在线| 丰满人妻一区二区三区53视频| 日韩欧美1区| 国产精品xxxxx| 欧美婷婷久久五月精品三区| 天天影视色香欲综合网老头| 色哟哟无码精品一区二区三区| 91精品国产自产在线观看永久∴| 国产精品人成电影在线观看| 国产黄色在线播放| 欧美午夜精品久久久久久超碰 | 欧美性xxxxxxxxx| 亚洲啪av永久无码精品放毛片 | 国产精品久久久久婷婷二区次| 在线免费视频a| 精品一二三区| 国产精品久久久av| 高清日韩av电影| 欧美色综合久久| 成人在线观看免费高清| 性欧美videos另类喷潮| 国产伦精品一区二区三区视频黑人| 久久青青色综合| 亚洲第一区在线| 成年人免费看毛片| 久久人人超碰精品| 亚洲一区二区三区四区五区xx| 精品国产乱码久久久| 国产欧美日韩91| caopen在线视频| 欧美成人精品1314www| 国产无遮挡又黄又爽又色| 成人自拍视频在线观看| 国产3p露脸普通话对白| 蜜桃视频欧美| 国产免费一区视频观看免费| 日本高清视频在线播放| 欧美一卡二卡三卡| 国产精品变态另类虐交| 久久久综合精品| www.亚洲高清| 激情久久综合| 日本精品一区二区| 成人动漫视频在线观看| 97热精品视频官网| 东凛在线观看| 日韩欧美国产成人一区二区| 国产精品自拍99| 国产精品久久久久久亚洲毛片 | 涩涩屋成人免费视频软件| 97色伦亚洲国产| jizz在线观看中文| 欧美一级欧美一级在线播放| 在线观看免费国产视频| 国产精品久久777777| 91超薄肉色丝袜交足高跟凉鞋| 亚洲尤物精选| 国产91av视频在线观看| 久久精品亚洲成在人线av网址| 国产精品扒开腿做爽爽爽视频| a免费在线观看| 亚洲美女久久久| 国产高清第一页| 在线观看亚洲专区| 男人天堂中文字幕| 国产精品美女一区二区| 亚洲自拍偷拍精品| 久久精品99国产精品日本| 国产精品久久久久久久乖乖| 成人av二区| 久久99精品久久久久久秒播放器| 久久69成人| 91成人精品网站| 污片视频在线免费观看| 伊人久久男人天堂| 天天操天天干天天干| 在线播放中文一区| 无码视频在线观看| 亚洲福利国产精品| 久草视频手机在线| 日本一区二区三区dvd视频在线| 少妇精品无码一区二区| 老司机精品视频一区二区三区| av免费观看网| 韩日在线一区| 法国空姐在线观看免费| 日韩精品影视| 日本亚洲自拍| 免费av一区| 国产综合av一区二区三区| 欧美精品三级在线| 成人免费淫片视频软件| 你懂得影院夜精品a| 69精品小视频| 国内小视频在线看| 超碰日本道色综合久久综合| 91在线网址| 伊人亚洲福利一区二区三区| 欧美日韩在线精品一区二区三区激情综| 精品国一区二区三区| 国产欧美日韩成人| 在线观看91av| 中文字幕制服诱惑| 欧美在线影院一区二区| 三级网站在线播放| 精品久久中文字幕| 国产69精品久久久久久久久久| 亚洲国产精品久久久久秋霞影院 | 国产高潮国产高潮久久久91 | 国产精品16p| 亚洲精品中文在线影院| 国产美女福利视频| 亚洲图片激情小说| 国产一区二区视频在线观看免费| 亚洲天堂精品在线观看| 亚洲波多野结衣| 亚洲天堂福利av| 久久久久久久久久网站| 亚洲黄色免费网站| 久久9999久久免费精品国产| 亚洲国产精品天堂| 激情五月色婷婷| 黑人巨大精品欧美一区二区三区| 亚洲 欧美 日韩 综合| 欧美视频一区二区三区…| 国产寡妇亲子伦一区二区三区四区| 日韩欧美在线视频日韩欧美在线视频| 久久国产视频一区| 日本韩国精品在线| 一本色道久久综合精品婷婷| 91精品国产综合久久精品麻豆 | 9色porny| 亚洲资源av| 亚州精品一二三区| 国产一区二区三区在线观看免费视频 | 400部精品国偷自产在线观看| 一区二区在线影院| 成人午夜精品久久久久久久蜜臀| 国产日本精品| 无限资源日本好片| 国产麻豆一精品一av一免费| 中文字幕三级电影| 国产日产欧产精品推荐色| 北条麻妃在线观看视频| 亚洲午夜在线观看视频在线| 中文字幕第四页| 欧美日韩国产大片| 免费av一级片| 在线观看日韩专区| 调教一区二区| 日韩免费观看av| 精品欧美视频| 噜噜噜噜噜久久久久久91| 欧美日韩在线观看视频小说| 九九久久九九久久| 天堂久久久久va久久久久| 中文字幕色网站| 99精品欧美一区| 国产免费一区二区三区四区| 五月天中文字幕一区二区| 一区二区乱子伦在线播放| 日韩精品一区在线| 国产在线黄色| 欧美国产一区二区三区| 日韩经典一区| 国产在线精品一区二区三区》| 日韩国产专区| 能在线观看的av| 国产成人在线视频网站| 人妻一区二区视频| 亚洲成人精品一区| 国产裸体永久免费无遮挡| 亚洲欧美国产日韩天堂区| 伊人精品影院| 成人国产精品av| 免费成人av| 可以看毛片的网址| 国产麻豆一精品一av一免费| 亚洲精品视频网址| 欧美午夜精品在线| 蜜桃91麻豆精品一二三区| 少妇高潮 亚洲精品| 热三久草你在线| 99re在线播放| 91精品国产自产在线观看永久∴ | 精品乱码一区二区三区四区| 美女主播视频一区| 亚洲第一网站| 亚洲成人福利视频| 亚洲欧洲成人自拍| 国产女优在线播放| 亚洲人成网站999久久久综合| av最新在线| 国产精品三区在线| 影音先锋久久资源网| 四虎国产精品免费| 亚洲蜜桃精久久久久久久| 一级片aaaa| 最新国产精品拍自在线播放| 向日葵视频成人app网址| 久久久久九九九| 国产精品日韩久久久| 国产一级免费片| 亚洲国产精品综合小说图片区| 精品国产亚洲一区二区麻豆| 久久精品2019中文字幕| 四虎视频在线精品免费网址| 亚洲高清视频在线观看| 日韩电影在线免费观看| xxxxx在线观看| 91国产精品成人| 春暖花开成人亚洲区| 国产精品福利片| 久久影视一区| 欧美性受xxxx黒人xyx性爽| 亚洲人成网站影音先锋播放| 国产三级按摩推拿按摩| www.亚洲男人天堂| 免费观看性欧美大片无片| 精品国产一区二区三区在线| 国产精品伊人色| 久久久久久天堂| 日韩精品中文字幕有码专区 | 欧美无砖专区一中文字| 中文字幕在线免费| 91日本在线观看| 欧美精品一区二区三区久久久竹菊| 乳色吐息在线观看| 亚洲成va人在线观看| 天天操天天干天天舔| 国产精品va在线| 亚洲二区三区不卡| 黄色在线免费播放| 一本在线高清不卡dvd| 幼a在线观看| 99在线高清视频在线播放| 亚洲在线观看| 中文字幕91视频| 亚洲第一色在线| 99精品国自产在线| 亚洲五码在线观看视频| 成人国产亚洲欧美成人综合网| 成人午夜视频在线播放| 中文字幕日韩欧美在线视频| 午夜电影一区| 精品视频一区二区在线| **网站欧美大片在线观看| 亚洲精品一级片| 国产va免费精品高清在线| 香蕉综合视频| 欧美大片免费播放器| 欧美色综合天天久久综合精品| 视频在线观看入口黄最新永久免费国产| 久久精品99| 国产乱码精品一品二品| 免费的毛片视频| 欧美成人午夜激情视频| 在线日韩网站| 无码国产精品久久一区免费| 欧洲国产伦久久久久久久| 欧美78videosex性欧美| 日本一区二区三区免费观看| 国产成人免费视频网站 | 国产精品国产三级国产传播| 亚洲成人精品视频| 欧美xxxx网站| 欧美网站免费观看| 亚洲日本在线天堂| 你懂的视频在线|