栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

OpenCv案例(六):基于OpenCvSharp检测零件涂胶状态

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OpenCv案例(六):基于OpenCvSharp检测零件涂胶状态

1:需求:某工厂自动化流水线上,检测工站对零件涂胶的工艺是否正常;

2:先看原图,如下所示:

3:需要对图中白色涂胶部分进行检测,检测涂胶是否有断开现象,若有,则为NG,涂胶不合格。(下图箭头指示部分,即是涂胶)

 

 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);
            //Cv2.GaussianBlur(matGray, BlurMat, new Size(3, 3), 15, 0, BorderTypes.Default);
            //Cv2.ImShow("MedianBlur", BlurMat);
            //Cv2.Blur(matGray, BlurMat,new Size(5,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);


            //binaryImage
            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:以上是对该操作的介绍,若对其中某些算法不明白,可以关键字搜索其算法原理,对其进行调参,这里不做过多介绍。补充一点,上述方法,可适当调节参数,可扩大该方法通用性,欢迎各位伙伴补充交流;

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015842.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号