Qt之CMake和MinGW編譯OpenCV

這裏編譯的是最新版OpenCV3.4.3,編譯過程比較曲折,大部分編譯錯誤均可以查獲得解決方法,也遇到了Google無果的錯誤,好在最後仍是解決了,特此記錄。 編譯環境html

win10-64bit Qt5.9.4 MinGW-5.3.0-32bit CMake-3.12.1 OpenCV-3.4.3多線程

相關軟件下載地址ide

Qt下載地址:http://download.qt.io/archive/qt/5.9/測試

CMake下載地址:https://cmake.org/download/ui

OpenCV下載地址:https://opencv.org/releases.html#
這裏寫圖片描述this

此處下載安裝包(Win pack)和源碼(Sources)都可,配置時選擇的目錄不一樣。
這裏寫圖片描述spa

其它地址
OpenCV官網:https://opencv.org/
OpenCV官方教程:https://docs.opencv.org/3.4/d9/df8/tutorial_root.html
速查表:https://docs.opencv.org/3.0-last-rst/opencv_cheatsheet.pdf.net

添加環境變量

  • H:\cmake\bin線程

  • D:\Qt\Qt5.9.4\5.9.4\mingw53_32\bindebug

  • D:\Qt\Qt5.9.4\Tools\mingw530_32\bin

  • OpenCV編譯步驟

     

  在opencv安裝的同級目錄下建立文件夾buildOpencv,用來存放構建文件及生成的庫。 這裏寫圖片描述

編譯前配置 一、打開 cmake-gui,設置源碼和生成路徑:

Where is the source code :H:\opencv3.4.3\opencv\sources    (opencv安裝目錄) Where to build the binaries:H:\opencv3.4.3\buildOpencv    (新建的文件目錄)

而後點擊Configure,在彈框裏選擇編譯器,點擊Next,以下圖:

這裏寫圖片描述

若是下載的是opencv源碼而非安裝包,解壓后里面沒有sources目錄,上圖第一項設置Where is the source code :H:\opencv3\opencv-3.4.3便可。

二、在彈窗裏設置編譯器目錄,而後點擊Finish

  • D:\Qt\Qt5.9.4\Tools\mingw530_32\bin\gcc.exe
  • D:\Qt\Qt5.9.4\Tools\mingw530_32\bin\g++.exe

這裏寫圖片描述

三、點擊Finish以後須要等待一段時間,等到進度條讀完以後,開始配置:

  • 勾選 WITH_QT
  • 勾選 WITH_OPENGL(默認已勾選)

這裏寫圖片描述

 

勾選以後點擊Configure,等到進度條讀完以後,再次配置:

Qt5Concurrent_DIR  --> D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5Concurrent
Qt5Core_DIR           -->  D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5Core
Qt5Gui_DIR             --> D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5Gui

Qt5Test_DIR            --> D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5Test
Qt5Widgets_DIR      --> D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5Widgets
Qt5OpenGL_DIR     -->  D:\Qt\Qt5.9.4\5.9.4\mingw53_32\lib\cmake\Qt5OpenGL 
CMAKE_BUILD_TYPE -->  ***Release***(設置爲Release後編譯完成只會生成release庫,須要debug庫的話等到編譯完成將此處更改成Debug,從新執行下面的步驟則會在生成的release庫的目錄下生成debug庫)

點擊右上角的Add Entry,而後在彈窗中輸入:

  • QT_MAKE_EXECUTABLE
  • FILEPATH
  • D:\Qt\Qt5.9.4\5.9.4\mingw53_32\bin\qmake.exe

這裏寫圖片描述

而後點擊OK- Generate ,進度條讀完以後,配置完成。

更多配置提示

上一步已經配置完成,可是編譯過程當中會遇到編譯錯誤,若是但願一次編譯成功,能夠進行下面的設置。或者直接在上一步Generate以後就進行編譯,等到編譯出現錯誤時再來配置。

不勾選 WITH_IPP

不勾選與TESTS有關的選項

不勾選 ENABLE_PRECOMPILED_HEADERS

不勾選WITH_MSMF

勾選 ENABLE_CXX11

編輯H:\opencv3.4.3\opencv\sources\modules\videoio\src\cap_dshow.cpp文件,在約110行左右#include "DShow.h"上面添加#define NO_DSHOW_STRSAFE,#define STRSAFE_NO_DEPRECATE,以下圖:
這裏寫圖片描述

編譯命令

在構建目錄buildOpencv下按shift+右鍵,打開終端,而後執行編譯命令:

mingw32-make 或 mingw32-make -j 8

注意:右側帶參數的命令是多線程編譯,編譯速度會快不少,可是使用多線程編譯前最好先重啓電腦或者關閉沒必要要的軟件保證內存和

CPU的佔用較低狀態,不然頗有可能編譯失敗,編譯失敗的話也不要緊能夠改成單線程繼續編譯。

mingw32-make install

編譯完成(100%)以後執行安裝命令,會在相關目錄下生成庫文件。

編譯錯誤

編譯過程當中可能會遇到下面的錯誤:

多線程編譯錯誤,18%左右
這裏寫圖片描述
解決:改成使用mingw32-make命令繼續編譯

C++11錯誤,25%左右
這裏寫圖片描述
解決:打開 cmake-gui ,勾選 ENABLE_CXX11,而後從新Configure-Generate-mingw32-make

cap_dshow.cpp文件出錯,43%左右
這裏寫圖片描述

解決:
編輯H:\opencv3.4.3\opencv\sources\modules\videoio\src\cap_dshow.cpp文件,在約110行左右#include "DShow.h"上面添加#define NO_DSHOW_STRSAFE,而後從新Configure-Generate-mingw32-make。編譯debug版本出現該錯誤時在cap_dshow.cpp文件中添加#define STRSAFE_NO_DEPRECATE
cap_msmf.cpp文件出錯,43%左右
這裏寫圖片描述
解決:打開 cmake-gui ,不勾選WITH_MSMF,而後從新Configure-Generate-mingw32-make

生成的OpenCV庫

編譯完成後,生成的庫在H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin目錄下
這裏寫圖片描述

Qt+OpenCV測試

添加OpenCV庫到環境變量

添加 H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin到系統環境變量(Path)中

測試代碼 在.pro文件中添加頭文件路徑和庫路徑: INCLUDEPATH += H:\opencv3.4.3\buildOpencv\install\include

LIBS += H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_core343.dll \    

H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_highgui343.dll \    

H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_imgcodecs343.dll \    

H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_imgproc343.dll \   

  H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_features2d343.dll \    

H:\opencv3.4.3\buildOpencv\install\x86\mingw\bin\libopencv_calib3d343.dll

mainwindow.cpp:

include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // read an image,Mat是基礎圖像容器
    cv::Mat image = cv::imread("H:/test_rec/qt.jpg", 1);
    // create image window named "My Image"
    cv::namedWindow("My Image");
    // show the image on window
    cv::imshow("My Image", image);
}

MainWindow::~MainWindow()
{
    delete ui;
}

注意:若是構建項目時使用影子構建(即構建目錄與項目目錄非同一目錄),則須要將.pro裏引入的庫拷貝到可執行文件所在目錄,不然運行程序會異常結束(由於找不到庫),若是沒有使用影子構建則能夠直接運行。
這裏寫圖片描述

運行結果:
這裏寫圖片描述

相關文章
相關標籤/搜索