欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-26 19:45:16
...

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

遇见这个问题头疼了半天,尝试了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)。

方案六:

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

方案七: 

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

方案八: 


错误提示为:_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下面的库全部删除就可以了。

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