OpenCV cv::findcontours *** 异常
Posted
技术标签:
【中文标题】OpenCV cv::findcontours *** 异常【英文标题】:OpenCV cv::findcontours *** Exception 【发布时间】:2014-05-25 12:26:01 【问题描述】:我有一个 3 通道 cv::Mat(RGB 480 高度 x 640 宽度),我想找到这张图片的轮廓。 我尝试了不同的例子: This one This one 但是每次我在该行中遇到 *** 错误时:
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.***Exception”类型的未处理异常
【问题讨论】:
您的 Canny 仍然使用 rgb src 图像作为输入,并且您的阈值无处可去(从不使用 dst) 是的,我注意到了,我更正了,但还是不行 仍然缺少确切的错误。 【参考方案1】:findContours()
的输入必须是单通道图像。您不能将 3 通道 BGR 图像传递给它。
解决方案是将您输入的图像转换为灰度。
例如。 cvtColor( src, src_gray, CV_BGR2GRAY );
当然它不一定是灰度图像,您可以使用split()
从图像中提取和使用任何单个通道,例如。色相、饱和度、值、B、G、R...等
此外,findContours()
最适合使用 二进制 输入图像,因此您可能需要在将单通道图像传递给 findContours()
之前对其进行阈值处理。
【讨论】:
以上是关于OpenCV cv::findcontours *** 异常的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV-寻找轮廓cv::findContours&绘制轮廓cv::drawContours
OpenCV计算机图像处理 —— 凸性缺陷 + 点多边形测试 + 形状匹配 + 轮廓分层与cv.findContours()
Opencv-python 找到图像轮廓并绘制,cv2.findContours()函数,求轮廓外接矩形,cv2.boundingrect()
youcans 的 OpenCV 例程200篇194.寻找图像轮廓(cv.findContours)