Qt之CMake和MinGW編譯OpenCV

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

編譯環境

  • win10-64bit
  • Qt5.9.4
  • MinGW-5.3.0-32bit
  • CMake-3.12.1
  • OpenCV-3.4.3

相關軟件下載地址

Qt下載地址:http://download.qt.io/archive/qt/5.9/
CMake下載地址:https://cmake.org/download/
OpenCV下載地址:https://opencv.org/releases.html#
這裏寫圖片描述
此處下載安裝包(Win pack)和源碼(Sources)均可,配置時選擇的目錄不同。
這裏寫圖片描述

其它地址

OpenCV官網:https://opencv.org/
OpenCV官方教程:https://docs.opencv.org/3.4/d9/df8/tutorial_root.html

添加環境變量

  • H:\cmake\bin
  • D:\Qt\Qt5.9.4\5.9.4\mingw53_32\bin
  • D:\Qt\Qt5.9.4\Tools\mingw530_32\bin

OpenCV編譯步驟

在opencv安裝的同級目錄下創建文件夾buildOpencv,用來存放構建文件及生產的庫。
這裏寫圖片描述
Qt官方編譯步驟文檔:https://wiki.qt.io/How_to_setup_Qt_and_openCV_on_Windows

編譯前配置

1、打開 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即可。

2、在彈窗裏設置編譯器目錄,然後點擊Finish:

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

這裏寫圖片描述

3、點擊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%)之後執行安裝命令,會在相關目錄下生產庫文件。

編譯錯誤

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

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

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

  3. 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

  4. 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裏引入的庫拷貝到可執行文件所在目錄,否則運行程序會異常結束(因爲找不到庫),如果沒有使用影子構建則可以直接運行。
這裏寫圖片描述

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章