opencv中findContours导致crash

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z914022466/article/details/52710081

bug

没用到MFC,网上的方法:
1,在配置属性->常规->MFC的使用中,将在静态库中使用MFC改为在共享DLL中使用MFC。无效
2,多线程调试(/MTd)改为多线程DLL调试(/MDd)。无效
3,直接将:_findContours( Mat& image, vector<vector >& contours,
vector* hierarchy, int mode, int method, Point offset )
提出来,放到dll中改一个名字,再调用OK了。好麻烦

另外:1,2两种方法不会报错,但内存泄露。治标不治本。

最后我是这么解决的:

vector<Mat> contours(100);
Mat hierarchy;//这句写成Vector<Vec4i> hierarchy(100)也行
findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE );



原因:

我跟踪进去发现是vector析构时产生的问题。在我的程序中是findContours的第三个参数,即hierarchy析构时报错。最后是在

void _Deallocate(void * _Ptr, size_t _Count, size_t _Sz)中调用
::operator delete(_Ptr);时报错

这个不是opencv的问题,是调用dll的问题,dll中给vector分配成员空间,无论你是传引用,还是指针,只要vector的初始化容器大小,放不下成员,在dll中就会给vector增加空间,故解决方法如下:

vector< vector > contours(1000);
findContours(canny_output, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

预先在自己程序中分配好,1000只是个估值,根据实际大小最大值来设置

6.25更新:

不要把stl中的东西在dll中传递,例如vector和string
http://blog.csdn.net/huapeng_guo/article/details/8276868

猜你喜欢

转载自blog.csdn.net/z914022466/article/details/52710081
今日推荐