本文將總結一些在使用opencv+vs過程中碰到的error。
1.程序編譯通過,運行時出現如下錯誤:
解決方法:
a.可能是讀取文件時出現錯誤,比如說讀圖片,視頻等文件名字或路徑弄錯了。
2. 編譯程序通過,運行時出現如下錯誤:
解決方法:
a.可能是數據類型不對,比如說在該語句中gray_diff.at<unsigned char>(i,j)=255;
本來gray_diff中的數據類型是unsigned char的,如果你寫成了gray_diff.at< int>(i,j)=255;或者是寫成其它的就會報類似的錯誤。
3. 當編譯通過,運行程序一段時間后出現如下提示:
解決方法:
a. 可能是讀取的地址無效,比如說你去讀取一副圖片,但是你給的圖片目錄中沒有該文件的話就會出現類似錯誤。
4.如果自己單獨寫一個頭文件,比如說gmm.hpp,頭文件中也包含了opencv用到的系統頭文件,但是在gmm.hpp中應用opencv自帶的變量類型時會報錯。比如說gmm.hpp 的內容為,已被main.cpp包含進去了。
gmm.hpp內容如下圖所示:
編譯是報錯如下:
則原因是沒有使用opencv的命名空間,加入一句using namespace cv;即可。以后要注意了,使用了opencv的頭文件后,要同時使用其命名空間,否則是會報錯的。
5. 如果生成項目時,出現如下錯誤提示:
則說明你在頭文件中定義了變量,且這個頭文件有被2個或2個以上的源文件包含了。因此可以得出結論,盡量不要在頭文件中定義變量,如果要定義的話,就需要在前面加一個static關鍵字。
6.當用單步調試,變量監視器來監視Mat型變量時,查看Mat型里面的data數據(特別是其數據類型為浮點數時),有可能出現如下顯示:
這並不是說明這個Mat類型數據有錯誤,只是變量監視顯示不出來而已,可能有如下2個原因:一是該變量只能顯示unsigned char型的數據,其他非此類的數據顯示可能有誤;二是Mat型內部數據不同點對應的數據可能不同,所以也有可能顯示不出來。
7. 重裝系統前用的xp+opencv2.3.1+vs2010,opencv打開攝像頭正常,重裝系統后用的xp+opencv2.4.2+vs2010,程序沒有變化,opencv運行這些程序時打開攝像失敗,但是用運行opencv1.0sample中有關攝像頭的exe正常。另外攝像頭驅動正常,比如qq視頻,xp系統自帶攝像頭軟件都能運行。這是什么原因呢?
后面在網上查,他們都說opencv2.0以前只支持VWF驅動,這個是微軟比較老的驅動。到opencv2.0以后就采用VedioCapture類,支持DirectShow類。難道是我攝像頭的驅動過低?后面試了很多攝像頭的驅動,從01年的到11年的,都不行。最后也測試了這個VideoCapture類讀取視頻avi文件功能,發現也不順利。后面自己重新建立了一個工程,采用同樣的代碼就順利運行了。(因為剛裝opencv2.4.2,所以我拿的是以前在opencv2.3.1下沒寫完的代碼,屏蔽之,加入攝像頭測試代碼的),看來可能是2.3.1下的某些東西影響了吧。總之,能工作就好!
8. 當調試時變量顯示為-1.#IN00 0,有下面幾種可能。一是該變量(一般是float類型)在debug模式下沒有進行初始化導致的。二是有可能是計算出來的值越界了,比如說無窮大或者無窮小的float數了,有可能是除了分母為0的數。
9. 為什么opencv2.4.2中新建的視頻的窗口名字會出現亂碼呢?有時候甚至名字都不顯示出來。且本應該有的滑動條也顯示不出來或者亂套了。
這是因為如果在debug環境下,則對應的dll庫后面都應該加有d字樣,比如opencv_core242d.dll,如果用的是opencv_core242.dll,則就有可能出現窗口名字亂碼,甚至連滑動條都不能顯示的情況。同理如果在release下用帶有d字樣結尾的dll則會直接內存報錯,所以此時只能用不帶d的dll。
一句話,debug下用debug下對應的dll,release下用release對應的dll即可。
10. 在qt中如果定義在頭文件中定義了槽函數,則在cpp源文件必須去實現該槽函數,否則會出現類似undefined reference to MainWindow::on_pushButton_clicked()的錯 誤,該錯誤是由於在UI中刪除了某些不用的按鈕造成的。
11.如果用Qt的控制台建立程序,運行程序時出現下面的錯誤提示:
這是因為控制台程序不能使用Qt的界面(本程序中使用了QMessageBox),因此需要在工程pro的代碼中把QT – gui給去掉,否則會報類似的這種錯誤。
12.如果是在OpenCV中出現如下錯誤:
則表示是imshow函數需要還來不及顯示完成就被其它的函數給中斷了,這可能在回調函數中出現這種情況。