Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.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
C++ OpenCV cv::findcontours堆栈溢出异常_C++_Opencv_Rgb_Contour_Grayscale - Fatal编程技术网

C++ OpenCV cv::findcontours堆栈溢出异常

C++ OpenCV cv::findcontours堆栈溢出异常,c++,opencv,rgb,contour,grayscale,C++,Opencv,Rgb,Contour,Grayscale,我有一个3通道cv::Mat(RGB 480高640宽),我想找到这张图片的轮廓。 我尝试了不同的例子: 但每次我在队列中出现stackoverflow错误时: cv::findContours(contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 或 我注意到了涉及到的cv::Mat的大小和通道的数量。我不知道还能做什么。 经过几次操作后,我的代码就是这个,我总是在findcontours中得到堆栈溢出

我有一个3通道cv::Mat(RGB 480高640宽),我想找到这张图片的轮廓。 我尝试了不同的例子: 但每次我在队列中出现stackoverflow错误时:

cv::findContours(contourOutput, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);

我注意到了涉及到的cv::Mat的大小和通道的数量。我不知道还能做什么。 经过几次操作后,我的代码就是这个,我总是在findcontours中得到堆栈溢出

                cv::Mat src_gray;
                cv::Mat dst;
                cv::Mat canny_output;
                std::vector<std::vector<cv::Point> > contours;
                std::vector<cv::Vec4i> hierarchy;

                cvtColor(src, src_gray, CV_BGR2GRAY);

                int threshold_value = 0;
                int threshold_type = 3;
                int max_BINARY_value = 4;
                threshold(src_gray, dst, threshold_value, max_BINARY_value, threshold_type);


                /// Detect edges using canny
                Canny(dst, canny_output, 100, 100 * 2, 3);
                /// Find contours
                findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
cv::Mat src_gray;
cv::Mat dst;
cv::Mat canny_输出;
矢量轮廓;
向量层次;
CVT颜色(src、src_灰色、CV_BGR2灰色);
int threshold_值=0;
int threshold_type=3;
int max_BINARY_值=4;
阈值(src_灰度、dst、阈值、最大二进制值、阈值类型);
///使用canny算法检测边缘
Canny(dst,Canny_输出,100100*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链、近似、简单、CV::Point(0,0));
我得到的是:在xxx.exe中发生了“System.StackOverflowException”类型的未处理异常

要输入的必须是一个单通道映像。您无法向其传递3通道BGR映像

解决方案是将输入图像转换为灰度。 例如,
cvtColor(src、src_gray、CV_BGR2GRAY)

当然,它不必是灰度图像,你可以从图像中提取并使用任何单个通道,例如色调、饱和度、值、B、G、R。。。等等

另外,
findContours()
binary
输入图像效果最好,因此在将单通道图像传递给
findContours()
之前,您可能需要对其设置阈值。要输入的图像必须是单通道图像。您无法向其传递3通道BGR映像

解决方案是将输入图像转换为灰度。 例如,
cvtColor(src、src_gray、CV_BGR2GRAY)

当然,它不必是灰度图像,你可以从图像中提取并使用任何单个通道,例如色调、饱和度、值、B、G、R。。。等等

另外,
findContours()
binary
输入图像效果最好,因此在将单通道图像传递给
findContours()
之前,您可能需要对其设置阈值。要输入的图像必须是单通道图像。您无法向其传递3通道BGR映像

解决方案是将输入图像转换为灰度。 例如,
cvtColor(src、src_gray、CV_BGR2GRAY)

当然,它不必是灰度图像,你可以从图像中提取并使用任何单个通道,例如色调、饱和度、值、B、G、R。。。等等

另外,
findContours()
binary
输入图像效果最好,因此在将单通道图像传递给
findContours()
之前,您可能需要对其设置阈值。要输入的图像必须是单通道图像。您无法向其传递3通道BGR映像

解决方案是将输入图像转换为灰度。 例如,
cvtColor(src、src_gray、CV_BGR2GRAY)

当然,它不必是灰度图像,你可以从图像中提取并使用任何单个通道,例如色调、饱和度、值、B、G、R。。。等等


另外,
findContours()
binary
输入图像效果最好,因此在将单通道图像传递给
findContours()
之前,您可能需要对其设置阈值,因为您的Canny仍然使用rgb src图像作为输入,而您的阈值毫无用处(从未使用dst)是的,我注意到了这一点,并对此进行了更正,但是它仍然不起作用确切的错误仍然丢失。你的Canny仍然使用rgb src图像作为输入,而你的阈值没有任何作用(dst从未使用)是的,我注意到了,并且我纠正了这一点,但它仍然不起作用确切的错误仍然丢失。你的Canny仍然使用rgb src图像作为输入,而你的阈值没有任何作用(dst从未使用)是的,我注意到了,我纠正了,但它仍然不起作用。精确错误仍然丢失。您的Canny仍然使用rgb src图像作为输入,并且您的阈值不起作用(dst从未使用)是的,我注意到了,我纠正了,但它仍然不起作用精确错误仍然丢失。
                cv::Mat src_gray;
                cv::Mat dst;
                cv::Mat canny_output;
                std::vector<std::vector<cv::Point> > contours;
                std::vector<cv::Vec4i> hierarchy;

                cvtColor(src, src_gray, CV_BGR2GRAY);

                int threshold_value = 0;
                int threshold_type = 3;
                int max_BINARY_value = 4;
                threshold(src_gray, dst, threshold_value, max_BINARY_value, threshold_type);


                /// Detect edges using canny
                Canny(dst, canny_output, 100, 100 * 2, 3);
                /// Find contours
                findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));