OpenCV findContour方法返回"加倍"轮廓

时间:2015-08-20 21:01:14

标签: opencv opencv-contour

我有一些非常简单的图像,我想从中提取最长的轮廓。

示例图像就像这样:

example image for contour finding

我正在使用OpenCV教程页面中的确切same sample code。使用一个差分我将阈值设置为固定数,即100。

主线是这一行:

cv::findContours(cannyOutput, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));

在我调用上面的函数后,我遍历找到的轮廓并检查哪一个是最长的,然后我保存最长的一个。在最长的时候,我的意思是哪一个得分最高。

在某些情况下,与上面的示例图像一样,最长轮廓加倍。为了让我更明白我的意思是"加倍"这是找到的轮廓的可视化图像:

enter image description here

所以我试图通过尝试理解OpenCV docs of findContour来弄清楚为什么会这样,但我仍然无法理解真正的原因。

我想要实现的目标,如果我从CV_RETR_TREE改为CV_RETR_EXTERNAL,我就不会得到加倍的轮廓。

所以我的问题是:

  • 加倍轮廓背后的原因是什么?为什么CV_RETR_EXTERNAL解决问题?
  • 获得积分最多的轮廓并不一定意味着它是最长的,对吧?由于CV_CHAIN_APPROX_SIMPLE标志。例如,CV_CHAIN_APPROX_NONE会解决此问题吗?

1 个答案:

答案 0 :(得分:2)

问:加倍轮廓背后的原因是什么?为什么CV_RETR_EXTERNAL解决问题?

答:OpenCV findCountours标准模式是CV_RETR_LIST,它输出一条线,如你的情况,内部和外部轮廓。如文档中所述,CV_RETR_EXTERNAL将仅输出"极端外轮廓"。请注意,外轮廓并不意味着最长的轮廓。我建议你循环遍历CV_RETR_LIST模式给出的所有轮廓并进行计算。

问:获得积分最多的轮廓并不一定意味着它是最长的,对吧?由于CV_CHAIN_APPROX_SIMPLE标志。例如,CV_CHAIN_APPROX_NONE会解决此问题吗?

答:如果您的findCountours方法与CV_CHAIN_APPROX_NONE不同,则第一个问题是正确的。 CV_CHAIN_APPROX_NONE解决这个问题也是正确的,因为它会存储绝对所有的轮廓点,但是如果您更喜欢使用任何其他方法,也可以将点之间的所有距离求和。