问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于OpenCVSharp的工业零件涂胶缺陷检测方案

创作时间:
作者:
@小白创作中心

基于OpenCVSharp的工业零件涂胶缺陷检测方案

引用
CSDN
1.
https://blog.csdn.net/qq_37835727/article/details/125789686

本文将介绍如何使用OpenCVSharp库进行工业零件涂胶缺陷检测。通过图像预处理、二值化、轮廓提取等步骤,实现对涂胶是否断开的自动检测。

1. 需求背景

某工厂自动化流水线上需要检测零件涂胶工艺是否正常。具体需求是对零件上的白色涂胶部分进行检测,判断涂胶是否有断开现象。如果涂胶断开,则判定为不合格(NG)。

2. 原始图像

3. 检测目标

需要检测图中白色涂胶部分,判断是否有断开现象。如下图箭头指示部分即是涂胶区域:

4. 处理流程

处理过程中涉及几个关键步骤的中间图像:

  • 模糊处理-降噪
  • 图像二值化
  • 轮廓提取

从处理结果可以看出,涂胶没有断开,为合格件。

5. 代码实现

下面是完整的图像处理代码:

public bool ImgProcess(Mat src)
{
    bool result = false;
    // 图像灰度转换
    Mat matGray = new Mat();
    Cv2.CvtColor(src, matGray, ColorConversionCodes.BGR2GRAY);
    Cv2.ImShow("matGray", matGray);
    
    Mat BlurMat = new Mat();
    Cv2.MedianBlur(matGray, BlurMat, 5);
    
    Mat bilateralFilter = new Mat();
    Cv2.BilateralFilter(BlurMat, bilateralFilter, 9, 25, 25);
    
    Mat BlurMat1 = new Mat();
    Cv2.FastNlMeansDenoising(bilateralFilter, BlurMat1, 9);
    Cv2.ImShow("BlurMat1", BlurMat1);
    
    // 二值化处理
    Mat binaryImg = new Mat();
    Cv2.Threshold(BlurMat1, binaryImg, 210, 255, ThresholdTypes.Binary);
    Cv2.ImShow("binary", binaryImg);
    
    Mat morhpImage = new Mat();
    Mat kernel = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(3,3), new Point(-1, -1));
    Cv2.MorphologyEx(binaryImg, morhpImage, MorphTypes.Erode, kernel, new Point(-1, -1),1);
    Cv2.ImShow("Open", morhpImage);
    
    Mat laplanceMat = new Mat();
    Cv2.Laplacian(morhpImage, laplanceMat, MatType.CV_8UC1, 3, 3, 5);
    Cv2.ImShow("Laplacian", laplanceMat);
    
    // 连通区域计算
    Point[][] contours;
    HierarchyIndex[] hierarchies;
    Cv2.FindContours(laplanceMat, out contours, out hierarchies, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple);
    
    // 绘制结果图像
    Mat markRet = Mat.Zeros(src.Size(), MatType.CV_8UC3);
    RNG rng = new RNG(12345);
    double maxArea = 0;
    int index = -1;
    for (int i = 0; i < contours.Length; i++)
    {
        double area = Cv2.ContourArea(contours[i]);
        double length = Cv2.ArcLength(contours[i], false);
        if (area > maxArea)
        {
            maxArea = area;
            index = i;
        }
        if (length > 500 && length < 1000)
        {
            Cv2.DrawContours(markRet, contours, i, new Scalar(rng.Uniform(0, 255), rng.Uniform(0, 255), rng.Uniform(0, 255)), 6, LineTypes.Link4);
        }
    }
    Cv2.ImShow("dist-Binary", markRet);
    return result;
}

6. 总结

以上是对该图像处理方法的完整介绍。如果对其中某些算法的具体原理不熟悉,可以通过关键字搜索进一步了解。此外,通过适当调节参数,可以扩大该方法的通用性,欢迎各位技术伙伴补充交流。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号