OpenCV 3.0 findContours崩溃

时间:2016-03-21 18:33:09

标签: c++ opencv

我需要检测对象的图像轮廓。为此,我正在使用OpenCV库的函数findContours。我在使用OpenCV 3.0 (x86)编译的Windows 10 (x64) contrib modules上使用findContours

问题

问题在于,当我尝试使用此功能时,应用程序崩溃。错误不是异常或断言失败,我只能看到一个窗口告诉我应用程序崩溃了:

enter image description here

我测试了什么

我已经检查过我传递给CV_8U的图像是二进制图像:

我检查了图像的类型,它是0,与// This is the main function: int test_findContours(const std::string &path){ Mat img = imread(path, IMREAD_GRAYSCALE); if (!img.data){ cout << "ERROR" << endl; return -1; } Mat mask; getRemBackgroundMask(img, mask); vector< vector<Point> > contours; // Here the program crashes: findContours(mask, contours, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE); return 0; } // Get the mask to remove the background void getRemBackgroundMask(const Mat &img, Mat &mask) { threshold(img, mask, 70, 1, THRESH_BINARY_INV); Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); openning(mask, mask, kernel); } void openning(const Mat &binary, Mat &result, const Mat &kernel){ erode(binary, result, kernel); dilate(binary, result, kernel); } 值相同。

我甚至检查了直方图,并且只有值为0和1的像素。

我还从OpenCV教程和论坛中搜索了一些示例,我尝试的做法与示例完全相同,并且程序再次崩溃。

代码

以下是我正在执行的代码:

ansible-galaxy install nickhammond.logrotate

2 个答案:

答案 0 :(得分:4)

我发现了这个问题。提到的错误显然是因为我使用Visual Studio 2013的Debug配置和OpenCV的Release库(* .libs没有'd')。我已经使用Release配置测试了该程序并且它可以工作。我甚至绘制了检测到的轮廓,功能正常。

答案 1 :(得分:1)

到目前为止,我已经找到了几种使findcontours()崩溃的方法

1)源图像不是灰度

2)轮廓的类型容器不正确-您必须使用(此结构)

std::vector<std::vector<cv::Point> > yourContour;

3)阈值设置为相同的值或阈值2小于1

4)源图像太大。

这!是最有可能的罪魁祸首。如今,手机可以拍摄出可笑的分辨率的图片,可悲的是,OpenCv并没有将来证明其代码,并且崩溃是由于溢出造成的。 这是一个已知问题,可以在这里找到更多信息: https://github.com/opencv/opencv/issues/7449

即使认为它是固定的,在大多数情况下这也是罪魁祸首。我使用的是OpenCV 3.4.1,它是最新的稳定版本,其修复方法是以可管理的旧分辨率(例如800x600)明确声明源和目标cv :: mats