Opencv出現“_pFirstBlock == pHead”錯誤的解決方法


先說結論:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM