robomaster视觉入门-寻找装甲板上的灯条
上一节讲了如何对摄像头捕捉的每一帧图片进行处理,得到二值化后形状适合的灯条,但总会留下一些无法避免的轮廓干扰,这里将详细介绍如何在众多轮廓中筛选出我们需要寻找的灯条。
一.调用findContours查找函数轮廓
下面使用的函数如findContours、drawContours、minAreaRect、contourArea用法详见此处
import cv2
import numpy as np
img = cv2.imread('xxx.jpg') #此处用本地图片替代摄像头捕捉的照片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #findContours只能检测二值化后的图片
contours,Hierarchy = cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
print (type(contours))
print (type(contours[0]))
>>> <class 'list'> # 第一个返回值类型为list
<class 'numpy.ndarray'> # list 的中的每个元素是numpy中的ndarray
其中,第一个参数返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray(数组)表示;
第二个参数可反映各轮廓之间的的轮廓建立等级关系,一般用于大风车装甲板识别,这里基本用不上。
二.遍历所有轮廓
变量与for循环结合遍历所有轮廓,再将所有识别到的轮廓在原图中绘出,可以看见,除了我们需要寻找的灯条以外,还含有其他轮廓,为避免其他轮廓干扰,我们使用minAreaRect函数和contourArea函数得到所有轮廓最小外接矩形的一系列信息,并通过其他最小外接矩形的几何性质,筛选出装甲板上的灯条。
for cnt in range(contours[cnt]):
cv2.drawContours(frame, contours[cnt],-1,(255,0,0),3) #画出灯条轮廓
三.筛选出装甲板上的灯条
-
使用minAreaRect函数得到最小外接矩形的中心坐标、长、宽、旋转角度
rect = cv2.minAreaRect(cnt) print("中心坐标:", rect[0]) print("宽度:", rect[1][0]) print("长度:", rect[1][1]) print("旋转角度:", rect[2]) >>> 中心坐标: ( x , y ) 宽度: width 长度: heith 旋转角度: θ
-
使用contourArea函数得到最小外接矩形的面积
area = cv2.contourArea(contours[cnt])
print("面积:", rect[0])
>>> 面积:area
接着,通过对轮廓面积大小、长宽比等一系列几何性质,筛选出装甲板上的灯条,具体算法出处不做赘述。