Qt中添加OpenCV庫


  配置在Qt中的OpenCV,看了很多“教程”,最終成功。記一下過程。

  本機配置:

  window7 32位系統;

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

  OpenCV2.4.10。

 

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

前期准備

  Qt5的opensource版使用的是MinGW,並且不同於Qt4,Qt5不能在QtCreater中更改庫文件為vc。而OpenCV在2.4之后就僅僅提供VS版本的庫文件,位置在%OpenCV%\build\x86 或 %OpenCV%\build\x64的“vc1x”文件夾中(%OpenCV%表示OpenCV的安裝目錄)。

                                                                           

上第一個圖片為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;

  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


免責聲明!

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



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