Opencv Findcontours 会导致堆错误

Opencv Findcontours cause heap error

本文关键字:错误 Findcontours Opencv      更新时间:2023-10-16

我正在使用opencv 2.49。

但是我被查找轮廓功能困了几个小时。

当我在调试模式下运行程序并且错误框返回时

调试断言失败

程序:。。。 File f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c

行: 1322

Exception:_ CrtIsValidHeapPoionter(pUserData)

这是我的函数

HRESULT OpenCVHelper::DrawHand(Mat* pImg)        
{
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    cvtColor(*pImg, *pImg, CV_RGBA2GRAY);
    //Canny(*pImg, *pImg, 30,50);
    threshold( *pImg, *pImg, 50, 255,THRESH_BINARY);  
    if(pImg->type() == CV_8UC1)
    {
        findContours( *pImg, contours, hierarchy, CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
    }
        for( int i = 0; i< contours.size(); i++ )
       {
        Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255),  rng.uniform(0,255) );
        Scalar color( rand()&255, rand()&255, rand()&255 );
        drawContours( *pImg, contours, i, color, 2, 8, hierarchy, 0, Point() );
        }
//contours.clear();
//hierarchy.clear();
cvtColor(*pImg, *pImg, CV_GRAY2RGBA);
return S_OK;

}

当我删除查找轮廓功能时,没有错误。

当我使用 findcontour 时,它会弹出上面显示的错误框。

当我添加"contours.clear();hierarchy.clear();"这两行,没有错误消息,但程序仍然崩溃。

有人可以帮忙吗?

编辑 1.我找出了导致堆损坏的分配器,它是矢量>轮廓;但我仍然不知道如何解决它。

最后我发现了问题...

我的开发环境窗口10 x64, 英特尔 i5 ( X64 ),MS Visual Studio 2010 SP1

OpenCV 2.4.9 ( 测试 2.4.13 得到相同的错误)

有些人解决这个问题:直到opencv版本。2.4.9.,听到是我的代码。

Mat Img = imread( src_image );
if (Img.rows == 0 || Img.cols == 0)
    return -1;
Mat ImgGray;
cvtColor( Img, ImgGray, CV_BGR2GRAY );
Mat threshold_output;
vector<vector<Point>>  contours; // << 
vector<Vec4i> hierarchy;
int blkSize = 5;
int nKernelSz = 3;
double dFactor = 2.0f;
adaptiveThreshold(ImgGray,threshold_output, 
100,CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY_INV,blkSize, 5);
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, 
CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

"矢量<矢量><点>>" 导致运行时库/MTd 出错 解决:运行时库更改为/MD

这是下面引用的网站。http://opencv-users.1802565.n2.nabble.com/c-interface-heap-mem-problem-findcontours-td7020857.html

你拥有的代码应该可以工作。最有可能的故障点是当您找到轮廓时有一个空图像。我不是在谈论未初始化的图像,而是使用 Size(0,0) 初始化的图像。将您的"if-statement"更改为:

if ((pImg->type() == CV_8UC1) && (pImg->rows>0))

如果这没有帮助,那么下一步是验证粉碎的函数确实是 findContours 而不是 drawContours。崩溃可能位于绘制轮廓中,因为删除查找轮廓时未使用它。

此外,非常不建议使用指向 Mat 的指针。 Mat 本身就是一个智能指针,它有参考计数器。这将创建各种令人讨厌的错误。