精品熟人妻一区二区三区四区不卡-精品爽黄69天堂a-精品水蜜桃久久久久久久-精品丝袜国产自在线拍-精品丝袜国产自在线拍a-精品丝袜国产自在线拍免费看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C# 使用OpenCVSharp進(jìn)行皮革表面劃痕檢測品檢管理

admin
2025年3月23日 23:18 本文熱度 508

皮革表面劃痕檢測是質(zhì)量控制中的重要環(huán)節(jié),利用計(jì)算機(jī)視覺技術(shù)能夠快速、精準(zhǔn)地識(shí)別皮革表面的缺陷。本文將詳細(xì)講解如何通過OpenCVSharp實(shí)現(xiàn)皮革劃痕的自動(dòng)檢測。

實(shí)現(xiàn)方案

環(huán)境準(zhǔn)備

首先,確保安裝以下NuGet包:

  • OpenCvSharp4
  • OpenCvSharp4.Windows

完整代碼實(shí)現(xiàn)

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

namespace AppScratchInspection
{
    publicclass LeatherScratchDetector
    {

        /// <summary>  
        /// 顯示圖像處理的每個(gè)階段  
        /// </summary>  
        /// <param name="imagePath">皮革圖像路徑</param>  
        public void DetectScratchWithVisualization(string imagePath)
        
{
            // 讀取原始圖像  
            Mat originalImage = Cv2.ImRead(imagePath, ImreadModes.Color);
            ShowImage("原始圖像", originalImage);

            // 圖像預(yù)處理:轉(zhuǎn)換為灰度圖  
            Mat grayImage = new Mat();
            Cv2.CvtColor(originalImage, grayImage, ColorConversionCodes.BGR2GRAY);
            ShowImage("灰度圖", grayImage);

            // 圖像去噪  
            Mat denoiseImage = new Mat();
            Cv2.GaussianBlur(grayImage, denoiseImage, new Size(33), 0);
            ShowImage("去噪圖像", denoiseImage);

            // 邊緣檢測(使用Canny算法)  
            Mat edges = new Mat();
            Cv2.Canny(denoiseImage, edges, 5090);
            ShowImage("邊緣檢測", edges);

            // 形態(tài)學(xué)操作:膨脹和腐蝕,突出劃痕特征  
            Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(1111));
            Mat dilatedEdges = new Mat();
            Cv2.Dilate(edges, dilatedEdges, kernel, iterations: 2);
            ShowImage("膨脹處理", dilatedEdges);

            // 查找輪廓  
            Point[][] contours;
            HierarchyIndex[] hierarchies;
            Cv2.FindContours(dilatedEdges, out contours, out hierarchies,
                RetrievalModes.External,
                ContourApproximationModes.ApproxSimple);

            // 過濾和分析輪廓(劃痕)  
            List<Point[]> scratches = new List<Point[]>();
            Mat contourImage = originalImage.Clone();

            foreach (var contour in contours)
            {
                double area = Cv2.ContourArea(contour);

                // 根據(jù)面積和形狀過濾可能的劃痕  
                if (area > 50)
                {
                    double perimeter = Cv2.ArcLength(contour, true);
                    double ratio = 4 * Math.PI * area / (perimeter * perimeter);

                    // 長條狀特征判斷  
                    if (ratio < 0.5)
                    {
                        scratches.Add(contour);

                        // 繪制每個(gè)檢測到的輪廓  
                        Cv2.DrawContours(contourImage, new Point[][] { contour }, -1,
                            Scalar.Red, 2);
                    }
                }
            }

            // 顯示最終結(jié)果  
            ShowImage("劃痕檢測結(jié)果", contourImage);

            // 輸出劃痕數(shù)量  
            Console.WriteLine($"檢測到 {scratches.Count} 個(gè)劃痕");
        }

        /// <summary>  
        /// 封裝圖像窗口顯示方法  
        /// </summary>  
        /// <param name="windowName">窗口名稱</param>  
        /// <param name="image">待顯示圖像</param>  
        private void ShowImage(string windowName, Mat image)
        
{
            // 調(diào)整圖像大小以適應(yīng)屏幕  
            Mat resizedImage = new Mat();
            Cv2.Resize(image, resizedImage, new Size(640480));

            // 顯示窗口  
            Cv2.ImShow(windowName, resizedImage);

            // 等待按鍵  
            Cv2.WaitKey(1000); // 每個(gè)窗口停留1秒  
        }
    }
}

調(diào)用

using OpenCvSharp;

namespace AppScratchInspection
{
    internal class Program
    {

