先说结论:
opencv链接库使用错误。
1,确认VS工程属性中,opencv的链接库路径和版本正确。
VS2013应该使用vc12目录,VS2012对应vc11目录。debug版和release版要区分。
2,VS工程的运行库参数应该使用"/MDd“。
3,系统环境变量Path中,opencv的目录和VS工程设置的路径 应该一致。(本次问题的原因!)
---------------------------------------------------------------------------------------------------
开发环境:
VS2013+Opencv3.0
错误现象:
Debug时,出现如下窗口。
调查经纬:
通过调试,发现是在查找轮廓后,释放vector的地方报的错。写了个简单的代码试了一下。
#include <opencv2\opencv.hpp> using namespace cv; using namespace std; void test(Mat src) { vector<Mat> list; split(src, list); } void main() { Mat src(300,300, CV_8UC3); src = 0; test(src); return; }
在test()结束时,也会发生同样的错误。
上网查了一下,一般原因有两个:
------------------------------------------------------------------------
1,Opencv库链接错;
比如,Debug模式下链接了Release的库(opencv中*.d.lib是Debug版,不带d的是release版);
或者,还有一部分是因为VS2012使用了2013的库(Opencv目录下vc12是VS2013的库,而不是VS2012的);
please check, if you're linking to debug dlls (ending in *.d.dll) in debug mode. also, if you link against "multithreaded-dll" c-runtime
2,VS工程属性设置错误。
VS的工程属性里面应该使用/MDd,不能使用/MTd;
------------------------------------------------------------------------
但是查了下,我的VS工程设置都没有问题。于是拿Depends查看一下编译后的exe文件,显示链接的Opencv库也是正确的。
又看了一下DLL库的属性,显示是链接到了vc11目录下。
突然想到,原来电脑上用的是VS2012,使用的是vc11目录下的opencv库,所以系统变量里面设置的也是cv11的路径。
改用VS2013后,虽然工程属性里面都改成了vc12目录,但是运行exe程序时,还是会根据PATH系统变量,去找到vc11目录下的库文件。
※ depends 在VS2008以后就不支持了,需要到官网下载:http://www.dependencywalker.com/
解决方法:
修改系统环境变量PATH,把opencv库的目录改为vc12目录下。重启VS,再次调试,错误消失。
※ 前提,要确认VS工程属性中的链接库设置正确。
参考链接:
http://answers.opencv.org/question/35437/problem-using-stdvector-as-a-parameter-in-some-opencv-functions/
https://stackoverflow.com/questions/26803975/debug-assertion-failed-pfirstblock-phead-using-opencv
https://stackoverflow.com/questions/21261709/debug-assertion-failed-expression-pfirstblock-phead-using-opencv-and-c-tr