歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Qt Creator中無法使用OpenCV2中新函數的解決辦法

按上篇文章《Qt4.8下應用OpenCV2.4.4搭建環境詳細步驟(Win7系統)》 http://www.linuxidc.com/Linux/2013-04/83231.htm
 
在Qt Creator中配置了OpenCV2.4.X,但是只能使用opencv1.0的函數,opencv2中的函數,例如:imread(),Mat結構等都不能使用。
 
找原因:
 
(1)看頭文件有沒有問題
 
將include和lib目錄的配置由qmake.conf文件中改到工程中的pro文件中,以便於修改。
 
這裡說明一下,如果在qmake.conf文件中配置include和lib文件目錄,則#include後面的opencv頭文件會加下劃線,說明IDE找不到這些頭文件,而且寫函數的時候沒有自動補全。但是編譯時沒有錯,因為構建的時候可以找到這些目錄。如果在pro文件中配置include和lib文件目錄,IDE就知道了這些目錄,所以寫函數的時候還有自動補全,更利於檢查錯誤。
 
包含進opencv2的頭文件
 
#include<opencv2/core/core.hpp>
 
#include<opencv2/highgui/highgui.hpp>
 
試了opencv2中的imread()函數,有自動補全提示,說明編譯器已經找到了這些頭文件。
 
但構建的時候會出現:
 
undefined reference to `cv::imread(std::string const&, int)' 等
 
說明編譯器找不到lib庫文件
 
(3)找lib庫文件的問題
 
lib文件的包含如下:
 
LIBS += C:\opencv\build\x86\vc10\lib\opencv_core243d.lib\
 
      C:\opencv\build\x86\vc10\lib\opencv_highgui243d.lib\
 
      C:\opencv\build\x86\vc10\lib\opencv_imgproc243d.lib\
 
按說沒有問題,網上也都是這樣配的,但是我這裡就一直有問題。
 
情況是這樣的:
 
①不加這些lib文件,當然opencv1和opencv2的函數都不能用,都說undefined reference
 
②加上這些lib文件,opencv1中的函數能用,opencv2中新添加函數和結構不能用,例如:Mat結構,imread函數,VideoCapture結構等
 
這說明,opencv2新添加的函數和結構不在這些lib文件中。
 
後來,又新添加了幾個lib文件:
 
C:\opencv\build\x86\mingw\lib\libopencv_core243.dll.a\
 
C:\opencv\build\x86\mingw\lib\libopencv_highgui243.dll.a\
 
C:\opencv\build\x86\mingw\lib\libopencv_imgproc243.dll.a
 
這次編譯沒問題了,說明這些lib文件裡有opencv2新添加的東西。
 
(4)dll的問題
 
這時雖然編譯沒問題了,但運行的時候還是有問題(此時已經將對應的dll文件拷貝到system32文件夾下了),說程序異常終止,知道可能是缺dll文件。
 
進debug目錄直接運行exe文件,按照提示缺少哪些文件去網上找,前兩個都找到了,第三個是” libstdc++-6.dll”,找了好幾個都說dll文件有錯誤。把MinGW目錄下的這個dll文件復制過去也說是同樣的錯誤。於是搜索錯誤信息,於是找到opencv中文網的下面一片文章,和我的錯誤一模一樣:

====================================================

新手求助,_ZNSt9exceptionD2Ev錯誤


我是OpenCV的新手···我用OpenCV2.4最新版本結合CodeBlock配置的環境。並使用Opencv帶的樣例測試。編譯通過了,但是一運行就會報錯:無法定位程序輸入點_ZNSt9exceptionD2Ev於動態鏈接庫libstdc++-6.dll上我不明白這是什麼錯誤,請高手幫助····謝謝了

Re:新手求助,_ZNSt9exceptionD2Ev錯誤
我不清楚你用什麼編譯器來編譯你自己寫的opencv程序,以我的經驗,你需要用一個4.6.x版本的mingw來鏈接官方的opencv2.4的庫。因為官方opencv2.4的庫是用mingw4.6.x版本編譯的。


好謝謝現在我試試等下給你回復呵呵


我換了最新的版本MinGW,結果顯示還是無法定位程序輸入點_ZdlPv 於動態鏈接庫libstdc++-6.dll

我前面都和你說了,不能用最新版的MinGW,只能用4.6.x版本的MinGW。

http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.6.3/32-bit/threads-win32/dwarf/x32-4.6.3-release-win32-dwarf-rev0.7z/download 用這個版本肯定可以。

===========================================

看了大神的恢復,知道了是MinGW的版本問題,又下載了一個MinGW,把libstdc++-6.dll文件拷過去,果然OK了。現在可以用OpenCV2中的函數了。

 

總結一下:

(1)下載的OpenCV2.4.X版本,已經編譯好的lib文件中,只有C:\opencv\build\x86\mingw\lib

這個目錄下的lib文件有opencv2的新函數,而C:\opencv\build\x86\vc10\lib這個目錄下的lib文件中沒有opencv2的新函數,所以一開始包含這個目錄下的lib文件會找不到新函數的實現。

(2)另一種使用opencv2的方法就是用cmake自己編譯生成dll和lib文件,這樣裡面就有了新的函數。不過比較麻煩。

Copyright © Linux教程網 All Rights Reserved