        static void Main(string[] args)
        
{
            var detector = new LeatherScratchDetector();
            detector.DetectScratchWithVisualization("example.jpeg");

            // 保持最后一個(gè)窗口直到用戶關(guān)閉  
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

Cv2.Canny 函數(shù)參數(shù)

void Cv2.Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize = 3bool L2gradient = false);

參數(shù)說明

  1. image
     (Mat):
    • 輸入圖像,通常是經(jīng)過灰度處理和去噪的圖像。
  2. edges
     (Mat):
    • 輸出圖像,包含檢測到的邊緣。
  3. threshold1
     (double):
    • 第一個(gè)閾值,用于邊緣連接。值越低,檢測到的邊緣越多。這個(gè)值用于哈希圖像的梯度強(qiáng)度,低于該值的梯度被認(rèn)為是非邊緣強(qiáng)度。
  4. threshold2
     (double):
    • 第二個(gè)閾值,用于邊緣連接。值越高,邊緣檢測將更嚴(yán)格。只有當(dāng)梯度強(qiáng)度高于該值時(shí),才會(huì)被認(rèn)為是潛在邊緣。Canny算法通過兩個(gè)閾值來連接邊緣,低于 `threshold1` 的邊緣被丟棄,介于兩個(gè)閾值之間的邊緣需要與高于 `threshold2` 的邊緣連接才能成為有效邊緣。
  5. apertureSize
     (int, 可選):
    • Sobel算子的大小,用于計(jì)算圖像梯度。它可以取值為3、5或7,默認(rèn)為3。增大這個(gè)值可以提高邊緣檢測的平滑度,但可能會(huì)損失一些細(xì)節(jié)。
  6. L2gradient
     (bool, 可選):
    • 是否使用更精確的L2范數(shù)計(jì)算梯度的大小。如果為`true`,則使用L2范數(shù);如果為`false`(默認(rèn)),則使用L1范數(shù)。L2范數(shù)能提供更精確的邊緣。

示例

在您的代碼中,您使用的參數(shù)如下:

Cv2.Canny(denoiseImage, edges, 5090);
  • threshold1
    : 50
  • threshold2
    : 90

這意味著:

  • 任何梯度低于50的點(diǎn)將被拋棄;
  • 任何梯度超過90的點(diǎn)將被標(biāo)記為邊緣;
  • 凡是介于50和90之間的點(diǎn),只有當(dāng)它與一個(gè)標(biāo)記為邊緣的點(diǎn)相連時(shí),才會(huì)被視為邊緣。

注意

  • 根據(jù)實(shí)際產(chǎn)品表面特征調(diào)整參數(shù)
  • 光照和拍攝條件會(huì)影響檢測效果
  • 建議采集大量樣本進(jìn)行算法訓(xùn)練和優(yōu)化

結(jié)語

通過OpenCVSharp,我們可以構(gòu)建一個(gè)高效的產(chǎn)品表面劃痕檢測系統(tǒng)。結(jié)合計(jì)算機(jī)視覺技術(shù)和實(shí)際工業(yè)需求,可以顯著提高產(chǎn)品質(zhì)量檢測的準(zhǔn)確性和效率。


閱讀原文:原文鏈接


該文章在 2025/3/24 17:01:33 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产成人综合亚洲天堂 | 久久99久久99精品免视看 | 午夜福利网国产a | 国产成人女人在线观看 | 欧美精品+在线播放 | 国产精品自产拍在线观看一 | 黄色网址在线免费看 | 白丝被绑双腿憋尿sm调教 | 91精品国产午夜福利在线观看 | 国产v亚洲v天堂无码 | 91在线无精精品秘一区二区 | 在线播放真实国产乱子伦 | 亚洲一区二区精品 | 国产亚洲av片a区二区三区 | 人妻少妇白浆一区二区三区 | 99re视频热这里只有精品 | 99久久综合狠狠综合久久aⅴ | 99久久精品免费看国产一区二区 | 深夜网站在线观看 | 91精品久久人人妻人人做 | 欧美日韩免费一区二区在线观看 | 国产精品综合第一页 | 午夜a级理论片在线播放不 午夜a级理论片在线播放不卡 | 日韩国产激情www | 国产高清在线观看av不 | 亚洲av无码成人精品区在线观 | 亚洲国产专区一区 | 国产精品第九页 | 东京热一区二区av | 91人妻成人精品一区二区 | 三区在线观看 | 国产精品秘麻豆免费版 | 中文无码精品a∨在线观看不卡 | 中文字幕乱码亚洲第一页 | 国产成人免费高潮激情视频 | 精品亚洲精品中文字幕乱码 | 欧美日韩免费一区二区在线观看 | 国产精品免费视频一区二区三 | 精品国精品国产自在久91 | 日韩欧美一区二区三区免费观看 | 国产精品无码久久久久久曰本 |