【问题标题】:OpenCV findcontours returns 2 contours for each circleOpenCV findcontours 为每个圆返回 2 个轮廓
【发布时间】:2012-07-03 09:31:27
【问题描述】:

我正在尝试在下图中的 OpenCV 中使用 findcontours() 函数。

findContours(img, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, cvPoint(0,0) );

当我执行此查询时:contours.size() 它返回 18,因此每个圆似乎有 2 个轮廓。圆圈是你可以看到的 1 像素厚,它是 2 个轮廓吗?一个用于外部,一个用于内部,如果是这样,我如何强制此功能仅检测每个圆的一个轮廓?我认为轮廓被定义为像素的连接序列,1 像素厚。

【问题讨论】:

    标签: c++ image-processing opencv computer-vision


    【解决方案1】:

    我无法确认这一点,但我认为这个函数使用的算法相当于计算每个函数的梯度。这意味着将在外边缘找到一个轮廓,在内边缘找到一个轮廓,就像您建议的那样。 为了确认这一点,您可以尝试使用圆圈填充白色的输入图像(消除内部轮廓)

    您还可以在 findContours 函数上使用不同的参数进行测试

    例如,尝试使用 CV_RETR_EXTERNAL 而不是 CV_RETR_TREE 我假设内圈嵌套在外圈内,所以这应该迫使它只返回外圈

    【讨论】:

    • 但是当我看这个例子here时,它似乎没有分别计算内部和外部。但是这里的例子是 findcontours 的 C 版本。新旧实现有区别吗?
    • 不,C 和 C++ 版本之间不应该有任何会影响最终结果的差异。事实上,据我所知,一个只是另一个的包装。但是,查看该链接中的图像,我看到的与您所说的完全相反。它似乎在检测每个圆的内部和外部轮廓,这在显示的图像上更有意义
    • 确实,使用 CV_RETR_EXTERNAL 标志应该可以为您修复它。有关标志的完整列表,请参见此处:opencv.itseez.com/modules/imgproc/doc/… findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset)
    • 但是 CV_RETR_EXTERNAL 的问题在于它不会为您创建层次结构树,而这正是我在这个应用程序中真正需要的。我需要知道哪些轮廓包含在哪些轮廓中。在上面显示的这个例子中,所有的轮廓都是没有任何孔的。
    【解决方案2】:

    你可能已经知道了,但是......

    findContours 只关注白色物体,因此将每个空心圆识别为一条带,从而产生两个轮廓。

    最好的方法是创建另一个带有实心圆圈的图像,并为该图像应用 findContoours。它会给你你想要的。

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      相关资源
      最近更新 更多