开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 8761|回复: 0
收起左侧

[技术专题] 用opencv使用传统算法实现产品缺陷检测

[复制链接]
结帖率:89% (79/89)
发表于 2022-2-12 15:09:44 | 显示全部楼层 |阅读模式   江苏省苏州市
QQ图片20220212150853.png QQ图片20220212150853.png

  
窗口程序集名保 留  保 留备 注
程序集1   
子程序名返回值类型公开备 注
_启动子程序整数型 本子程序在程序启动后最先执行
变量名类 型静态数组备 注
img多维矩阵类 
cap视频采集类 
productmyproduct0
grayImage多维矩阵类 
binImage多维矩阵类 
ontours多维数组点2i类 
Contours多维矩阵类 
i整数型 
area双精度小数型 
M矩类 
center_x双精度小数型 
center_y双精度小数型 
rect矩形2i类 
isNew逻辑型 
h双精度小数型 
v双精度小数型 
pmyproduct 
idx整数型 
objsdefect_object0
roi多维矩阵类 
j整数型 
cap.打开 (“E:\新建文件夹\\缺陷检测代码素材\1.mp4”, 0, )
如果真 (cap.已打开 ())
视觉_控制台输出 (“打开视频文件失败.”)
返回 (-1)
判断循环首 (cap. (img))
视觉_颜色空间转换 (img, grayImage, #颜色_BGR转GRAY, 0)  ' //灰度处理
视觉_阈值 (grayImage, binImage, 128, 255, #阈值_二进制 )
视觉_查找轮廓 (binImage, ontours, , #检测_外部, #逼近_任何, )
Contours = 矩阵 (grayImage.尺寸2i (), , #八位无符号整数_单通道, 0)  ' //绘制
计次循环首 (ontours.尺寸 (), i)
area = 视觉_轮廓面积 (ontours.取点2i类数组 (i - 1), )
如果真 (area > 18000)
M = 视觉_计算矩 (ontours.取点2i类数组 (i - 1), , )  ' //计算矩
center_x = M.m10 () ÷ M.m00 ()
center_y = M.m01 () ÷ M.m00 ()
rect = 视觉_最大轮廓矩形 (ontours.取点2i类数组 (i - 1))
isNew = 真
如果真 (center_x > 100)
计次循环首 (取数组成员数 (product), i)
h = 取绝对值 (center_x - product [i].cx)
v = 取绝对值 (center_y - product [i].cy)
如果真 (h < 25 v < 25)
isNew = 假
' //说明不是新的,那就要更新一下
product [i].cx = center_x
product [i].cy = center_y
product [i].rect = rect

计次循环尾 ()
如果真 (isNew)
p.cx = center_x
p.cy = center_y
p.rect = rect
idx = idx + 1
p.index = idx
加入成员 (product, p)



计次循环尾 ()
' //单张图片计算完毕后,再次循环遍历每一帧图像中
计次循环首 (取数组成员数 (product), i)
如果真 (product [i].cx > 600)
到循环尾 ()
roi = img.感兴区域 (product [i].rect, )
defect_detect (roi, objs)
视觉_矩形 (img, product [i].rect, 标量 (0, 255, 0), 1, 8, 0)
视觉_放置文本 (img, 到文本 (product [i].index), 点2i (product [i].rect.左边, product [i].rect.顶边), #字体_衬线_简单, 1, 标量 (255, 255, 0), 1, 8, )
计次循环首 (取数组成员数 (objs), j)
objs [j].rect.左边 = objs [j].rect.左边 + product [i].rect.左边
objs [j].rect.顶边 = objs [j].rect.顶边 + product [i].rect.顶边
视觉_矩形 (img, objs [j].rect, 标量 (0, 0, 255), 1, 8, 0)  ' //绘制缺陷的外框
如果真 (objs [j].type = 1)
' 刮伤
视觉_放置文本 (img, “scratch”, 点2i (objs [j].rect.左边, objs [j].rect.顶边), #字体_衬线_简单, 0.5, 标量 (255, 255, 0), 1, 8, )
如果真 (objs [j].type = 2)
' 斑点
视觉_放置文本 (img, “blot”, 点2i (objs [j].rect.左边, objs [j].rect.顶边), #字体_衬线_简单, 0.5, 标量 (255, 255, 0), 1, 8, )

计次循环尾 ()
计次循环尾 ()
视觉_显示图像 (“小白鼠”, img)
视觉_等待按键 (30)
判断循环尾 ()
返回 (0)  ' 可以根据您的需要返回任意数值
子程序名返回值类型公开备 注
defect_detect 检测函数
参数名类 型参考可空数组备 注
roi多维矩阵类
objjdefect_object
变量名类 型静态数组备 注
objdefect_object0
grayImage多维矩阵类 
binImage多维矩阵类 
contours多维数组点2i类 
i整数型 
area双精度小数型 
rect矩形2i类 
defect_roi多维矩阵类 
threImage多维矩阵类 
contours_defect多维数组点2i类 
mask多维矩阵类 
result多维矩阵类 
hist多维矩阵类 
ranges小数型2
h整数型 
hh双精度小数型256
sum双精度小数型 
hist_sum_scratch双精度小数型 
hist_sum_blot双精度小数型 
type整数型 
infodefect_object 
视觉_颜色空间转换 (roi, grayImage, #颜色_BGR转GRAY, 0)  ' //灰度处理
视觉_阈值 (grayImage, binImage, 128, 255, #阈值_二进制 )  ' //二值化处理
' //检测出roi内所有轮廓
视觉_查找轮廓 (binImage, contours, , #检测_树, #逼近_任何, )
计次循环首 (contours.尺寸 (), i)
area = 视觉_轮廓面积 (contours.取点2i类数组 (i - 1), )
如果真 (area > 100 area < 15000)
rect = 视觉_最大轮廓矩形 (contours.取点2i类数组 (i - 1))
defect_roi = roi.感兴区域 (rect, )
' 开始分析缺陷属性
视觉_颜色空间转换 (defect_roi, grayImage, #颜色_BGR转GRAY, 0)  ' //灰度处理
视觉_阈值 (grayImage, threImage, 128, 255, #阈值_二进制_取反 )  ' //二值化处理
视觉_查找轮廓 (threImage, contours_defect, , #检测_外部, #逼近_任何, )
mask = 矩阵 (grayImage.尺寸2i (), , #八位无符号整数_单通道, 0)
视觉_填充多边形 (mask, contours_defect, , , 标量 (255, 255, 255), 8, 0, )
视觉_按位_与 (grayImage, mask, result, )
' //计算灰度直方图
ranges [1] = 0
ranges [2] = 255
视觉_计算直方图 (result, 0, , hist, 256, ranges, 真, )
h = hist.数据指针 ()
计次循环首 (256, i)
hh [i]指针到小数 (h)
h = h + 4
sum = sum + hh [i]
计次循环尾 ()
变量循环首 (90, 135, 1, i)
hist_sum_scratch = hist_sum_scratch + hh [i]
变量循环尾 ()
hist_sum_scratch = hist_sum_scratch ÷ sum
变量循环首 (15, 90, 1, i)
hist_sum_blot = hist_sum_blot + hh [i]
变量循环尾 ()
hist_sum_blot = hist_sum_blot ÷ sum
type = 0
如果真 (hist_sum_scratch > 0.1)
type = 1
如果真 (hist_sum_blot > 0.3)
type = 2

info.type = type
info.rect = rect
加入成员 (obj, info)

计次循环尾 ()
objj = obj


i支持库列表   支持库注释   
OpenCV(未知支持库)



您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表