opencv图像识别轮廓提取,python提取图像轮廓
前几天在给机械臂的井架做象棋综合设计。机械臂装置是我直接在网上买的(含机械臂,相机,草莓派,1600元),但是机械臂不算太高级,精度很低。源代码提供了红、绿、蓝三种颜色方块的识别和抓取。
经过多次尝试,最终德里克棋子也决定采用3cm * 3cm * 3cm颜色的正方形。今天先写几个步骤吧。第一步是解决识别彩色方块的问题。
用渲染的手移动长方体,使外轮廓始终适合长方体的边缘。
在你的笔记本电脑上安装一个摄像头来捕捉图片并识别绿色方块。
import c v2 importnumpyasnpball _ color= green color _ dist={ red :{ lower 3360 NP . array }[0,60,60,60,60 upper 3360 NP.array ([ 90,255,25]),} cap=cv2 . video capture(0)0)cv2 . named window)、cv2 . www frame=cap . read(ifret:ifframesnonone 360 0 0 0)# pgddyx blurs color _ dist[ball _ color][ upper ]CNTs=cv2 . find contours(in cv2 . chain _ approx _ simple(-2)c=max key=cv2 . contourarea)rect=cv2 . minarerect(c)c)box=cv2[NP . int 0(box)]、-1 、( 0,255,255,255)2)ccox frame)cv2 . waitKey(1)else 3360 print)、wait key))、165) 释放(cv2 . waitkey)0)cv2 . destroyate
为了在python中读取相机图像,[Python OpenCV]捕获笔记本电脑和外部相机。
1 读取图像
Ball _ color= green color _ dist={ red :{ lower :NP . array([0,60,60])upper :NP)upper :NP . array([90,255,255]),},}但是,如果要识别红色或蓝色,可以直接将ball _ color= green 改为ball_color=red 或ball_color=blue 。这里的color_dist包含了HSV模式下的颜色范围,后面会解释。
2 颜色定义
GS _ frame=cv2 . Gaussian blur(frame,(5,5),0) # pgddyx fuzzy hsv=cv2.cvtColor)。
Gs_frame,cv2。COLOR_BGR2HSV) #转换成HSV图像erode _ HSV=cv2。erode (HSV,none,iterations=2) #腐蚀粗和细inrange _ HSV=cv2。inrange (erode _ HSV,color _ dist[ball _ color][ Lower ],color _ dist[ball _ color][ Upper ])第一步,pgddyx模糊
原始图像是模糊的,以便于颜色提取。
Gs _ frame=cv2 .高斯模糊(frame,(5,5),0),其中
参数1:帧需要pgddyx模糊图像。
参数2: (5,PGDDYX矩阵的长和宽都是5。
参数三:0标准差为0。
未处理的原图如下(这个相机辣到原图看起来很模糊):
pgddyx的模糊图像(仔细看,你会发现比之前的更模糊)第二步,BGR转换为HSV
刚刚被pgddyx模糊的图像的颜色模式从BGR转换到HSV(不使用OpenCV中的RGB模式,而是使用BGR模式)。为什么使用HSV模式?因为这种模式更便于单色提取,具体原理我也不清楚。
hsv=cv2.cvtColor(gs_frame,cv2。COLOR_BGR2HSV)
参数1:GS _ frame的原始图像
参数二:cv2。COLOR_BGR2HSV颜色转换模式,从BGR到HSV
HSV模式下的图像:第三步,腐蚀
一般来说,图像被细化以去除噪声点。
erode_hsv=cv2.erode(hsv,None,iterations=2)
参数1: hsv原始图像
参数3:迭代次数=2腐蚀宽度
可以看到干扰少了很多(紫点少了很多)。第四步,去除背景部分
去掉除绿色以外的其他部分,将图像转换成二值图像。
in range _ HSV=cv2 . in range(erode _ HSV,color _ dist[ball _ color][ Lower ],color _ dist[ball _ color][ Upper ])
参数erode _ hsv的原始图像
参数2:color _ dist[ball _ color][ lower ]的下限。
参数3:color _ dist[ball _ color][ upper ]的上限。
如图4 绘制矩形边框所示
CNTs=cv2 . find contours(in range _ HSV . copy(),cv2。RETR _外部,cv2。CHAIN _ APPROX _ SIMPLE)[-2]c=max(CNTs,key=cv2 . contourarea)rect=cv2 . minarerect(c)box=cv2 . box points(rect)cv2 . draw contours(frame,[np.int0(box)],-1,(0,255,255),2)第一步,找出外边界
CNTs=cv2 . find contours(in range _ HSV . copy(),cv2。RETR _外部,cv2。CHAIN_APPROX_SIMPLE)[-2]
使用此函数找到盒子的外部边界,并将其存储在cnts中。
查找等高线参考资料
第二步,找出矩形
找到边界中面积最大的区域,选择这个区域作为正方形所在的区域,画出这个区域的最小外接矩形,记录下这个矩形的位置坐标。
C=max(cnts,key=cv2.contourArea)来查找边界中的最大区域。
绘制该区域的最小外接矩形。
Box=cv2.boxPoints(rect)记录矩形四个点的位置坐标。
第三步,绘制矩形
在原始图像上绘制矩形边界。
cv2.drawContours(frame,[np.int0(box)],-1,(0,255,255),2)
参数1:帧目标图像
参数二:[np.int0(box)]大纲本身就是Python中的一个列表。
参数三:-1指定绘制轮廓列表中的哪条轮廓,如果为-1,则绘制所有轮廓。
参数四:(0,255,255)轮廓颜色BGR
参数5: 2轮廓宽度
最终结果如图所示。
文章的第一个图像是笔记本内置的摄像头拍摄的图像;
为了方便捕捉图像,代码解析过程中的图像都是外置usb摄像头,像素太低。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。