我是靠谱客的博主 开放酸奶,最近开发中收集的这篇文章主要介绍opencv中findContours导致crash,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是开放酸奶为你收集整理的opencv中findContours导致crash的全部内容,希望文章能够帮你解决opencv中findContours导致crash所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部