Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV findContour方法返回;“加倍”;轮廓_Opencv_Opencv Contour - Fatal编程技术网

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

OpenCV findContour方法返回;“加倍”;轮廓,opencv,opencv-contour,Opencv,Opencv Contour,我有一些非常简单的图像,我想从中提取最长的轮廓 示例图像如下所示: cv::findContours(cannyOutput, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0)); 我使用的是OpenCV教程页面中的精确格式。用一个差,我将阈值设置为一个固定的数字,即100 主线是这样的: cv::findContours(cannyOutput, contours, hierarchy, C

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

示例图像如下所示:

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

我使用的是OpenCV教程页面中的精确格式。用一个差,我将阈值设置为一个固定的数字,即100

主线是这样的:

cv::findContours(cannyOutput, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
调用上述函数后,我遍历找到的轮廓,检查哪一个最长,然后保存最长的轮廓。在“最长”下,我指的是哪一个得分最多

在某些情况下,如上面的示例图像中,最长轮廓加倍。为了使其更易于理解,我在“Double”下的意思是,这里是找到的轮廓的可视化图像:

所以我试着自己去弄清楚为什么会发生这样的事情,试图去理解,但是我仍然不能理解真正的原因

我想要实现的是,如果我从CV_RETR_树更改为CV_RETR_EXTERNAL,我就不会得到加倍的轮廓

所以我的问题是:

  • 双重轮廓背后的原因是什么?为什么CV_RETR_EXTERNAL解决了这个问题
  • 得到点最多的轮廓并不一定意味着它是最长的,对吗?由于CV_链_近似_简单标志。例如,CV_CHAIN_APPROX_NONE能解决这个问题吗
Q:双重轮廓背后的原因是什么?为什么CV_RETR_EXTERNAL解决了这个问题

答:OpenCV findCountours的标准模式是
CV\u RETR\u LIST
,它为一条线输出内轮廓和外轮廓,就像您的情况一样<代码>CV_RETR_EXTERNAL,如文档中所述,将仅输出“极端外部轮廓”。请注意,外轮廓并不意味着最长的轮廓。我建议您通过
CV\u RETR\u LIST
模式给出的所有轮廓进行循环并进行计算

问:得到点最多的轮廓并不一定意味着它是最长的,对吗?由于CV_链_近似_简单标志。例如,CV_CHAIN_APPROX_NONE能解决这个问题吗

答:第一个问题是正确的,如果您的findCountours方法不同于
CV\u CHAIN\u APPROX\u NONE
。同样正确的是,
CV\u CHAIN\u APPROX\u NONE
将解决此问题,因为它将“绝对存储所有轮廓点”,但如果您愿意使用任何其他方法,您也可以对点之间的所有距离求和。

Q:双重轮廓背后的原因是什么,为什么CV\u RETR\u EXTERNAL可以解决此问题

答:OpenCV findCountours的标准模式是
CV\u RETR\u LIST
,它为一条线输出内轮廓和外轮廓,就像您的情况一样<代码>CV_RETR_EXTERNAL,如文档中所述,将仅输出“极端外部轮廓”。请注意,外轮廓并不意味着最长的轮廓。我建议您通过
CV\u RETR\u LIST
模式给出的所有轮廓进行循环并进行计算

问:得到点最多的轮廓并不一定意味着它是最长的,对吗?由于CV_链_近似_简单标志。例如,CV_CHAIN_APPROX_NONE能解决这个问题吗

答:第一个问题是正确的,如果您的findCountours方法不同于
CV\u CHAIN\u APPROX\u NONE
。同样正确的是,
CV\u CHAIN\u APPROX\u NONE
将解决此问题,因为它将“绝对存储所有轮廓点”,但如果您愿意使用任何其他方法,您也可以对点之间的所有距离求和。

Q:双重轮廓背后的原因是什么,为什么CV\u RETR\u EXTERNAL可以解决此问题

答:OpenCV findCountours的标准模式是
CV\u RETR\u LIST
,它为一条线输出内轮廓和外轮廓,就像您的情况一样<代码>CV_RETR_EXTERNAL,如文档中所述,将仅输出“极端外部轮廓”。请注意,外轮廓并不意味着最长的轮廓。我建议您通过
CV\u RETR\u LIST
模式给出的所有轮廓进行循环并进行计算

问:得到点最多的轮廓并不一定意味着它是最长的,对吗?由于CV_链_近似_简单标志。例如,CV_CHAIN_APPROX_NONE能解决这个问题吗

答:第一个问题是正确的,如果您的findCountours方法不同于
CV\u CHAIN\u APPROX\u NONE
。同样正确的是,
CV\u CHAIN\u APPROX\u NONE
将解决此问题,因为它将“绝对存储所有轮廓点”,但如果您愿意使用任何其他方法,您也可以对点之间的所有距离求和。

Q:双重轮廓背后的原因是什么,为什么CV\u RETR\u EXTERNAL可以解决此问题

答:OpenCV findCountours的标准模式是
CV\u RETR\u LIST
,它为一条线输出内轮廓和外轮廓,就像您的情况一样<代码>CV_RETR_EXTERNAL,如文档中所述,将仅输出“极端外部轮廓”。请注意,外轮廓并不意味着最长的轮廓。我建议您通过
CV\u RETR\u LIST
模式给出的所有轮廓进行循环并进行计算

问:得到点最多的轮廓并不一定意味着它是最长的,对吗?由于CV_链_近似_简单标志。例如,CV_CHAIN_APPROX_NONE能解决这个问题吗


答:第一个问题是正确的,如果您的findCountours方法不同于
CV\u CHAIN\u APPROX\u NONE
。同样正确的是,
CV\u CHAIN\u APPROX\u NONE
将解决此问题,因为它将“绝对存储所有轮廓点”,但如果您愿意使用任何其他方法,您也可以对点之间的所有距离求和。

嗨,Berriel,谢谢您的回答。为了澄清一些事情,我还有一个问题。如果实际上我想做的是找到最长的外部轮廓,那么我应该设置CV_RETR_外部轮廓