LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 使用OpenCVSharp进行皮革表面划痕检测品检管理

admin
2025年3月23日 23:18 本文热度 224

皮革表面划痕检测是质量控制中的重要环节,利用计算机视觉技术能够快速、精准地识别皮革表面的缺陷。本文将详细讲解如何通过OpenCVSharp实现皮革划痕的自动检测。

实现方案

环境准备

首先,确保安装以下NuGet包:

  • OpenCvSharp4
  • OpenCvSharp4.Windows

完整代码实现

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

namespace AppScratchInspection
{
    publicclass LeatherScratchDetector
    {

        /// <summary>  
        /// 显示图像处理的每个阶段  
        /// </summary>  
        /// <param name="imagePath">皮革图像路径</param>  
        public void DetectScratchWithVisualization(string imagePath)
        
{
            // 读取原始图像  
            Mat originalImage = Cv2.ImRead(imagePath, ImreadModes.Color);
            ShowImage("原始图像", originalImage);

            // 图像预处理:转换为灰度图  
            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);

            // 形态学操作:膨胀和腐蚀,突出划痕特征  
            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);

                // 根据面积和形状过滤可能的划痕  
                if (area > 50)
                {
                    double perimeter = Cv2.ArcLength(contour, true);
                    double ratio = 4 * Math.PI * area / (perimeter * perimeter);

                    // 长条状特征判断  
                    if (ratio < 0.5)
                    {
                        scratches.Add(contour);

                        // 绘制每个检测到的轮廓  
                        Cv2.DrawContours(contourImage, new Point[][] { contour }, -1,
                            Scalar.Red, 2);
                    }
                }
            }

            // 显示最终结果  
            ShowImage("划痕检测结果", contourImage);

            // 输出划痕数量  
            Console.WriteLine($"检测到 {scratches.Count} 个划痕");
        }

        /// <summary>  
        /// 封装图像窗口显示方法  
        /// </summary>  
        /// <param name="windowName">窗口名称</param>  
        /// <param name="image">待显示图像</param>  
        private void ShowImage(string windowName, Mat image)
        
{
            // 调整图像大小以适应屏幕  
            Mat resizedImage = new Mat();
            Cv2.Resize(image, resizedImage, new Size(640480));

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

            // 等待按键  
            Cv2.WaitKey(1000); // 每个窗口停留1秒  
        }
    }
}

调用

using OpenCvSharp;

namespace AppScratchInspection
{
    internal class Program
    {

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

            // 保持最后一个窗口直到用户关闭  
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        }
    }
}

Cv2.Canny 函数参数

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

参数说明

  1. image
     (Mat):
    • 输入图像,通常是经过灰度处理和去噪的图像。
  2. edges
     (Mat):
    • 输出图像,包含检测到的边缘。
  3. threshold1
     (double):
    • 第一个阈值,用于边缘连接。值越低,检测到的边缘越多。这个值用于哈希图像的梯度强度,低于该值的梯度被认为是非边缘强度。
  4. threshold2
     (double):
    • 第二个阈值,用于边缘连接。值越高,边缘检测将更严格。只有当梯度强度高于该值时,才会被认为是潜在边缘。Canny算法通过两个阈值来连接边缘,低于 `threshold1` 的边缘被丢弃,介于两个阈值之间的边缘需要与高于 `threshold2` 的边缘连接才能成为有效边缘。
  5. apertureSize
     (int, 可选):
    • Sobel算子的大小,用于计算图像梯度。它可以取值为3、5或7,默认为3。增大这个值可以提高边缘检测的平滑度,但可能会损失一些细节。
  6. L2gradient
     (bool, 可选):
    • 是否使用更精确的L2范数计算梯度的大小。如果为`true`,则使用L2范数;如果为`false`(默认),则使用L1范数。L2范数能提供更精确的边缘。

示例

在您的代码中,您使用的参数如下:

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

这意味着:

  • 任何梯度低于50的点将被抛弃;
  • 任何梯度超过90的点将被标记为边缘;
  • 凡是介于50和90之间的点,只有当它与一个标记为边缘的点相连时,才会被视为边缘。

注意

  • 根据实际产品表面特征调整参数
  • 光照和拍摄条件会影响检测效果
  • 建议采集大量样本进行算法训练和优化

结语

通过OpenCVSharp,我们可以构建一个高效的产品表面划痕检测系统。结合计算机视觉技术和实际工业需求,可以显著提高产品质量检测的准确性和效率。


阅读原文:原文链接


该文章在 2025/3/24 17:01:33 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved