Qt中添加OpenCV庫

  配置在Qt中的OpenCV,看了不少「教程」,最終成功。記一下過程。html

  本機配置:ios

  window7 32位系統;shell

  qt-opensource-windows-x86-mingw492-5.5.1;編程

  OpenCV2.4.10。windows

 

  對於我來講配置過程比較難,由於目前我沒用過Qt和Cmake,以前一直用VS編譯C++,也沒有用過MinGW,因此看教程中的各類命令或者執行文件都比較費時。此次各類嘗試後成功。參考資料的鏈接在最後,其中幫助我最大的就是那一篇純英文的,很詳細。app

前期準備

  Qt5的opensource版使用的是MinGW,而且不一樣於Qt4,Qt5不能在QtCreater中更改庫文件爲vc。而OpenCV在2.4以後就僅僅提供VS版本的庫文件,位置在%OpenCV%\build\x86 或 %OpenCV%\build\x64的「vc1x」文件夾中(%OpenCV%表示OpenCV的安裝目錄)。ide

                                                                           

上第一個圖片爲opencv2.4.10中build\x86\的內容;第二個圖片爲opencv2.3.1中build\x86\的內容。很明顯oepencv2.3.1中有一個mingw的庫文件夾而opencv2.4.10就僅僅支持vc庫了。由於電腦同時有這兩個版本的opencv庫文件,因此第一次配置我直接使用的是2.3.1版本(不須要從新編譯MinGW版本庫文件嘛),可是通過下面的正確配置後,測試程序一直沒法經過,現象在下面會細說。函數

  基於以上緣由,因此必需要在配置Qt前將OpenCV編譯成一個MinGW的庫文件版本。這也是爲何這麼教程裏要用一個CMake軟件編譯OpenCV。到這裏,我能夠列出在Qt5中配置OpenCV前須要準備的軟件:測試

  qt-opensource-windows-x86-mingw492-5.5.1;ui

  cmake-3.6.0-rc3-win32-x86;

  opencv2.4.10。

Qt5和cmake版本是我下載的最新版本,如今時間是2016-6-28。如下的內容不會詳細講述每一步配置步驟,在必要的地方我會附上相應的資料,這些資料已經解釋地十分詳細。這裏我着重寫的是我在配置中遇到的問題。

Qt5,CMake和OpenCV的安裝

  安裝的教程數不勝數,這裏再也不贅述。注意windows中的環境變量的配置。

  其中在Qt5的安裝中注意安裝MinGW。我這裏的版本是4.9.2,以下圖所示。

  

  安裝完成Qt5後,注意要將Qt5的路徑加入環境變量中,在後面使用CMake編譯OpenCV庫時,CMake會調用MinGW組件程序,即在安裝Qt中勾選的MinGW程序,而且還會調用Qt自己的編譯程序qmake.exe,這兩個文件的路徑都要在環境變量中,具體爲:

%Qt5%\Tools\mingw492_32\bin

%Qt5%\5.5\mingw492_32\bin 

以上%Qt5%爲個人Qt安裝目錄,例如個人是C:\Qt\Qt5.5.1,則將其代入以上路徑後等價於: 

C:\Qt\Qt5.5.1\Tools\mingw492_32\bin

C:\Qt\Qt5.5.1\5.5\mingw492_32\bin

OpenCV庫的編譯

  將OpenCV庫編譯成MinGW版須要使用CMake軟件,別的軟件是否好用我沒有用過。安裝時要注意勾選將CMake的路徑(Path)加到環境變量中,不然當後面使用控制檯(cmd或者powershell)調用CMake編譯安裝命令時會出現 無效命令 的提示。

  注意,在安裝完成後先不要直接編譯OpenCV的MinGW版本,要保證Qt已經安裝完成。不然會缺乏必要的執行程序致使沒法編譯成須要的MinGW庫。

  打開CMake,參考這篇資料選取OpenCV源文件位置和輸出文件位置,點擊configure。注意,這裏我沒有徹底按照這一篇資料,而是根據另外一篇資料的教程。傻瓜式的總結一下,這裏須要點擊「2次configure 和 1次generate」。

  我這裏本身選取了C和C++編譯器,具體爲下圖步驟點:

 

  

 我選取了"Specify native compilers",並在下一步選擇了編譯器,由於以前直接選取「Use default native compilers」時老是出錯,我猜想個人默認編譯器不對。    

  

