位置: IT常识 - 正文

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)(opencv焊点缺陷检测)

编辑:rootadmin
opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷) 一、检测需求

推荐整理分享opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)(opencv焊点缺陷检测),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opencv表面缺陷检测,opencv缺陷识别代码,opencv缺陷识别代码,opencv焊点缺陷检测,opencv焊点缺陷检测,opencv焊点缺陷检测,opencv 瑕疵检测,opencv 瑕疵检测,内容如对您有帮助,希望把文章链接给更多的朋友!

对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。

二、问题分析

上图为灰度图,黑色部分为电路板路线,其存在缺口、断路、毛刺、短路等缺陷。这些缺陷有的属于白色缺陷,有的属于黑色缺陷,但都属于小面积缺陷。故,可以使用opencv中的形态学算法,如:腐蚀、膨胀、开运算、闭运算等方法提取这些小面积缺陷。 解决问题的核心思想如下: 用开运算检测毛刺和短路(开运算会消除小面积的白色区域),用闭运算检测缺口和断路(闭运算会消除小面积的黑色区域),开运算与闭运算所的消除结果之和为全部缺陷。

三、基本实现步骤

1、读取图像为灰度图 【imread(“filename”,0),0:灰度图模式】 2、进行开运算与闭运算 【通过形态学操作使缺陷位置发生变化】 3、通过开运算与闭运算结果获取各类缺陷 【将原图与变化结果对比得到缺陷区域灰度图】 4、将缺陷结果进行二值化 【二值化阈值要适度调整】 5、查找二值化结果轮廓画到原图上 【绘图时画笔类型要与图像类型一致】

四、实现过程4.1 开运算缺陷检测

进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】。 注释:进行开运算后会移除原图中的白色部分,原图中白色区域比开运算结果多,故用原图去减开运算结果

Mat img=imread("C:\\Users\\aaa\\Desktop\\pcb缺陷检测.png",0);//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】Mat open_mat, open_mat_defect;cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));morphologyEx(img, open_mat, MORPH_OPEN, element);open_mat_defect = img - open_mat;imshow("开运算", open_mat); imshow("原图-开运算", open_mat_defect);

4.2 闭运算缺陷检测

进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】 注释:进行闭运算后会移除原图中的黑色部分,闭运算结果图中白色区域比原图多,故用闭运算结果去减原图

//进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】Mat close_mat, close_mat_defect;cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5, 5));morphologyEx(img, close_mat, MORPH_CLOSE, element2);close_mat_defect = close_mat- img;imshow("闭运算", close_mat);imshow("闭运算-原图", close_mat_defect);

4.3 缺陷二值化opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)(opencv焊点缺陷检测)

闭运算缺陷和开运算缺陷叠加,然后二值化。二值化的阈值要根据效果调整

//闭运算缺陷和开运算缺陷叠加,然后二值化Mat defect_2zh;Mat defect = open_mat_defect + close_mat_defect;threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);imshow("所有缺陷", defect);imshow("缺陷二值化", defect_2zh);

4.4 缺陷绘图

将检测出的缺陷绘制在原图上,这里需要注意的是原图被读取为灰度图,想绘制彩色,故需要将其从灰度图转换为彩色图BGR模式。

//将检测出的缺陷绘制在原图上vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换//遍历所有轮廓,绘制缺陷轮廓for (int i = 0; i < contours.size(); i++){//绘制轮廓 drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);}imshow("原图缺陷", img);

