https://www.toutiao.com/a6713860404323287566/

基于机器视觉的缺陷检测汽车零部件

1. 缺陷检测的意义

汽车行业是支撑我国实体经济发展的重点行业,目前我国是世界上汽车消费量最大的国家,与汽车相关的产业形形色色。 汽车行业事关我们每个人的人身安全, 因此汽车行业也是对检测要求较高的行业,几乎每个零件都需要全检。所以,汽车零部件尺寸缺陷检测的意义就显得尤为重要了。

机器视觉应用场景

2. 技术栈(OPENCV 3.0 +C++)

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了和计算机视觉方面的很多通用算法。

OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线获得。如今也提供对于C#、Ch、Ruby,GO的支持。

OpenCv

3实战(OPENCV 3.0 +C++)

机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素分布和亮度、颜色等信息,转变成数字化信号;图像系统对这些信号进行各种运算来抽取目标的特征,进而根据判别的结果来控制现场的设备动作。

缺陷检测背景

某一条流水线需要缺陷检测一下零部件的优良情况。(由于特殊情况,需要对该单位进行保密)

背景图片


1 imread()图像为载入函数

//函数原型: imread(const string& filename,int flag);

参数一:const string& filename 传入参数为文件名字。

支持图片格式:

1、windows位图:*.bmp,*.dib;

2、JPEG文件:*.jpg,*.jpe,*.jpeg;

3、JPEG 2000 文件;

4、PNG 图片:*.png;

5、便携文件格式;

6、Sun rasters;

7、TIFF文件;

参数二:int flag参入参数

1、取值0,将图像转化为灰图;

2、取值2,原深度图像;

3、取值4,原颜色图像;

4、取值1为彩图,取值<0Alpha通道加载图像,=0为灰图。

int width = 512, height = 512;
Mat image = Mat::zeros(height, width, CV_8UC3); //创建窗口可视化
image = imread("Souce.jpg",1);

2提高图片对比度

注意

下面的解释属于Richard Szeliski 的“ 计算机视觉:算法与应用 ”一书

图像处理

  • 一般的图像处理算子是采用一个或多个输入图像并产生输出图像的函数。
  • 图像变换可以看作:点运算符(像素变换)邻里(区域)运营商

像素变换

  • 在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(可能是一些全局采集的信息或参数)。
  • 这些操作者的示例包括亮度和对比度调整以及颜色校正和变换。

亮度和对比度调整

  • 两个常用的点处理是乘法和加法:

g(x) =af(x)+B

  • 参数和\ beta通常称为增益和偏置参数; 有时这些参数被分别控制对比度和亮度。α>0β
  • 您可以将视为源图像像素,g(x)作为输出图像像素。然后,我们可以更方便地将表达式写成:f(x)g(x)

g(i,j) =a*f(i,j)+B

其中和j表示像素位于第i行和第j列。ij

