MFC中使用FindContours()函数使用时导致的程序崩溃问题的解决方案
程序员文章站
2024-02-26 19:45:16
...
遇见这个问题头疼了半天,尝试了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
方案五:
当一个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下面的库全部删除就可以了。