1.查找,绘制轮廓
opencv里查找轮廓需要四步:
(1)使用cv2.cvtColor将图形颜色通道转到灰度空间。
(2)使用cv2.Threshold将图形二值化
(3)使用cv2.findContours查找到图形的轮廓
(4)使用cv2.drawContours画出找到的轮廓
对于第三,第四步的两个新函数,其格式如下:
cv2.findContours( src , 查找方式,近似方法), 关于查找方式待会再将,对于近似方法这个参数,可以是cv2.CHAIN_APPROX_SIMPLE,cv2.CHAIN_APPROX_NONE,他们的区别在于:
Cv2.CHAIN_APPROX_SIMPLE会返回所有轮廓的点,但cv2.CHAIN_APPROX_NONE只返回必要的几个点,毕竟两个点就能确定一条直线,从而节省内存。
Cv2.findContours会返回三个结果 image ,contours ,hier。
image就是查找轮廓的原图形,
contours是查找到的轮廓点的坐标,这是一个数组,
hier是查找到的轮廓的层级结构,这个待会和查找方式一起讲。
Cv2.drawcontours( src , 轮廓坐标 ,轮廓层级 ,轮廓颜色,轮廓厚度),关于这个函数,轮廓坐标就是上面函数所返回的结果里的contours,轮廓层级就是指画出第几层轮廓,轮廓颜色一般是一个RGB格式的元组。
例子:
img = cv2.imread("contour_2.png",1)
img_gary=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换颜色空间
ret, thresh = cv2.threshold(img_gary,127,255,0)#二值化
image ,contours ,hier =cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#查找轮廓
img = cv2.drawContours(img ,contours, -1 , (0,0,255), 3)#画出轮廓
屏幕剪辑的捕获时间: 2018/4/15 19:38
2.轮廓层级
关于轮廓层级,一幅图像里可能有多个图形出现,这些图形可能相互嵌套,也可能相互独立,所以这些图形的轮廓会构成层级,如下图所示:
屏幕剪辑的捕获时间:2018/4/15 20:03
可以看出,该图像里存在多个轮廓,所以在查找轮廓时,需要给出参数说明怎么样去查找,然后在画出轮廓的时候,也要说明画第几层轮廓。所以:
在cv2.findContours函数的查找方式这个参数里,我们需要设定查找方式,
一般可选参数有:
Cv2.RETR_LIST:将所有轮廓都放在一起,按一个层级去处理
Cv2.RETR_EXTERNAL:只查找最外面的层级
Cv2.RETR_TREE:最详细的查找方法,函数返回的层级结构里包含所有层级的相互关系
在cv2.drawContours函数里的轮廓层级里,如果全部轮廓都画出来,则设置为-1,反之设置成对应的轮廓层级
例如,下面是只画第2层的结果:
img = cv2.drawContours(img ,contours, 2 , (0,0,255), 2)
屏幕剪辑的捕获时间: 2018/4/15 20:12
注:cv2.findContours返回的hier结构如下:
[[[ 6 -1 1 -1]
[-1 -1 2 0]
[-1 -1 3 1]
[-1 -1 4 2]
[ 5 -1 -1 3]
[-1 4 -1 3]
[-1 0 -1 -1]]]
每层分别是代表从第0到第6层的相互关系,其具体格式是:[Next, Previous ,First_Child, Parents]
Next表示同一级的下一个轮廓
Previous代表同一级的上一个轮廓
First_Child代表下一级的第一个子轮廓
Parents代表上一级的父轮廓