首页 文章

OpenCV findContour方法返回“加倍”轮廓

提问于
浏览
0

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

示例图像将是这样的:

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));

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

在某些情况下,与上面的示例图像一样,最长轮廓加倍 . 为了让我更明白我在“加倍”下的含义是找到轮廓的可视化图像:

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 回答

  • 2

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

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

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

    答:如果您的findCountours方法与 CV_CHAIN_APPROX_NONE 不同,则第一个问题是正确的 . CV_CHAIN_APPROX_NONE 也会解决这个问题,因为它会"store absolutely all the contour points",但如果您更喜欢使用任何其他方法,也可以将点之间的所有距离求和 .

相关问题