日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

【C#】OpenCvSharp實現PCB板拍照對比缺陷檢測詳解

admin
2025年3月1日 22:21 本文熱度 574

PCB板缺陷檢測是工業視覺檢測中的重要應用。本文將詳細介紹如何使用OpenCvSharp實現PCB板的缺陷檢測,包括缺陷、斷路、短路等問題的識別。

環境準備

// NuGet包引用
// Install-Package OpenCvSharp4
// Install-Package OpenCvSharp4.runtime.win
using OpenCvSharp;
using System;

完整代碼實現

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

namespace AppPcb
{
    publicclass PCBDefectDetection
    {

        private Mat templateImage; // 模板圖像
        private Mat testImage;     // 待測試圖像

        public PCBDefectDetection(string templatePath, string testPath)
        
{
            // 讀取圖像
            templateImage = Cv2.ImRead(templatePath, ImreadModes.Color);
            testImage = Cv2.ImRead(testPath, ImreadModes.Color);

            // 確保圖像加載成功
            if (templateImage.Empty() || testImage.Empty())
            {
                thrownew Exception("圖像加載失敗!");
            }
        }

        public void DetectDefects()
        
{
            // 1. 圖像預處理
            Mat templateGray = PreprocessImage(templateImage);
            Mat testGray = PreprocessImage(testImage);

            // 2. 圖像對齊
            Mat alignedTest = AlignImages(templateGray, testGray);

            // 3. 差異檢測
            Mat diffMask = DetectDifferences(templateGray, alignedTest);

            // 4. 缺陷分析
            AnalyzeDefects(diffMask);

            // 5. 顯示結果
            ShowResults(diffMask);
        }

        private Mat PreprocessImage(Mat input)
        
{
            Mat result = new Mat();

            // 轉換為灰度圖
            Cv2.CvtColor(input, result, ColorConversionCodes.BGR2GRAY);

            // 高斯模糊去噪
            Cv2.GaussianBlur(result, result, new Size(77), 0);

            // 自適應二值化
            Cv2.AdaptiveThreshold(
                result,
                result,
                255,
                AdaptiveThresholdTypes.GaussianC,
                ThresholdTypes.Binary,
                13,
                2
            );

            return result;
        }

        private Mat AlignImages(Mat template, Mat test)
        
{
            // 特征點檢測和匹配
            var orb = ORB.Create();

            // 檢測關鍵點和描述符
            KeyPoint[] templateKeyPoints, testKeyPoints;
            Mat templateDescriptors = new Mat();
            Mat testDescriptors = new Mat();

            orb.DetectAndCompute(
                template,
                null,
                out templateKeyPoints,
                templateDescriptors
            );

            orb.DetectAndCompute(
                test,
                null,
                out testKeyPoints,
                testDescriptors
            );

            // 特征匹配
            var matcher = new BFMatcher(NormTypes.Hamming, crossCheck: true);
            DMatch[] matches = matcher.Match(templateDescriptors, testDescriptors);

            // 提取匹配點對
            Point2f[] templatePoints = matches.Select(m => templateKeyPoints[m.QueryIdx].Pt).ToArray();
            Point2f[] testPoints = matches.Select(m => testKeyPoints[m.TrainIdx].Pt).ToArray();

            // 計算變換矩陣
            Mat homography = Cv2.FindHomography(
                InputArray.Create(testPoints),
                InputArray.Create(templatePoints),
                HomographyMethods.Ransac
            );

            // 應用變換
            Mat alignedTest = new Mat();
            Cv2.WarpPerspective(
                test,
                alignedTest,
                homography,
                template.Size()
            );

            return alignedTest;
        }

        private Mat DetectDifferences(Mat template, Mat test)
        
{
            Mat diff = new Mat();
            Mat diffMask = new Mat();

            // 計算差異
            Cv2.Absdiff(template, test, diff);

            // 二值化差異圖
            Cv2.Threshold(
                diff,
                diffMask,
                30,
                255,
                ThresholdTypes.Binary
            );

            // 形態學操作,去除噪點
            Mat kernel = Cv2.GetStructuringElement(
                MorphShapes.Rect,
                new Size(33)
            );

            Cv2.MorphologyEx(
                diffMask,
                diffMask,
                MorphTypes.Open,
                kernel,
                iterations: 2
            );

            return diffMask;
        }

        private void AnalyzeDefects(Mat diffMask)
        
{
            // 查找輪廓
            Point[][] contours;
            HierarchyIndex[] hierarchy;

            Cv2.FindContours(
                diffMask,
                out contours,
                out hierarchy,
                RetrievalModes.External,
                ContourApproximationModes.ApproxSimple
            );

            // 分析每個缺陷區域
            foreach (var contour in contours)
            {
                // 計算缺陷面積
                double area = Cv2.ContourArea(contour);

                // 獲取缺陷邊界框
                Rect boundingRect = Cv2.BoundingRect(contour);

                // 判斷缺陷類型
                if (area >= 20// 面積閾值可調整
                {
                    Console.WriteLine($"發現缺陷:");
                    Console.WriteLine($"位置: X={boundingRect.X}, Y={boundingRect.Y}");
                    Console.WriteLine($"大小: {area:F2}平方像素");

                    // 在原圖上標記缺陷
                    Cv2.Rectangle(
                        testImage,
                        boundingRect,
                        Scalar.Red,
                        2
                    );

                    Cv2.PutText(
                        testImage,
                        $"Defect: {area:F0}px",
                        new Point(boundingRect.X, boundingRect.Y - 5),
                        HersheyFonts.HersheySimplex,
                        0.5,
                        Scalar.Red,
                        1
                    );
                }
            }
        }

        private void ShowResults(Mat diffMask)
        
{
            // 顯示結果
            using (new Window("Template", templateImage))
            using (new Window("Test Image", testImage))
            using (new Window("Differences", diffMask))
            {
                Cv2.WaitKey();
            }
        }
    }

}

?

代碼詳解

圖像預處理

高斯模糊(Gaussian Blur)

Cv2.GaussianBlur(result, result, new Size(77), 0);
  • result
    : 輸入圖像,經過模糊處理的輸出圖像(可覆蓋)。
  • new Size(7, 7)
    : 高斯核的大小,必須是正奇數(例如:3, 5, 7 等)。越大則模糊效果越明顯。
  • 0
    : 標準差 σ。在 X 和 Y 方向上的標準差。如果設為0,函數會根據核大小自動計算。

自適應二值化(Adaptive Thresholding)

Cv2.AdaptiveThreshold(
    result,
    result,
    255,
    AdaptiveThresholdTypes.GaussianC,
    ThresholdTypes.Binary,
    13,
    2
);
  • result
    : 輸入圖像,經過二值化處理的輸出圖像(可覆蓋)。
  • 255
    : 閾值的最大值。當像素值超過該值時,將其賦為最大值。
  • AdaptiveThresholdTypes.GaussianC
    : 自適應閾值的計算方法,這里使用“Gaussian”方法來計算局部閾值。
  • ThresholdTypes.Binary
    : 閾值類型。在這里使用的是簡單的二值化(黑和白)。
  • 13
    : 領域大小,即考慮的鄰域像素的尺寸(必須為奇數)。
  • 2
    : 從每個計算得到的閾值中減去的常量C,用于調整二值化效果。

圖像對齊

使用ORB特征檢測和匹配實現圖像對齊:

