2022-07-11 19:34:20 索炜达电子 1182
文件编号:A5
文件大小:8M
开发环境:Python3.8、OpenCV4.6、Pycharm2020
猿创承诺:该项目亲测正常运行,需远程调试部署需另外收费,确保正常使用,不能正常使用全额退款。
简要概述:基于Python+OpenCV瓶口缺陷检测
主要任务:判断瓶口是否完好,寻找瓶口缺陷部分,并将其框出(以下图为例进行演示)(包含程序部分代码)
解决步骤:
-通过Hough圆检测,获取瓶口外侧圆,确定圆的位置和尺寸,对瓶口部分进行极坐标变化和极坐标反变换,消除瓶口外侧区域的干扰。
-对之后的图像进行处理,提取缺陷部分进行轮廓绘制和缺陷判别。
1、导入功能包,读取图像
2、Hough圆检测获取瓶口位置和大小
为了防止误判,对圆半径进行限制,保证获得瓶口最外侧的轮廓./bottle_create.py 对框中瓶子进行检查
****************************************************************************************************
'''hough圆变换'''
cimg = cv2.cvtColor(bottle,cv2.COLOR_GRAY2BGR) # 转换成彩色图
circles = cv2.HoughCircles(median,cv2.HOUGH_GRADIENT,1,100,
param1=100,param2=60,minRadius=150,maxRadius=160) # Hough圆检测
circles = np.uint16(np.around(circles))
#print(circles)
for i in circles[0,:]: # 遍历circles,i为列表,i中包含多个列表,列表为[x,y,r]圆心坐标和半径
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
#cv_show( 'cimg',cimg)
****************************************************************************************************
3、极坐标变化与反变换
为了消除瓶口外侧部分带来的干扰。进行极坐标变换,将极坐标中心设为圆心,极半径为圆半径;进行反变化,将瓶口放在原图大小的原位置
****************************************************************************************************
'''极坐标变换'''
polarImg = cv2.warpPolar(bottle,(300,900),center,radius,
cv2.INTER_LINEAR + cv2.WARP_POLAR_LINEAR)
#cv_show('polarImg',polarImg)
'''反变换'''
b_bottle=cv2.warpPolar(polarImg,psp, center,radius,
cv2.INTER_LINEAR + cv2.WARP_POLAR_LINEAR + cv2.WARP_INVERSE_MAP)
#cv_show('b_bottle',b_bottle)
****************************************************************************************************
4、图像处理
通过均值滤波消除干扰,阈值变换检测瓶口的亮点,由于出现小白点的干扰,进行开运算处理,再进行膨胀,将缺陷区域联通
5、轮廓检测和缺陷判断
寻找上图的外接轮廓,遍历这些轮廓,判断是否在瓶口处,并将其在原图上画出;将缺陷记录,判断存在缺陷,在图片上显示NOT OK
****************************************************************************************************
'''找缺陷'''
contours,hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) #寻找轮廓
s_bottle=cv2.cvtColor(bottle, cv2.COLOR_GRAY2BGR)
counts=[]
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt) #获取轮廓位置大小
# print(x, y, w, h)
if x>circles_x1 and x<circles_x2 and y>circles_y1 and y<circles_y2 and (w>5 or h>5): # 判断轮廓是否在瓶口处
cv2.drawContours(s_bottle,cnt,-1,(0,0,255),2) # 绘制轮廓
counts.append(cnt) # 记录缺陷
****************************************************************************************************
以上就是瓶口缺陷检测的全部过程,其中还有不足,还达不到100%的成功
放上原图和最后做完的效果
按需写作:
演示视频:
点击查看:系统演示视频
运行效果:
源代码
./bottle_create.py 对框中瓶子进行检查
./bottle_mouth.py 对瓶口缺陷进行检测
源文件
./bottles 检测的原图像
./bottle 检测完的图像
远程协助:
温馨提示:索炜达.猿创官方提供收费远程协助,确保您项目运行成功。
点击查看:远程协助相关事项
我们提供完整项目文件清单如下:
文件目录
├ 1.项目源码
├ 2.运行截图
└ 3.演示视频