目录:
- 轮廓常用函数
- 第一个应用
- 第二个应用
轮廓就是连接所有连续点(沿着边界)的曲线,具有相同的颜色或灰度值。轮廓是形状分析、物体检测和识别的有用工具。为了提高提取轮廓的精确度,需要先通过阈值处理或canny边缘检测将图像转换为二值图像。
在 OpenCV 中,寻找轮廓就像从黑色背景中寻找白色物体,所以要找到的物体应该是白色的,背景应该是黑色的。
只罗列和轮廓相关的几个函数没啥意思,通过两个例子可以对其用法有更深入的理解。
一、轮廓常用函数
1、查找轮廓
在二值图像中获取轮廓:
import cv2
im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.findContours() 函数中有三个参数:
thresh
:源图像cv2.RETR_TREE
:表示轮廓检索模式cv2.CHAIN_APPROX_SIMPLE
:表示轮廓近似方法
返回值为获取到的轮廓 contours
和hierarchy
。contours
为包含图像中所有轮廓的python列表(三维数组),每个轮廓是包含边界所有坐标点(x, y)的Numpy数组。hierarchy
是一个三维数组,它储存了所有等高线(轮廓)的层级结构,详情可以查看 1 和 2。
轮廓是具有相同灰度值的形状的边界,即一个轮廓可以看做是一个等高线。它存储形状边界的(x, y)坐标。我们可以使用第三个参数来指定是否存储形状边界的所有坐标点。
第二个参数决定 hierarchy 采取什么样的格式输出。第三个参数可以指定两个值,如果是 cv2.CHAIN_APPROX_NONE,则存储形状边界的所有坐标点。但有时我们不需要所有的点,比如一个矩形的轮廓,我们只需要矩形的四个端点就可以了。这时我们就可以传入 cv2.CHAIN_APPROX_SIMPLE,它会移除所有冗余的点并压缩轮廓,从而节省内存。
比如下面这个例子,我们标记出矩形所有轮廓点,第一张图片是使用 cv2.CHAIN_APPROX_NONE 得到的结果,一共有734个点;第二张图片是使用 cv2.CHAIN_APPROX_SIMPLE 得到的结果,只有4个点。
![cd7ed49e52befd8654bf04daf6d96520.png](https://img-blog.csdnimg.cn/img_convert/cd7ed49e52befd8654bf04daf6d96520.png)
2、绘制轮廓
可以使用 cv2.drawContours() 函数来绘制轮廓,只要有轮廓的边界点,就可以用来绘制任何形状的轮廓。
下面是绘制轮廓的三个例子:
# To draw all the contours in an image:
cv2.drawContours(img, contours, -1, (0,255,0), 3)
# To draw an individual contour, say 4th contour: