我使用的是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;轮廓;但我仍然不知道如何解决它。
答案 0 :(得分:3)
我的开发环境 window10 x64,Intel i5(X64), MS Visual Studio 2010 SP1
有些人解决了这个问题:高达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本身就是一个智能指针,它有引用计数器。这将产生各种令人讨厌的错误。