gpt4 book ai didi

opencv - OpenCV findContour方法返回 “doubled”轮廓

转载 作者:行者123 更新时间:2023-12-02 16:56:19 26 4
gpt4 key购买 nike

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

一个示例图像如下所示:

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是否可以解决此问题?
  • 最佳答案

    问:加倍轮廓后是什么原因?为什么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确实可以解决此问题,因为它会“绝对存储所有轮廓点”,但是如果您喜欢使用任何其他方法,也可以求和这些点之间的所有距离。

    关于opencv - OpenCV findContour方法返回 “doubled”轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32128322/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com