C++ OpenCV cv::findcontours堆栈溢出异常
我有一个3通道cv::Mat(RGB 480高640宽),我想找到这张图片的轮廓。 我尝试了不同的例子: 但每次我在队列中出现stackoverflow错误时: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中得到堆栈溢出
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));