QT開發中經常遇到使用OpenCV,記錄一下OpenCV庫的編譯調用過程。
環境:Window10 64位
一、安裝軟件:1、OpenCV 2、CMake 3、QT
1、安裝OpenCV 3.4.7
下載地址:https://opencv.org/releases/ opencv-4.3.0-vc14_vc15.exe
安裝OpenCV很簡單,其實就是一個解壓動作,解壓到非中文目錄下,我的目錄是C:\OpenCV3.4.7
2、安裝QT5.5.0
qt-opensource-windows-x86-mingw492-5.5.0.exe
下載地址:http://download.qt.io/archive/qt/
我下載的是5.5帶MinGW版本,安裝沒什麼好講的,直接下一步,下一步,完成
3、安裝CMake3.18
cmake-3.18.0-rc2-win64-x64.msi
下載地址:https://cmake.org/download/
安裝時注意選擇添加到系統變量,其它默認一路下一步,直到完成
二、配置環境變量
C:\Program Files\CMake\bin CMake環境變量
C:\Qt\Qt5.5.0\Tools\mingw492_32\bin MinGW環境變量
三、配置編譯OpenCV
打開剛纔安裝的CMake
設置OpenCV源碼路徑
設置OpenCV編譯輸出路徑(自建目錄)
然後點擊下面的Configure按鈕,彈出窗口中的<指定該項目的生成器>選擇MinGW Makefiles,下面單選框選擇Specify native compilers,單擊下一步;
彈出窗口,選擇C和C++編譯器的目錄,在QT5.5目錄中tools目錄裏的MinGW工具裏,單Finish完成
紅色行爲有錯誤,按下面的信息修改就行了,第一次點配置按鈕,要很長時間,更改後重新單擊配置按鈕,直到沒有錯誤
選中“WITH_OPENGL”、“WITH_QT”,將“WITH_IPP”取消。然後再次點【Configure】
Qt5_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw492_32/lib/cmake/Qt5
QT_QMAKE_EXECUTABLE 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/bin/qmake.exe
Qt5Concurrent_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5Concurrent
Qt5Core_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5Core
Qt5Gui_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5Gui
Qt5Test_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5Test
Qt5Widgets_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5Widgets
Qt5OpenGL_DIR 值爲:C:/Qt/Qt5.5.0/5.5/mingw53_32/lib/cmake/Qt5OpenGL
當信息顯示Configuring done且沒有錯誤時,單擊generate按鈕,生成完畢後,先不要關閉CMake如果後面編譯有錯誤,還要更改配置。
下面開始用MinGW來編譯OpenCV
使用管理員模式打開CMD
cd 到剛纔CMake生成的源碼目錄(就是之前自己新建的文件夾),準備編譯
輸入“mingw32-make”命令,如果提示找不到命令啥的,看看文章前面的MinGW系統變量是不是沒有設置,目錄爲C:\Qt\Qt5.5.0\Tools\mingw492_32\bin,根據你的QT安裝位置設置環境變量
按回車進行編譯
哦霍
一片綠油油後出現error
錯誤1
[ 40%] Building RC object modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
gcc: error: long: No such file or directory
解決方法:在cmake裏面找到OPENCV_ENABLE_ALLOCATOR_STATS或者在search裏面搜索,然後把後面的勾選去掉,接着Configure和Generate後,接着在cmd窗口中mingw32-make即可繼續編譯。
錯誤2
C:\OpenCV3.4.7\modules\videoio\src\cap_dshow.cpp:2298:41: error: 'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintf
A' was not declared in this scope
C:\OpenCV3.4.7\modules\videoio\src\cap_dshow.cpp中添加
#define STRSAFE_NO_DEPRECATE
錯誤3
chmod’ 不是內部或外部命令,也不是可運行的程序 或批處理文件
if(NOT CMAKE_HOST_WIN32) # chmod may be not available on Win32/MinGW (and it is not required)
set(_pch_prepare_command COMMAND chmod +x "${_pch_generate_file_cmd}")
endif()
ADD_CUSTOM_COMMAND(
OUTPUT "${_output}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${_outdir}"
COMMAND chmod +x "${_pch_generate_file_cmd}"
${_pch_prepare_command}
錯誤4
報錯文件test_hdr.cpp
error: 'time' was not declared in this scope
在頭部引用一下
#include <sys/time.h>
錯誤5
錯誤行:C:/OpenCV3.4.7Build/modules/dnn/test_precomp.hpp:50:27: fatal error: test_common.hpp: No such file or directory
#include "test_common.hpp"
把C:\OpenCV3.4.7\modules\dnn\test\test_common.hpp複製到C:\OpenCV3.4.7Build\modules\dnn\
經過個把小時綠油油輸出後,編譯完成。
編譯成功後,再輸入mingw32-make install,回車運行
安裝完成
將編譯生成目錄中的bin目錄添加到系統變量
C:\OpenCV3.4.7Build\bin
四、QT調用測試
打開QT新建一個工程
在xxx.pro中添加
INCLUDEPATH+="C:\OpenCV3.4.7Build\install\include"
INCLUDEPATH+="C:\OpenCV3.4.7Build\install\include\opencv"
INCLUDEPATH+="C:\OpenCV3.4.7Build\install\include\opencv2"
LIBS += C:\OpenCV3.4.7Build\lib\libopencv_*.a
在main.cpp中添加
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
//聲明IplImage指針
IplImage *pImg;
//載入圖片
pImg = cvLoadImage("D:\\0200626235750.jpg", 1);
//創建窗口
cvNamedWindow("Image",1);
//顯示圖像
cvShowImage("Image",pImg);
//等待按鍵
cvWaitKey(0);
//銷燬窗口
cvDestroyWindow("Image");
//釋放圖像
cvReleaseImage(&pImg);
}
運行程序,如果顯示如下圖,則調用成功