4.5 完整代码/* 对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。 核心思想:用开运算检测毛刺,用闭运算检测缺口,开运算与闭运算结果之和为全部缺陷 基本步骤:1、读取图像为灰度图 【imread("filename",0),0:灰度图模式】2、进行开运算与闭运算 【通过形态学操作使缺陷位置发生变化】3、通过开运算与闭运算结果获取各类缺陷 【将原图与变化结果对比得到缺陷区域灰度图】4、将缺陷结果进行二值化 【二值化阈值要适度调整】5、查找二值化结果轮廓画到原图上 【绘图时画笔类型要与图像类型一致】*/Mat img=imread("C:\\Users\\aaa\\Desktop\\pcb缺陷检测.png",0);//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】Mat open_mat, open_mat_defect;cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));morphologyEx(img, open_mat, MORPH_OPEN, element);open_mat_defect = img - open_mat;imshow("开运算", open_mat); imshow("原图-开运算", open_mat_defect); //进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】Mat close_mat, close_mat_defect;cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5, 5));morphologyEx(img, close_mat, MORPH_CLOSE, element2);close_mat_defect = close_mat- img;imshow("闭运算", close_mat);imshow("闭运算-原图", close_mat_defect);//闭运算缺陷和开运算缺陷叠加,然后二值化Mat defect_2zh;Mat defect = open_mat_defect + close_mat_defect;threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);imshow("所有缺陷", defect);imshow("缺陷二值化", defect_2zh);//将检测出的缺陷绘制在原图上vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换//遍历所有轮廓,绘制缺陷轮廓for (int i = 0; i < contours.size(); i++){//绘制轮廓 drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);}imshow("原图缺陷", img);waitKey( );4.6 效果分析

通过对上述结果图分析,发现该算法存在一定程度的误检,具体如下图所示,共存在17处误检。这些误检区域与缺口(黑色的才是线路)存在相同的形态学特征(有个白色的尖尖),使用开运算很难避免该类误检。目前,开运算所能准确检测到的缺口类型缺陷均为线路上缺陷,对于非线路上缺陷均为误检。

五、算法优化

目前算法的误检由开运算导致,均发生在非线路区域,故需要移除由开运算在非线路区域的检测结果。

5.1 优化思路

1.提取非线路区域 2.提取开运算结果 3.移除开运算结果在非线路区域的结果

5.2 优化过程

在优化思路中,提取提取非线路区域是关键操作。非线路区域的特点是,其为图像中黑色较粗的区域;线路区域的特点是,其为图像中黑心较细的区域;这些线条区域与非线条区域基本上都在一个在连通域中。故,不可以使用面积提取,需要使用闭运算来提取图像中黑色较粗的区域。

同时,需要注意闭运算提取的黑色较粗区域可能无法盖住闭运算所检测出的缺陷,故需要对黑色较粗区域进行腐蚀(使白色区域能盖住闭运算所检测出的缺陷)。

核心代码如下所示:

//----新增:为实现性能优化//获取图像中的非线路区域(其特点是比较粗)//使用闭运算移除非线路区域Mat img_bin, img_bin_close, img_bin_close_dilate;threshold(img, img_bin, 0, 255, THRESH_OTSU);cv::Mat element_close = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));morphologyEx(img_bin, img_bin_close, MORPH_CLOSE, element_close);img_bin_close = 255 - img_bin_close;//使非线条区域从黑变白imshow("img_bin_close", img_bin_close);cv::Mat element_dilate = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));morphologyEx(img_bin_close, img_bin_close_dilate, MORPH_DILATE, element_dilate);imshow("img_bin_close", img_bin_close);5.2 优化效果及代码

优化后的效果及代码如下所示,可以看到通过上述步骤后消除了大部分的误检。

#include <iostream>#include <opencv2/opencv.hpp>#include <opencv2/highgui.hpp>#include <opencv2/imgproc.hpp>#include <iostream> #include <vector>#include <io.h>#include <stdlib.h>#include <iostream>#include <string>using namespace std;using namespace cv;int main() {Mat img=imread("C:\\Users\\hpg\\Desktop\\pcb缺陷检测.png",0);//----新增:为实现性能优化//获取图像中的非线路区域(其特点是比较粗)//使用闭运算移除非线路区域Mat img_bin, img_bin_close, img_bin_close_dilate;threshold(img, img_bin, 0, 255, THRESH_OTSU);cv::Mat element_close = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));morphologyEx(img_bin, img_bin_close, MORPH_CLOSE, element_close);img_bin_close = 255 - img_bin_close;//使非线条区域从黑变白imshow("img_bin_close", img_bin_close);cv::Mat element_dilate = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));morphologyEx(img_bin_close, img_bin_close_dilate, MORPH_DILATE, element_dilate);imshow("img_bin_close", img_bin_close);//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】Mat open_mat, open_mat_defect;cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));morphologyEx(img, open_mat, MORPH_OPEN, element);open_mat_defect = img - open_mat;imshow("开运算", open_mat); imshow("原图-开运算", open_mat_defect); //移除开运算在非线条区域的误检open_mat_defect = open_mat_defect - img_bin_close;//进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】Mat close_mat, close_mat_defect;cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5, 5));morphologyEx(img, close_mat, MORPH_CLOSE, element2);close_mat_defect = close_mat- img;imshow("闭运算", close_mat);imshow("闭运算-原图", close_mat_defect);//闭运算缺陷和开运算缺陷叠加,然后二值化Mat defect_2zh;Mat defect = open_mat_defect + close_mat_defect;threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);imshow("所有缺陷", defect);imshow("缺陷二值化", defect_2zh);//将检测出的缺陷绘制在原图上vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换//遍历所有轮廓,绘制缺陷轮廓for (int i = 0; i < contours.size(); i++){//绘制轮廓 drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);}imshow("原图缺陷", img);waitKey( );}

