Opencv Findcontours 会导致堆错误
Opencv Findcontours cause heap error
我正在使用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 本身就是一个智能指针,它有参考计数器。这将创建各种令人讨厌的错误。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Findcontours() 运行时错误
- 使用FindContours OpenCV时堆错误
- 在ROI中使用FindContours,将轮廓的坐标错误
- OpenCV "findContours"方法错误
- Opencv Findcontours 会导致堆错误