Opencv Findcontours导致堆错误

时间:2015-04-28 23:52:37

标签: c++ opencv image-processing

我使用的是opencv 2.49。

但是我发现轮廓功能几个小时我一直困扰着。

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

  

调试断言失败

     

计划:......   文件f:\ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c

     

行:1322

     

异常:_ 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函数时,没有错误。

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

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

任何人都可以提供帮助吗?

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

2 个答案:

答案 0 :(得分:3)

最后我发现了问题...

我的开发环境 window10 x64,Intel 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) );

“vector&lt; vector&lt; Point&gt;&gt;”   在运行时库/ MTd上导致错误  解决:运行时库更改为/ MD

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

答案 1 :(得分:2)

您拥有的代码应该有效。最有可能的失败点是当你到findContours时有一个空图像。我不是在讨论未初始化的图像,而是使用Size(0,0)初始化的图像。更改您的if语句&#39;是:

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

如果这不会有帮助,那么下一步就是验证粉碎的功能确实是findContours而不是drawContours。崩溃可能在drawContours中,因为删除findContours时不会使用它。

此外,我们不建议使用指向Mat的指针。 Mat本身就是一个智能指针,它有引用计数器。这将产生各种令人讨厌的错误。