OpenCV cv :: findcontours StackOverflow异常

时间:2014-05-25 12:26:01

标签: c++ opencv rgb contour grayscale

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

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

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

我注意到所涉及的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));

我获得的是: xxx.exe中发生未处理的“System.StackOverflowException”类型异常

1 个答案:

答案 0 :(得分:3)

findContours()的输入必须是单个频道图片。你不能传递3通道BGR图像。

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

当然它不一定是灰度图像,您可以使用split()从图像中提取和使用任何单个通道,例如。色调,饱和度,价值,B,G,R ......等等。

此外,findContours()最适合使用二进制输入图像,因此您可能希望在将单个频道图像传递给findContours()之前对其进行阈值处理。