robomaster视觉入门-寻找装甲板上的灯条

robomaster视觉入门-寻找装甲板上的灯条

  • 一.调用findContours查找函数轮廓
  • 二.遍历所有轮廓
  • 三.筛选出装甲板上的灯条

上一节讲了如何对摄像头捕捉的每一帧图片进行处理,得到二值化后形状适合的灯条,但总会留下一些无法避免的轮廓干扰,这里将详细介绍如何在众多轮廓中筛选出我们需要寻找的灯条。

一.调用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)           #画出灯条轮廓

robomaster视觉入门-寻找装甲板上的灯条_第1张图片

三.筛选出装甲板上的灯条

  • 使用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

接着,通过对轮廓面积大小、长宽比等一系列几何性质,筛选出装甲板上的灯条,具体算法出处不做赘述。

你可能感兴趣的:(RM视觉python,计算机视觉,opencv)