//【1】提高图片对比度
double alpha =2;
int beta =0;
Mat new_image = Mat::zeros(image.size(), image.type());
for (int y = 0; y < image.rows; y++)
{
for (int x = 0; x < image.cols; x++)
{
for (int c = 0; c < 3; c++)
{
new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha * (image.at<Vec3b>(y, x)[c]) + beta);
}

2图像二值化和降噪

对灰度图像进行处理,设定阈值,在阈值中的像素值将变为1(白色部分),阈值为的将变为0(黑色部分)。

//【2】灰度
cvtColor(new_image, Gray, COLOR_BGR2GRAY);
//equalizeHist(Gray, equalizeHistInImage);
//imshow("Gray", Gray);
//imshow("equalizeHistInImage", equalizeHistInImage);
//【3】降噪
//threshold(Gray, BGray,130 , 255, 0);
//【3】降噪
blur(Gray, BGray, Size(3, 3));

3 Canny算子边缘检测

图像的边缘检测的原理是检测出图像中所有灰度值变化较大的点,而且这些点连接起来就构成了若干线条,这些线条就可以称为图像的边缘函数原型: void cvCanny(

constCvArr* image, //第一个参数表示输入图像,必须为单通道灰度图

CvArr* edges, //第二个参数表示输出的边缘图像,为单通道黑白图

double threshold1, double threshold2, //第三个参数和第四个参数表示阈值,这二个阈值中当中的小阈值用来控制边缘连接, 大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,则被认为 是边缘像素,如果小于下限阈值,则被抛弃。如果该点的梯度在两者之间则当这个 点与高于上限值的像素点连接时我们才保留,否则删除。

int aperture_size=3 //第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子 );

//【4】Canny 边缘检测
//输入图像
//输出图像
//低阈值
//高阈值,opencv建议是低阈值的3倍
//内部sobel滤波器大小
Mat Dst = Mat::zeros(image.size(), image.type());
Canny(BGray, Dst, 100, 330, 3);
imshow("InImage", image);
imshow("Outimage", new_image);
imshow("OutGrayimage", Dst);

4 轮廓提取和缺陷检测

CV_EXPORTS_W void findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode,int method, Point offset=Point());

参数描述:

1. image:单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像;

2. contours:定义为"vector<vector<Point>> contours",是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素;

3. hierarchy:定义为"vector<Vec4i> hierarchy", 也是一个向量,向量内每个元素保存了一个包含4个int整型的数组。向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同;

hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第 i 个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。

4. mode:定义轮廓的检索模式:

CV_RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略

CV_RETR_LIST: 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1.

CV_RETR_CCOMP: 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层.

CV_RETR_TREE: 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。

5. method:定义轮廓的近似方法

CV_CHAIN_APPROX_NONE: 保存物体边界上所有连续的轮廓点到contours向量内

CV_CHAIN_APPROX_SIMPLE: 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留

CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法.

6. Point:偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!

//【5】查找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(Dst, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
//【6】遍历轮廓
Mat outFinally = Mat::zeros(height, width, CV_8UC3); //创建窗口可视化
int index = 0;
for (; index >= 0; index = hierarchy[index][0])
{
if (index == 2 |index == 1 |size(hierarchy)==index+1| size(hierarchy) == index+2)
{
continue;
}
Scalar color(rand() & 255, rand() & 255, rand() & 255);
drawContours(outFinally, contours, index, color, FILLED, 8, hierarchy);
}
imshow("轮廓图", outFinally);
waitKey(0);

原图

对比度提高图

轮廓图

缺陷图

基于机器视觉的缺陷检测汽车零部件相关推荐

  1. 基于机器视觉的缺陷检测的原理与方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|新机器视觉 基于统计分类的方法: (1)基于KNN方法( ...

  2. 机器视觉工业缺陷检测的那些事(四、常用算法与库)

    机器视觉工业缺陷检测的那些事(四.常用算法与库) 目录 机器视觉工业缺陷检测的那些事(四) 二.算法(预处理算法.检测算法) 常用的图像处理算法: 1.图像变换:(空域和频域.几何变换.色度变换.尺度 ...

  3. 基于机器视觉的表面缺陷检测方法研究进展(2022最新)

    参考文献:基于机器视觉的表面缺陷检测方法研究进展-赵朗月 声明 此文章仅为作者阅读学习记录,如有错误欢迎指正交流,如果对你有帮助还望点赞支持,谢谢! 文章目录 声明 摘要 1.传统图像处理方式 2.基 ...

  4. 机器视觉工业缺陷检测的那些事(二、相机)

    目录 机器视觉工业缺陷检测的那些事(二) 2.相机的选择 (1)工业数字相机的分类: (2)相机的主要参数 ①分辨率 ②速度(帧频/行频) ⑥像元深度 (3)工业数字摄像机主要接口类型 CCD和COM ...

  5. 机器视觉工业缺陷检测的那些事(三、镜头)

    目录 机器视觉工业缺陷检测的那些事(三) 3.镜头的选择 (1)镜头的接口 C接口和CS接口的区别: (2)工业镜头的基本参 <1> 视场(Field of view,即FOV,也叫视野范 ...

  6. 基于机器视觉的滑块检测

    基于机器视觉的滑块检测 滑块Slider检测,是在一些电磁产品上的一些小零件,主要检测尺寸.间距.定位之类的.如下图所示,是不同倍率下的滑块成像效果: 工业光源 对于这种产品,相对比较小,所以可以使用 ...

  7. 基于机器视觉的线圈检测

    基于机器视觉的线圈检测 线圈检测,一般会考虑检测有无断线.有无乱线.焊点好坏.线数量等.具体的需要看项目本身要求. 工业光源 如上图,为使用环形光源或圆顶无影光源得到的效果图.具体要看测量什么要求,然 ...

  8. 机器视觉之缺陷检测的光源

    目录 机器视觉工业缺陷检测的那些事(一) 一.硬件选型 1.光源的选择 (1)光源可分为可见光和不可见光. (2)按照射方式不同可分为背向照明.前向照明.结构光和频闪光照明等. (3)按照照明方式可分 ...

  9. 趋高智能注塑件表面视觉检测之机器视觉的缺陷检测方案

    趋高智能注塑件表面视觉检测之机器视觉的缺陷检测方案. 趋高智能专注机器视觉软件硬件开发有10年以上的经验. 机器视觉是人工智能正在快速发展的一个分支.简单说来,机器视觉就是用机器代替人眼来做测量和判断 ...

最新文章

  1. linux终端vi退出命令,如何从命令行关闭vim?
  2. locate,find
  3. python编程从入门到实践答案-《Python编程:从入门到实践》第五章 if语句 习题答案...
  4. int (*a)[10] 和 int *a[10] 的区别
  5. ssh无密码登录设置(centos6系统下实现)
  6. python俄罗斯方块课程设计报告_用python实现俄罗斯方块
  7. 恢复Redis中主、从库宕机
  8. js:防抖动与节流【转载】
  9. Python脚本自动化运维网络设备
  10. 微型计算机原理及应用吴宁课后答案,微机原理及应用(吴宁) 习题答案chapter7(4页)-原创力文档...
  11. 深信服 云桌面 linux,深信服桌面云-深信服桌面云下载 v3.0官方版--pc6下载站
  12. 全国一级计算机考证软件
  13. 用vlc搭建rtsp流媒体服务器
  14. 二阶采样matlab程序,Sea-clutter-simulation 海杂波仿真程序,包括单基地雷达和双 的一阶、二阶 matlab 272万源代码下载- www.pudn.com...
  15. 微软面试58道逻辑面试题
  16. 粒子群算法(7)------粒子群算法局部版本的实现
  17. 职称计算机萧山考点地址,杭州各科目考点一览表(地址+考试时间+电话)
  18. 业务范围(business area)
  19. 尼尔机械纪元房顶机器人_尼尔机械纪元辅助机器人是什么 辅助机器人解析攻略...
  20. 该选国企,外企还是私企?

热门文章

  1. beamSearch算法原理
  2. Python如何实现单步调试
  3. Oracle中,使 CREATE TABLE AS SELECT 支持ORDER BY
  4. 如何网络监测其他计算机关闭445端口,关闭445端口的方法,教您电脑如何关闭445端口...
  5. java对象序列化克隆_JAVA 对象克隆和序列化
  6. 密码界“女杀手”,破译世上最安全密码系统,获 771 万奖金!
  7. 《我编程,我快乐》精彩片段——学习行业是如何运转的
  8. 图像翻译 相关 跨物种
  9. 生成对抗网络学习笔记5----DCGAN(unsupervised representation learning with deep convolutional generative adv)的实现
  10. 在BAE搭建的Django中实现图片上传并用jquery预览图片