首页 > 编程知识 正文

opencv获取轮廓内所有像素,python图像轮廓识别

时间:2023-05-04 04:53:38 阅读:163494 作者:2555

我前几天在做机械臂的井架将棋的综合设计。 直接在网上购买了机械臂装置(包括机械臂、照相机、草莓派,需要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, 255] )、}cap=cv2.VideoCapture(0)0) cv2.namedwindow )、cv2.www frame=cap.read (if ret : ifframeisnotnonone 360 0 ) # pgddyx模糊HSV cv2.COLOR_BGR2HSV )变换为HSV图像erode_HSV=CV2.erode(HSV,None, iterations=2) #腐蚀粗糙度变细in range _ HSV=cv2.in range color _ dist [ ball _ color ] [ ' lower ' ], color _ dist [ ball _ color ] [ ' upper ' ] CNTs=cv2.find contours (in cv2.chain _ approx _ simple (-2 ) c=max key=cv2.contourArea ) rect=cv2.minAreaRect(c ) c ) box=cv2 [NP.int0(box ) ]、-1、(0,255,255,255 )、2 ) ccox frame ) cv2.waitKey(1)else3360print ) ),waitkey ) ) ),165 ) cap.Release(cv2.waitkey )0) cv2.destroyaste

要用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模糊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.GaussianBlur(frame, (5, 5), 0),其中
参数一:frame需要pgddyx模糊的图像
参数二:(5, 5)pgddyx矩阵的长与宽都是5
参数三:0标准差是0

未经处理的原图像如下(这个摄像头太辣鸡了,原图像看起来就很模糊):

pgddyx模糊后的图像(仔细看一下,你会发现比上一张更模糊些)

第二步,BGR转换为HSV
刚刚pgddyx模糊后的图像的颜色模式从BGR转换为HSV(在OpenCV中不使用RGB模式,而是使用BGR模式)。为什么使用HSV模式呢?因为这种模式更加方便单一颜色的提取,具体原理我也不懂。
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)
参数一:gs_frame原图像
参数二:cv2.COLOR_BGR2HSV颜色转换方式,从BGR to HSV

HSV模式下的图像:

第三步,腐蚀
通俗来说,就是将图像变瘦,用于去除噪声点。
erode_hsv = cv2.erode(hsv, None, iterations=2)
参数一:hsv原图像
参数三:iterations=2腐蚀的宽度

可以看出少了很多干扰(紫色的点点少了很多)。

第四步,去除背景部分
将绿色以外的其他部分去除掉,并将图像转化为二值化图像
inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])
参数一:erode_hsv原图像
参数二:color_dist[ball_color]['Lower']颜色的下限
参数三:color_dist[ball_color]['Upper']颜色的上限

如图

4 绘制矩形边框

cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]c = max(cnts, key=cv2.contourArea)rect = cv2.minAreaRect(c)box = cv2.boxPoints(rect)cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)

第一步,找出外边界
cnts = cv2.findContours(inRange_hsv.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
使用该函数找出方框外边界,并存储在cnts中。
findContours 参考资料

第二步,找出矩形
在边界中找出面积最大的区域,选定该区域为方块所在区域,并绘制出该区域的最小外接矩形,并记录该矩形的位置坐标。
c = max(cnts, key=cv2.contourArea) 在边界中找出面积最大的区域
rect = cv2.minAreaRect(c) 绘制出该区域的最小外接矩形
box = cv2.boxPoints(rect) 记录该矩形四个点的位置坐标

第三步,绘制矩形
在原图像上将分析出的矩形边界绘制出来
cv2.drawContours(frame, [np.int0(box)], -1, (0, 255, 255), 2)
参数一:frame目标图像
参数二:[np.int0(box)]轮廓本身,在Python中是一个list
参数三:-1指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。
参数四:(0, 255, 255)轮廓颜色BGR
参数五:2廓线的宽度
最终结果如图

文章最开始的图像是笔记本内置摄像头拍摄的图像;
为了方便拍摄图像,代码分析过程中的图像是外接usb摄像头,像素太低。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。