您的位置:首页 > 其它

MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案

2018-01-07 21:56 351 查看


遇见这个问题头疼了半天,尝试了N中方案,然后把网上所提供的方案整理下,看看哪一种合适你的错误。

方案一: 

如果使用
vector<vector<Point> > contours;
作为findContours的参数,在运行时会得到 

Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & f… 

原因是标准库里有std::vector 和 Point 和findContours里要用到的vector和Point不是一回事所以,声明的时候要用cv::vector和cv::Point就可以了。

方案二: 

“修改了当前程序的vc运行库配置,问题解决。具体方法是:项目-属性-配置属性-C/C++-代码生成-运行库,将其改为“多线程调试(/MTd)”。”

方案三: 

在配置属性->常规->MFC的使用中,将在静态库中使用MFC改为在共享DLL中使用MFC。

方案四: 

为vector初始化:
vector<Mat> contours(100);
Mat hierarchy;
findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE );
1
2
3[/code]

方案五: 

当一个DLL采用静态的方式链接到C运行时库时,会创建一个相对于该DLL的堆(Heap),而如果采用共享的方式链接到C运行时库的时候则使用的是应用程序的堆内存。而_CrtIsValidHeapPointer()在 DEBug模式下将确保传入的地址在本地的堆内存中。 因此就有理由相信,真有可能是静态链接的问题。所以,我立即尝试将: 

项目–属性–配置属性–常规–MFC的使用– 选择在共享DLL中使用MFC ;同时, 

项目–属性–配置属性–C/C++–代码生成–运行库–选择 多线程DLL(/MD)。

方案六:


 


 



方案七: 



方案八: 

错误提示为:_pFirstBlock==pHead。

解决方法

此问题的产生多半是因为在调用库的过程中产生了冲突,所以解决此问题的方法就是将OpenCV的调用方法改为静态调用, 使用OpenCV的静态库

opencv中在静态库中使用MFC的配置方法如下:

D:/Program Files/opencv/build/x86/vc12/staticlib
1、lib选择staticlib;
也就是VC++目录中的包含目录应该为如下路径

2、属性页---配置属性----MFC的使用---在静态库下使用MFC;

这样会将你程序用到的一些库写到你的exe文件中,换来的是可移植性,但是exe文件会稍微大一些

3、属性----C/C++ -----代码生成----运行库选择位多线程调试(/MTd)。

在静态库下也可能会出现异常错误:这时候考虑的问题有如下2个:
1、确实是你程序错误,如果程序错误最有可能是你new的指针没有delete,或者某个内存没有分配就开始用再或者就是野指针等情况,最好单步调试,注意指针和数组。

2、opencv的配置错误

配置好opencv后发现我的程序在共享DLL下使用MFC是没有错误,但是一旦选择了静态库下使用MFC就出现了上面的错误。如果不是程序问题,那么通常,Debug下面可能引用了Release下面静态编译的库。如果在debug环境下运行,只要将release下面的库全部删除就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