2019-7-23 opencv图像处理9-轮廓1(Contours)概述/绘制/近似方法

1.概述

官网参见https://docs.opencv.org/3.4.1/d4/d73/tutorial_py_contours_begin.html

轮廓 可以解释为连接着所有沿着边界连接点的曲线,这些连接点具有相同的颜色和强度。轮廓在形状分析,目标检测和识别中很有用。

  • 为了更加准确,应该使用二进制图像。在发现轮廓之前,要进行阈值处理和Canny边界检测。
  • 从opencv3.2开始,findContours()不再修改原图像,它会返回3个值,第1值是修改后的图像。
  • 在opencv中,查找轮廓就像在黑色背景中找白色物体。请记住,要找的物体应该是白色的,而背景应该是黑色的。

findContours()函数如下,使用参见https://mp.csdn.net/mdeditor/93378329#

image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

2.轮廓绘制

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方法更加有用。

3.轮廓近似方法(Contour Approximation Method)

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个坐标点。可以节省很多内存。
2019-7-23 opencv图像处理9-轮廓1(Contours)概述/绘制/近似方法_第1张图片

你可能感兴趣的:(IT,opencv)