工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现

这篇具有很好参考价值的文章主要介绍了工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于opencv的工件缺陷检测C++和python实现

作为研究生,每一个项目都很重要,这里给大家分享一个好入门项目,代码纯自己写,网上都是python的,但是有些企业要求C++编写项目,所以希望大家能学到东西。
一. 问题陈述
工件的展示,这是一个视频,然后工件一个个经过,要检测出哪个工件有缺陷,并且分类缺陷的种类。可以看到缺陷是不止一种。
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
二. 代码步骤
1.读取图像,转为灰度图并二值化

cvtColor(img, gray, COLOR_BGR2GRAY);
threshold(gray, thresh, 127, 255, THRESH_TOZERO_INV);、

2.寻找轮廓

std::vector<Vec4i> hireachy;
std::vector<std::vector<Point>> contours;
findContours(thresh, contours, hireachy, RETR_LIST, CHAIN_APPROX_NONE);

3.遍历轮廓,对工件圈进行统计,防止重复标记
原理是计算图像矩,可以确定图像的灰度中心,根据每个时刻每个工件的中心位置的变换,可以判断画面里是否出现新的工件。同时,也要记得更新每个时刻每个工件的位置。具体代码实现可以参考完整工程文件。这里贴出部分:

for (size_t cnt = 0; cnt < contours.size(); cnt++)
        {
            double area = contourArea(contours[cnt]); //求轮廓面积(大约的)
            if (area > 18000 & area < 28000)          //把工件圈出来
            {
                mu[cnt] = moments(contours[cnt], false); //计算图像矩,表示工件的位置
                //计算图像质心位置
                double cx = mu[cnt].m10 / mu[cnt].m00;
                double cy = mu[cnt].m01 / mu[cnt].m00;
                boundRect[cnt] = boundingRect(Mat(contours[cnt])); //计算外接矩形

                new_object = true;
                //通过质心位置判断视频出现的工件是否是最新的
                if (cx > 100) //工件要全部出现
                {
                    if (products.size() > 0) //判断出现的工件是不是新的
                    {
                        for (size_t i = 0; i < products.size(); i++)
                        {
                            //存在一个
                            if (fabs(cx - products[i].getX()) <= 35 && fabs(cy - products[i].getY()) <= 35)
                            {
                                new_object = false;
                                //更新位置参数
                                products[i].updateCoords(cx, cy, boundRect[cnt].x, boundRect[cnt].y, boundRect[cnt].width, boundRect[cnt].height);
                            }
                        }
                    }
                    if (new_object == true)
                    {
                        Product p(pid, cx, cy, boundRect[cnt].x, boundRect[cnt].y, boundRect[cnt].width, boundRect[cnt].height);
                        p.save_pic(img);
                        products.emplace_back(p);
                        p.count = pid;
                        defects = p.defect_detect(); //缺陷检测
                        pid += 1;
                    }
                }
                //圈出来
                rectangle(img, boundRect[cnt].tl(), boundRect[cnt].br(), Scalar(0, 0, 255), 2, 8, 0);
            }
        }

效果是这样:
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现

4.遍历轮廓,把工件圈出来,顺便保存调试,如下图。圈出来的原理也不难,其实就是通过函数

boundRect[cnt] = boundingRect(Mat(contours[cnt])); 

计算外接矩形,就可以获得矩形的左上角和右下角坐标,就可以画了。效果如下:
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现

5.对每个框进行缺陷提取,原理依然是轮廓检测加面积判断。效果如下:
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
6.缺陷类型判断,这里利用直方图统计。即统计0-255中每个像素的个数,根据个数,转为百分比,接着我们设定一个阈值,就可以判断出缺陷类型。部分代码:

          //------------------------直方图计算
            Mat hist;
            //设定像素取值范围
            int histSize = 256;
            float range[] = {0, 256};
            const float *histRanges = {range};
            // hist索引为像素,值为像素点的个数
            calcHist(&resul, 1, 0, Mat(), hist, 1, &histSize, &histRanges, true, false);
            //-------------------------判断缺陷
            float sum = 0;
            for (int i = 0; i < 256; i++)
            {
                float bin_val = hist.at<float>(i); //遍历hist元素(注意hist中是float类型)
                sum = sum + bin_val;               //计算总的个数
            }
            // std::cout << "sum:"
            //           << sum << "\n";
            //计算各个像素点的个数百分比
            for (int i = 0; i < 256; i++)
            {
                if (hist.at<float>(i) > 0) //像素点个数大于0的时候
                {
                    hist.at<float>(i) = hist.at<float>(i) / sum;
                }
                // std::cout << "hist:"
                //           << hist.at<float>(i) << "\n";
            }
            float hist_sum_scratch = 0;
            float hist_sum_blot = 0;
            for (int i = 90; i < 135; i++) //比较灰的
            {
                hist_sum_scratch = hist_sum_scratch + hist.at<float>(i);
            }
            std::cout << "hist_sum_scratch:"
                      << hist_sum_scratch << "\n";
            for (int i = 15; i < 90; i++) //比较黑的
            {
                hist_sum_blot = hist_sum_blot + hist.at<float>(i);
            }
            std::cout << "hist_sum_blot:"
                      << hist_sum_blot << "\n";
            if (hist_sum_scratch >= hist_sum_blot)
            {
                Defect d(1, boundRect[cnt].x, boundRect[cnt].y, boundRect[cnt].width, boundRect[cnt].height);
                Result.emplace_back(d);
                state = 1;
                std::cout << "此处缺陷划痕"
                          << "\n";
            }
            if (hist_sum_scratch < hist_sum_blot)
            {
                Defect d(2, boundRect[cnt].x, boundRect[cnt].y, boundRect[cnt].width, boundRect[cnt].height);
                Result.emplace_back(d);
                state = 2;
                std::cout << "此处缺陷污渍"
                          << "\n";
            }