本文链接地址:https://www.jiuchutong.com/zhishi/299859.html 转载请保留说明!

上一篇:【TFS-CLUB社区 第5期赠书活动】〖Python OpenCV从入门到精通〗等你来拿,参与评论,即可有机获得(tf club下载)

下一篇:vue中的provide/inject你知道吗(vue2、vue3)?(vue中的路由参数如何获取)

  • h61主板最佳升级方案(h61主板)(h61主板最佳升级方案)

    h61主板最佳升级方案(h61主板)(h61主板最佳升级方案)

  • 云上贵州是什么东西(云上贵州是什么意思)

    云上贵州是什么东西(云上贵州是什么意思)

  • 华为p40自带微信视频带美颜吗(华为p40自带微信美颜吗)

    华为p40自带微信视频带美颜吗(华为p40自带微信美颜吗)

  • 微信名字最多能设置几个字(微信名字最多能有多少个字)

    微信名字最多能设置几个字(微信名字最多能有多少个字)

  • 微信付款码可以截图给别人用吗(微信付款码可以设置密码吗)

    微信付款码可以截图给别人用吗(微信付款码可以设置密码吗)

  • 截图快捷键alt加什么(截图快捷键alt加a)

    截图快捷键alt加什么(截图快捷键alt加a)

  • 电脑白屏怎么关机(电脑白屏幕了怎么退出)

    电脑白屏怎么关机(电脑白屏幕了怎么退出)

  • 压缩包zip怎么转rar(压缩包zip怎么转换rar)

    压缩包zip怎么转rar(压缩包zip怎么转换rar)

  • 抖音怎么查看订单(抖音怎么查看订单信息)

    抖音怎么查看订单(抖音怎么查看订单信息)

  • 删除加拉黑是什么提示(删了加拉黑)

    删除加拉黑是什么提示(删了加拉黑)

  • 手机qq共同好友算自己一个吗(手机qq共同好友怎么打开)

    手机qq共同好友算自己一个吗(手机qq共同好友怎么打开)

  • 闲鱼上面商品关联什么意思(闲鱼上卖家关闭交易 是不是这个订单就无意义了)

    闲鱼上面商品关联什么意思(闲鱼上卖家关闭交易 是不是这个订单就无意义了)

  • 支付宝销户提示存在争议(支付宝销户提示账号存在争议怎么办)

    支付宝销户提示存在争议(支付宝销户提示账号存在争议怎么办)

  • 手机啥也没有内存满了(手机里面没什么但是没内存)

    手机啥也没有内存满了(手机里面没什么但是没内存)

  • 微机主板上主要部件有(微机主板上有什么)

    微机主板上主要部件有(微机主板上有什么)

  • 华为手环睡眠监测原理(华为手环睡眠监测准确么)

    华为手环睡眠监测原理(华为手环睡眠监测准确么)

  • 微信邀请链接什么时候过期(微信8.0邀请链接)

    微信邀请链接什么时候过期(微信8.0邀请链接)

  • zao怎么去水印(zao水印去除)

    zao怎么去水印(zao水印去除)

  • 苹果快充伤电池吗(苹果快充伤电池吗 知乎)

    苹果快充伤电池吗(苹果快充伤电池吗 知乎)

  • imessge信息花钱吗

    imessge信息花钱吗

  • vivox27长度多少厘米(vivox27手机长度多少厘米)

    vivox27长度多少厘米(vivox27手机长度多少厘米)

  • 陌陌打招呼上限解除几点刷新(陌陌打招呼上限多少人)

    陌陌打招呼上限解除几点刷新(陌陌打招呼上限多少人)

  • 闲鱼怎么看聊天记录(闲鱼怎么看聊天内容)

    闲鱼怎么看聊天记录(闲鱼怎么看聊天内容)

  • 基于Python构建机器学习Web应用(python搭建项目结构)

    基于Python构建机器学习Web应用(python搭建项目结构)

  • 受票方与付款方不一致
  • 注册资本没有到位可以注销吗
  • 税率3%变成10%
  • 企业间分红是否需要缴纳企业所得税
  • 新准则金融资产科目名称
  • 补缴房产税有滞纳金吗
  • 500元以下免税发票有哪些
  • 主营业务收入计入
  • 作废的增值税专用发票怎么处理
  • 商贸企业变更为生产企业
  • 没有票据怎么要账
  • 合并报表时存货怎么处理
  • 小规模无票收入怎么做账
  • 如何理解定时是指收入在什么时候记入账册?
  • 股票回购后多久注销
  • 总公司发工资子公司代缴个税
  • 发票上的税额和报税的数不一样,按照哪个报
  • 增值税纳税申报表怎么填
  • 网上勾选认证发票步骤
  • 发票备注有法律效力吗
  • 金蝶财务软件不能反结账
  • 先收钱后开票怎么做分录
  • 调整增值税税率
  • 天猫公司不开银行卡吗
  • 企业计提房产税的会计处理正确的是
  • 以前年度损益调整
  • 水利基金退税怎么做会计分录
  • 长期债权投资收回的利息 现金流量表
  • 定额备用金的核算可分为哪几类
  • 留底的进项税额记哪儿?
  • php获取文件名
  • 房屋租赁经营要交哪些税
  • 建筑公司预收账款一般是哪些
  • php时间函数用法代码
  • 深入理解linux内核
  • ps如何使用套锁工具剪裁图片
  • 长期借款的核算分为哪三个阶段
  • 装修费用一次性计入成本
  • 进口消费税如何计税
  • 对象是类的实例,一个对象必须属于一个已知的类
  • mongodb服务端默认的端口号是多少?
  • 以货换货账务怎么处理
  • 正解之途
  • 客户货款打到私人微信,删除公司电脑数据
  • 公司固定电话费用挂哪个科目
  • 房地产影响投资和消费,事关民生和发展
  • 国有独资企业是有限责任公司吗
  • 流动比率与速动比率下降说明什么
  • 应收帐款坏帐损失怎么算
  • 设计费要计入固定成本吗
  • 劳保统筹费缴费比例
  • 更正会计凭证摘要怎么写?
  • 保证金抵扣货款情况说明范文
  • 应付职工薪酬包括辞退福利吗
  • 现金流量表现金及现金等价物净增加额
  • 税交多了可以退吗
  • 负数发票要给税务局吗
  • 房地产企业预付账款会计分录
  • 支付银行手续费等直接收费金融服务
  • 会计凭证是对外公布的资料吗
  • sql语句排除重复数据
  • mysql1194
  • 喝了阿胶补血口服液嗜睡
  • vmware tools安装包在哪
  • win7系统点击计算机图标未响应
  • Linux服务器端口状态
  • win10开机后没声音
  • linux 操作指令
  • cocos2dx游戏案例
  • jquery常用操作
  • nodejs入门教程
  • CSS3 media queries结合jQuery实现响应式导航
  • javascript $符号
  • java教程 视
  • 党建共建的目的
  • 关于出口退税的问题
  • 公共卫生委员会领导小组
  • 浙江国地税联合申报系统
  • 苏州汇川和深圳汇川那个好
  • 上市公司季报有哪些内容
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设