【问题标题】:OpenCV 3.0 findContours crashesOpenCV 3.0 findContours 崩溃
【发布时间】:2016-03-21 18:33:08
【问题描述】:

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

问题

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

我测试过的内容

我已检查我传递给findContours 的图像是二进制图像:

我检查了图像的类型,为0,与CV_8U值相同。

我什至检查了直方图,只有值 0 和 1 的像素。

我也搜索过OpenCV教程和论坛中的例子,我尝试过和例子中的完全一样,程序又崩溃了。

代码

这是我正在执行的代码:

// 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);
}

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    我发现了问题。显然出现上述错误是因为我将 Visual Studio 2013 的调试配置与 OpenCV 的发布库(*.libs 没有“d”)一起使用。我已经使用 Release 配置测试了该程序并且它可以工作。我什至已经绘制了检测到的轮廓,并且功能正常。

    【讨论】:

    • 您必须小心不要在调试应用程序中使用 Release dll 或在发布(或混合编译器版本)中使用 Debug dll。其中任何一个都会导致您拥有超过 1 个不兼容的堆,当其中一个尝试从另一个释放分配的内存时,这会导致堆损坏。堆损坏并不总是会导致立即崩溃,因此可能很难确定原因。
    【解决方案2】:

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

    1. 源图像不是灰度的

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

      std::vector&lt;std::vector&lt;cv::Point&gt; &gt; yourContour;

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

    4. 源图片太大。

    还有这个!很可能是罪魁祸首。现在手机可以以荒谬的分辨率拍照,遗憾的是 OpenCv 没有在未来证明他们的代码并且崩溃是由于溢出造成的。 这是一个已知问题,可以在此处找到更多信息: https://github.com/opencv/opencv/issues/7449

    即使它被列为已修复,在大多数情况下这也是罪魁祸首。我正在使用 OpenCV 3.4.1,它是最新的稳定版本,修复只是以可管理的旧分辨率(如 800x600)显式声明您的源和目标 cv::mats

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多