這里編譯的是最新版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
速查表:https://docs.opencv.org/3.0-last-rst/opencv_cheatsheet.pdf
添加環境變量
-
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里引入的庫拷貝到可執行文件所在目錄,否則運行程序會異常結束(因為找不到庫),如果沒有使用影子構建則可以直接運行。
運行結果: