在OpenCV 2.3.1中使用grabCut时程序崩溃

Program crashes on using grabCut in OpenCV 2.3.1

本文关键字:grabCut 程序 崩溃 OpenCV      更新时间:2023-10-16

我正在使用以下代码:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
    int main(int argc, char* argv[])
    {
        const string ipImgName= argv[1];
        Mat ipImg;
        ipImg = imread( ipImgName, 1 );
        cv::Mat gcImg;
        cv::Mat bgdModel;
        cv::Mat fgdModel;
        cv::Rect rect(0, 0, ipImg.cols-1, ipImg.rows-1);
        cv::grabCut( ipImg, gcImg, rect, bgdModel, fgdModel, 1, cv::GC_INIT_WITH_RECT ); 

        return 0;
    }

但是,当退出主循环时,当调试器进入~Mat()析构函数时,gcImg、bgdModel或fgdModel的代码在release()上崩溃(说"这可能是由于堆损坏")。

但是,如果我使用new在堆上分配cv::Mat,然后不删除它们,那么代码运行得很好。我使用的是带有OpenCV 2.3.1的Visual Studio 2010。

如果您正在运行与Release库链接的调试构建,则由于使用了不同的内存分配例程,可能会报告此虚假的"错误"。

在Debug构建中,内存分配在分配的块的两端都用保护字节进行保护,并对损坏、泄漏等进行各种检查。在Release构建中,这些检查不会执行,当您混合使用Debug和Release代码以释放与其中一个分配的内存时,这是您看到的典型错误。

这实际上并不是一个真正的错误,只是混合不同运行时的副作用。MSDN提供了更多详细信息。