轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。
在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测。在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点。
cv2.findContours函数
Python版示例如下,也可以参考【OpenCV-Python教程(11、轮廓检测)】【Contours : Getting Started】
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
1. 完整例子
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
2. 参数解释
这里的findContours
函数,有三个参数
- thresh -> 要寻找轮廓的图片,注意这里的轮廓会直接改变在thresh上,记得备份
- cv2.RETR_TREE -> 表示轮廓检索模式(Contour retrieval mode)为,检索所有的轮廓,且重组为一个有层次的嵌套轮廓。层次信息返回在hierarchy中。
- cv2.CHAIN_APPROX_SIMPLE -> 表示轮廓近似方法(Contour approximation method)。SIMPLE可以这样理解,假如一个矩形有1000个点,但是现在只用四个角的点表示就行了,即去掉冗余信息。
返回值也有两个,contours
和 hierarchy
对contours的理解如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
对 hierarchy 的深究,可以参考这里:【Contours Hierarchy】
轮廓特征(Contour Features)
查找到轮廓以后,我们可以得出轮廓的一些特征信息,也可以在轮廓上做一些简单的操作,参考Python教程:【Contour Features】
1. 面积和周长示例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2. 轮廓近似
轮廓近似(Contour Approximation),要理解概念,先来看下面的三张图。第一张是找到的轮廓;第二张近似的幅度很大,忽略了很多的细节;第三细节多一点.
OpenCV中是用 cv2.approxPolyDP()函数来进行轮廓的近似的。见代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
同理,第三张可以用1%的精确度来得到。
3. 计算凸包
涉及凸多面体和凹多面体的概念,不多解释。如下图,本来是一个手掌的形状,现在用最小的凸多面体把它包起来。其中,凸进去(Bulge Inside)的部分,称为凸包缺陷(Convexity Defects),即箭头处,即偏导的局部最大值处。
函数调用,以后用到再来细究吧!
- 1
- 2
- 1
- 2
4. 矩形边框
矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来。还有一个带旋转的矩形,面积会更小,效果见下图
上代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
PS:其他的形状,如 封闭的圆形
,椭圆
,直线
等,例子见这里【Contour Features】,原理差不多,不再赘述。