官网参见https://docs.opencv.org/3.4.1/d4/d73/tutorial_py_contours_begin.html
轮廓 可以解释为连接着所有沿着边界连接点的曲线,这些连接点具有相同的颜色和强度。轮廓在形状分析,目标检测和识别中很有用。
findContours()函数如下,使用参见https://mp.csdn.net/mdeditor/93378329#
image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])
opencv中轮廓绘制使用的是cv.drawContours()函数,它可以根据你提供的边界点绘制任何形状。
image = cv.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])
关于cv.drawContours()函数的使用参见使用参见https://mp.csdn.net/mdeditor/93378329#。
例1,绘制图像中的所有轮廓。-1,表示所有的轮廓将会被绘制。
cv.drawContours(img, contours, -1, (0,255,0), 3)
例2,绘制图像中第4个轮廓
cv.drawContours(img, contours, 3, (0,255,0), 3)
例3,另一种方法绘制图像中的第4个轮廓
cnt = contours[4]
cv.drawContours(img, [cnt], 0, (0,255,0), 3)
注意:例2和例3的结果是一样的。不过后面会介绍,例3方法更加有用。
cv.findContours()函数第三个参数method,轮廓近似方法,这是什么含义呢?
我们已经说过边界是具有相同灰度值的形状的边界。它会保存边界的(x,y)坐标。但是它会保存所有坐标吗?这就是由轮廓近似方法,也就是cv.findContours()函数第三个参数,来指定的。
method设置为cv.CHAIN_APPROX_NONE表示保存所有坐标点。但是我们真的需要保存所有坐标点吗?例如:你需要发现直线的轮廓,那显然不要保存直线上所有的坐标点,只需要这条直线的2个端点就可以了。这就是cv.CHAIN_APPROX_SIMPLE做的,它会去除所有冗余坐标点,压缩轮廓,节省内存。
下图中的矩形说明了这个技术。
轮廓列表中每个坐标都画一个蓝色圆圈。左边图使用了cv.CHAIN_APPROX_NONE ,734个坐标点。右边图使用了cv.CHAIN_APPROX_SIMPLE,4个坐标点。可以节省很多内存。