我本身選擇的編譯器就是Qt中的MinGW中的gcc和g++,如上圖。 選取後finish,則進入其餘教程中的正常步驟,以下圖。

  

成功後,在第二次configue前,須要有兩個地方勾選或者更改,第一個是下圖處:

  

上圖選取的地方是CMake生成的configure類型,能夠填入Debug和Release,這樣生成的庫文件就能夠指出上面兩種版本的編譯。

另外必需要勾選下圖中的 WITH_QT,以使CMake編譯出能夠供Qt使用的庫文件(我認爲就是在這裏纔會須要cmake去調用qt中的qmake指令)。

 至此,就能夠點擊generate進行生成了。

  我在這以後出現了錯誤,通過查看得知,就是由於CMake會調用qmake執行文件,而個人環境變量的第一行是 C:\Python27\Lib\site-packages\PyQt4 (這是由於前人使用這臺電腦是安裝了PyQt),而這個目錄下有一個qmake執行文件,但這個文件不知足本次編譯的要求,因此老是出錯。因而我將C:\Qt\Qt5.5.1\5.5\mingw492_32\bin%OpenCV_MinGW%\bin 插入到前面便可。

  這以後就打開控制檯軟件,依次鍵入 mingw32-make 和 mingw32-make install ,如以前配置無誤,程序就會依次開始編譯和安裝,下圖依次爲相應結果:

Qt配置

  opencv的MinGW庫編譯好後,就能夠直接在Qt中配置了。Qt的配置是靠Qt工程建立後生成的那個pro文件,經過在pro文件中配置文本便可,pro文件的編寫規則和技巧能夠參考這篇資料,再也不贅述,下面是個人配置文件內容,使用的測試實例是Qt的控制檯應用:

QT += core
QT -= gui

TARGET = TestQt
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

INCLUDEPATH += F:/opencv2.4.10/build/include/opencv \
               F:/opencv2.4.10/build/include/opencv2 \
               F:/opencv2.4.10/build/include

LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libcv2.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_calib3d2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_contrib2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_nonfree2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ocl2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_gpu2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_photo2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_objdetect2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_legacy2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_ml2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_video2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_features2d2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_highgui2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_imgproc2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_flann2410.dll.a
LIBS +=F:/opencv2.4.10/OpenCVMinGW/lib/libopencv_core2410.dll.a

我寫的很麻煩,路徑都是複製粘貼好多遍,可使用 -L 和 -l參數進行簡化。在INCLUDEPATH中的文件目錄分級斜槓頗有意思,我這裏用的都是 / (斜槓),根據測試和查閱資料,我發現 \(反斜槓)和 \\(雙反斜槓)均可以使用。使用控制檯應用做爲測試的緣由是這樣編寫測試文件比較簡單,而且不會過多牽扯Qt編程的相關結構和知識,測試代碼也很簡單,以下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;
int main()
{
    std::cout<<"fuck"<<std::endl;
    Mat img;
    img = imread("D:/c.jpg");
    imshow("test", img);
    waitKey();return 0;
}

測試成功截圖以下:

  在配置過程當中,原先使用opencv2.3.1,這個庫中就有mingw版的庫文件,無需用source文件從新編譯(這個版本的opencv很奇怪的沒有source文件夾,而2.4.x以後的版本與這個版本的文件組織結構差異很大)。原覺得是一個方便,但實際使用QT時發現,就算個人.pro文件配置好也不能正常運行測試程序,即顯示出一張圖片(之因此認爲個人配置文件配置好是因爲在配置完pro文件後,編寫代碼過程當中使用include時能夠索引到opencv庫中的頭文件)。現象是隻要使用opencv的函數就不能正常運行程序,程序開頭的打印字符串都沒有顯示,末尾的打印字符串更是不能出現。另外一個現象是,當使用Mat關鍵字建立一個Mat類而不進行其餘相關opencv()函數調用時,不會出現錯誤,但只要使用別的函數,例如Mat img; img = imread(...);時就會出錯。編譯問題沒有一條,但就是不能出結果。

 

參考資料

http://www.laganiere.name/opencvCookbook/chap1s1_2.shtml
http://blog.163.com/allegro_tyc/blog/static/337437682014102411829281/
http://stackoverflow.com/questions/14919186/qt-creator-5-0-1-with-opencv-2-3-4-on-windows/15268560#15268560
http://blog.sina.com.cn/s/blog_7edf527e0101359b.html
http://blog.chinaunix.net/uid-23592843-id-2495471.html

相關文章
相關標籤/搜索