  1. 檢測特征點和描述符
  2. 特征點匹配
  3. 計算單應性矩陣
  4. 透視變換實現圖像對齊

差異檢測

二值化差異圖(Thresholding)

Cv2.Threshold(
    diff,
    diffMask,
    30,
    255,
    ThresholdTypes.Binary
);
  • diff
    : 輸入圖像,通常是差異圖(例如兩張圖像之間的差異)。
  • diffMask
    : 輸出圖像,即二值化處理后的結果。
  • 30
    : 閾值。像素值高于此值將被賦值為最大值(255),低于此值將被賦值為0。
  • 255
    : 閾值的最大值。當像素值超過30時,輸出結果將設為255。
  • ThresholdTypes.Binary
    : 閾值類型。在這里使用的是簡單的二值化,結果只有兩種值(0和255)。

形態學操作(Morphological Operations)

Mat kernel = Cv2.GetStructuringElement(
    MorphShapes.Rect,
    new Size(33)
);
  • Cv2.GetStructuringElement
    : 用于創建結構元素,用于形態學處理。
  • MorphShapes.Rect
    : 指定結構元素的形狀為矩形(也可使用其他形狀,如橢圓或十字形)。
  • new Size(3, 3)
    : 結構元素的大小,這里為3x3像素。
Cv2.MorphologyEx(
    diffMask,
    diffMask,
    MorphTypes.Open,
    kernel,
    iterations: 2
);
  • diffMask
    : 輸入圖像,通常是經過二值化處理的圖像。
  • diffMask
    : 輸出圖像,表示形態學處理后的結果(可覆蓋)。
  • MorphTypes.Open
    : 形態學運算類型為開運算(去除小物體的噪點)。
  • kernel
    : 用于形態學操作的結構元素。
  • iterations: 2
    : 操作的迭代次數。設置為2意味著將在圖像上執行兩次開運算。

缺陷分析

分析檢測到的缺陷:

  1. 輪廓檢測
  2. 計算缺陷面積
  3. 獲取缺陷位置
  4. 在原圖上標記缺陷位置

總結

本文詳細介紹了使用OpenCvSharp實現PCB板缺陷檢測的完整流程。該方法具有以下特點:

  • 自動化程度高
  • 檢測精度可靠
  • 代碼可擴展性強
  • 實現相對簡單

通過調整參數和優化算法,可以根據具體應用場景提高檢測效果。


閱讀原文:原文鏈接


該文章在 2025/3/3 16:00:11 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产香线 | 午夜国产一区二区三区在线观看 | 国产一区二区三区正品 | 在线观看国产一区二区三区 | 国产精选在线视频 | 国产日产欧产精品精品app | 免费黃色三級片在线观看18 | 黑人巨大精品欧美视频一区 | 网友自拍视频一区二区三区 | 国产免费v片在线观看完整版 | 成人动漫在线播放一区二区 | 丝袜国产精品亚洲 | 国产精品色一区二区三区 | 果冻文化传媒官网 | 末发育娇小性色xxxx | 亚洲国产福利一区二区三区 | 国产专区一区在线观看 | 天堂在线视频网站 | 国产精品日韩专区第一页 | 国产在线精品国自产拍影院 | 亚洲综合精品一区二区三区 | 亚洲v高清免费在线观看 | 亚洲人成在线 | 宅男色影视亚洲人在线 | 国产精品欧美一区二区三区不 | 成人欧美一区二区三区黑人免费 | 狠狠做深爱 | 亚洲无人区码卡二卡三卡四卡 | 最好看的中文字幕国语电影 | 国产性夜夜春夜夜爽30 | 尤物国产在线 | 中文字幕亚洲无线码一区女同 | 日本黄在线观 | 欧美日韩高清一区二区三区 | 欧美黑人又大又粗xxxⅹ | 视频一区在线免费观看 | 亚洲视频一区二区 | 天堂mv亚洲mv在线播放9蜜 | 日本最新伦中文字幕 | 熟女一区二区 | 精品亚洲国产 |