先說結論:
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