1 什么是轮廓
轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。轮廓在形状分析和物体的检测和识别中很有用。
为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理 或者 Canny 边界检测。
查找轮廓的函数会修改原始图像。如果你在找到轮廓之后还想使用原始图 像的话,你应该将原始图像存储到其他变量中。
在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住, 要找的物体应该是白色而背景应该是黑色。
让我们看看如何在一个二值图像中查找轮廓:
cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
@param image Source, an 8-bit single-channel image.
@param contours Detected contours. Each contour is stored as a vector of points.
@param hierarchy Optional output vector
@param mode Contour retrieval mode, see #RetrievalModes
@param method Contour approximation method, see #ContourApproximationModes
@param offset Optional offset by which every contour point is shifted.
- image:输入图像,单通道,可以是灰度图,但更常用二值图
- mode:定义轮廓的检索模式,共四种,可参考https://blog.csdn.net/yukinoai/article/details/87900420
RETR_EXTERNAL:只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立, 没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓, 所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1
RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层, 若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层。 两个等级关系:顶层为连通域的外围边界,次层为孔的内层边界。
RETR_TREE:检测所有轮廓,所有轮廓建立一个等级树结构。 外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
- method:定义轮廓的近似方法
method如果被设置为 cv2.CHAIN_APPROX_NONE,所有的边界点都会被存储。但是我们真的需要这么多点吗?例如,