這裏編譯的是最新版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%)之後執行安裝命令,會在相關目錄下生產庫文件。
編譯錯誤
編譯過程中可能會遇到下面的錯誤:
多線程編譯錯誤,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裏引入的庫拷貝到可執行文件所在目錄,否則運行程序會異常結束(因爲找不到庫),如果沒有使用影子構建則可以直接運行。
運行結果: