我有一个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”类型异常
答案 0 :(得分:3)
findContours()
的输入必须是单个频道图片。你不能传递3通道BGR图像。
解决方案是将输入图像转换为灰度。
例如。 cvtColor( src, src_gray, CV_BGR2GRAY );
当然它不一定是灰度图像,您可以使用split()
从图像中提取和使用任何单个通道,例如。色调,饱和度,价值,B,G,R ......等等。
此外,findContours()
最适合使用二进制输入图像,因此您可能希望在将单个频道图像传递给findContours()
之前对其进行阈值处理。