到此就可以完成啦!!!
三. 最终效果:
工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现
可以看到,会在终端打印相关消息

C++代码纯自己写,有多文件,花了一些时间总结,大家可以私信我拿代码
另外,也准备了python代码,需要的也可以私信我。

因为花费不少时间,所以希望大家给点报酬支持一下,继续加油进入下一个实战项目分享

------------------------------------补充内容---------------------------------

由于很多小伙伴下载代码之后不知道怎么使用这代码,今天就补充一下。首先,我们需要安装opencv与dlib,参考下我的另外一篇文章:
ubuntu20+dlib19.22+0pencv4.5.0的机器视觉算法之路(一).
1.删除buiild文件夹里面的所有文件
2.路径打开到build, 执行

cmake ..

3.接着

make

4.执行

./result

搞定,完结,欢迎大家来学习,当作自己的一个项目,或者可以进一步去扩展成其他东西,懂的都懂。文章来源地址https://www.toymoban.com/news/detail-443658.html

到了这里,关于工业缺陷检测项目实战(一)——基于opencv的工件缺陷检测C++和python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OpenCV】告别人工目检:深度学习技术引领工业品缺陷检测新时代

    目录 前言 机器视觉 缺陷检测 工业上常见缺陷检测方法 内容简介 作者简介 目录 读者对象 如何阅读本书 获取方式 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站 机器视觉 机器视觉是使用各种工业相机,结

    2024年02月04日
    浏览(51)
  • opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

    对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。 上图为灰度图,黑色部分为电路板路线,其存在缺口、断路、毛刺、短路等缺陷。这些缺陷有的属于白色缺陷,有的属于黑色缺陷,但都属于小面积缺陷。故,可以使用opencv中的形态学算法,如:腐蚀、

    2024年02月02日
    浏览(47)
  • 基于半监督算法的工业图像缺陷检测方法:MemSeg

    来源:投稿 作者:橡皮 编辑:学姐 论文:https://arxiv.org/ftp/arxiv/papers/2205/2205.00908.pdf 代码:https://github.com/TooTouch/MemSeg 提出了一个精心设计的异常模拟策略,用于模型的自监督学习,该策略整合了目标前景、纹理和结构异常三个方面。 提出了具有更高效的特征匹配算法的记忆

    2024年02月16日
    浏览(43)
  • 基于计算机视觉的工业金属表面缺陷检测综述

    基于计算机视觉的工业金属表面缺陷检测综述 (aas.net.cn) 计算机视觉检测技术(Automated optical inspection, AOI)[2]是一种以计算机视觉为基础, 通过自动光学系统获取检测目标图像, 运用算法进行分析决策, 判断目标是否符合检测规范的非接触式检测方法. 表面缺陷检测系统的基本原理

    2024年04月15日
    浏览(40)
  • 基于轻量化深度学习网络的工业环境小目标缺陷检测

    源自:控制与决策 作者:叶卓勋   刘妹琴  张森林 工业环境下表面缺陷检测是质量管理的重要一环, 具有重要的研究价值.通用检测网络(如YOLOv4)已被证实在多种数据集检测方面是有效的, 但是在工业环境的缺陷检测仍需要解决两个问题: 一是缺陷实例在表面占比过小, 属于

    2024年02月03日
    浏览(48)
  • Yolov8工业缺陷检测:基于铝片表面的缺陷检测算法,VanillaBlock和MobileViTAttention助力检测,实现暴力涨点 |2023最新成果,创新度很强

    目录 1.工件缺陷数据集介绍  1.2数据集划分通过split_train_val.py得到trainval.txt、val.txt、test.txt    1.2 通过voc_label.py得到适合yolov8训练需要的 2.训练结果对比  2.1 华为诺亚2023极简的神经网络模型 VanillaNet---VanillaBlock助力检测,实现暴力涨点  2.2 MobileViTAttention助力小目标检测

    2024年02月13日
    浏览(50)
  • opencv 案例05-基于二值图像分析(简单缺陷检测)

    缺陷检测,分为两个部分,一个部分是提取指定的轮廓,第二个部分通过对比实现划痕检测与缺角检测。本次主要搞定第一部分,学会观察图像与提取图像ROI对象轮廓外接矩形与轮廓。 下面是基于二值图像分析的大致流程 读取图像 将图像转换为灰度图,并对其进行二值化处

    2024年02月10日
    浏览(46)
  • OpenCV 项目开发实战--对图像中的斑点进行检测(Python、C++代码实现)

    Blob 是图像中一组连接的像素,它们共享一些共同的属性(例如,灰度值)。在上图中,暗连接区域是斑点,斑点检测旨在识别和标记这些区域。 文末附相关测试代码的下载链接 OpenCV 提供了一种基于不同特征检测和过滤斑点的便捷方法。让我们从最简单的例子开始 Python

    2024年02月14日
    浏览(56)
  • YOLOV5应用实战项目:钢材表面缺陷检测(数据集:NEU-CLS)笔记

    本文记录的是YOLOV5的实战笔记,是一个用yolov5检测钢材表面缺陷的实战案例。 主要分为以下几个步骤: 1. 将原始标签xml文件数据处理成yolo要求的txt格式;(Labels标签数据已按照yolo要求的txt格式处理完成,数据集见文中下载方式) 2. 进行yolo模型的文件配置 3. 训练yolo模型

    2024年02月04日
    浏览(50)
  • Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C++)

    ​ Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度

    2024年01月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包