OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
无匹配项
轮廓:入门

下一个教程: 轮廓特征

目标

什么是轮廓?

轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,这些点具有相同的颜色或强度。轮廓是用于形状分析和物体检测与识别的有用工具。

  • 为了获得更高的精度,请使用二值图像。因此,在查找轮廓之前,请应用阈值或 Canny 边缘检测。
  • 从 OpenCV 3.2 开始,此函数不会修改源图像。
  • 在 OpenCV 中,查找轮廓就像从黑色背景中查找白色物体一样。因此,请记住,要查找的物体应该是白色的,背景应该是黑色的。

如何绘制轮廓?

要绘制轮廓,可以使用 cv.drawContours 函数。如果您拥有其边界点,它也可以用于绘制任何形状。

我们使用以下函数:cv.findContours (image, contours, hierarchy, mode, method, offset = new cv.Point(0, 0))

参数
image源,一个 8 位单通道图像。非零像素被视为 1。零像素保持为 0,因此图像被视为二值图像。
contours检测到的轮廓。
hierarchy包含有关图像拓扑的信息。它具有与轮廓数量一样多的元素。
mode轮廓检索模式(参见 cv.RetrievalModes)。
method轮廓逼近方法(参见 cv.ContourApproximationModes)。
offset每个轮廓点移动的可选偏移量。如果轮廓是从图像 ROI 中提取的,然后应该在整个图像上下文中分析它们,这将非常有用。

cv.drawContours (image, contours, contourIdx, color, thickness = 1, lineType = cv.LINE_8, hierarchy = new cv.Mat(), maxLevel = INT_MAX, offset = new cv.Point(0, 0))

参数
image目标图像。
contours所有输入轮廓。
contourIdx指示要绘制的轮廓的参数。如果它是负数,则绘制所有轮廓。
color轮廓的颜色。
thickness绘制轮廓的线条粗细。如果它是负数,则绘制轮廓内部。
lineType线条连通性(参见 cv.LineTypes)。
hierarchy有关层次结构的可选信息。只有当您只想绘制某些轮廓(参见 maxLevel)时,才需要它。
maxLevel绘制轮廓的最大级别。如果为 0,则仅绘制指定的轮廓。如果为 1,则函数绘制轮廓和所有嵌套轮廓。如果为 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套的轮廓,依此类推。只有在有层次结构可用时,才会考虑此参数。
offset可选轮廓偏移参数。

试一试

轮廓逼近方法

这是 cv.findContours 函数中的第五个参数。它实际上表示什么?

上面我们说过,轮廓是具有相同强度的形状的边界。它存储形状边界的 (x,y) 坐标。但是它是否存储所有坐标?这是由轮廓逼近方法指定的。

如果您传递 cv.ContourApproximationModes.CHAIN_APPROX_NONE.value,则将存储所有边界点。但实际上我们是否需要所有点?例如,您找到了直线的轮廓。您是否需要直线上的所有点来表示该直线?不需要,我们只需要该直线的两个端点。这就是 cv.CHAIN_APPROX_SIMPLE 的作用。它删除所有冗余点并压缩轮廓,从而节省内存。