安装环境
- win10 64位
- Qt-6.2.1
- OpenCV-4.5.5
- cmake-3.22.2
- MinGW–W64 GCC-8.1.0 x86_64-posix-seh
首先安装QT6
QT6仅支持在线安装器安装,下载地址:QT6在线安装器
安装MinGW–W64
注意,这里必须安装64位即win64的Mingw,即mingw-w64 8.1.0,否则不支持thread,如果Mingw是32位的则编译时会报错,类似thread和mutex不能使用,如果出现类似错误,务必重新下载mingw-w64
下载地址:https://sourceforge.net/projects/mingw-w64/files/,不要点中间的download,网页继续往下拉,点这个下载:
注意文件名,不要下错了!
下载后解压即可,注意把bin文件夹添加PATH环境变量。
下载cmake
cmake是用来编译opencv的,下载地址:https://cmake.org/download/,如果你是windows64位,选择这个安装包下载
下载opencv
由于官网的windows版的opencv是使用vc编译器来编译的,并不适用与mingw编译器,因此需要我们自己来编译,首先进入官网下载opencv的source文件:https://opencv.org/releases/
编译opencv
下载后,将opencv文件解压到一个不含中文且不含空格的文件夹(否则编译时会报错),打开cmake-gui,下面根据自己需求这样填:
点击configure
如果出现https_connection_error,则需要添加代理服务器:添加环境变量https_proxy
,如果是socks5,则格式为socks5://127.0.0.1:10808
。然后多次configure,不断修改直到红色项目全去掉。如果你是qt6的话,编译选项如下所示,注意WITH_QT
和WITH_OPENGL
打上勾就可以了,test有关的可以去掉,根据你的路径适当修改:
编译时报错
点击generate,在build文件夹下执行命令mingw32-make -j8进行编译
编译过程中出现如下报错:
CMakeFiles\opencv_highgui.dir/objects.a(window_QT.cpp.obj):window_QT.cpp:(.text$_ZN14OpenGlViewPort12initializeGLEv+0xd): undefined reference to `__imp_glHint'
CMakeFiles\opencv_highgui.dir/objects.a(window_QT.cpp.obj):window_QT.cpp:(.text$_ZN14OpenGlViewPort8resizeGLEii+0xd): undefined reference to `__imp_glViewport'
CMakeFiles\opencv_highgui.dir/objects.a(window_QT.cpp.obj):window_QT.cpp:(.text$_ZN14OpenGlViewPort7paintGLEv+0xf): undefined reference to `__imp_glClear'
错误做法
分析后发现,报错的这几个变量都是gl开头,说明和opengl有很大关联,于是,我在cmake的standard libaray上加上了-lopengl32
注意!!!这样虽然可以编译通过,但是QT在导库编译程序时会报错,直接crash,暂不知原因,可能是这样编译出来的库文件存在问题。
正确做法
编译到这里出错后,打开文件夹opencv-build\modules\highgui\CMakeFiles\opencv_highgui.dir
打开文件linklibs.rsp,这里加上-lopengl32,保存文件,返回根目录重新敲命令继续编译即可编译成功
安装opencv
使用命令mingw32-make install
即可安装opencv,安装后默认会保存在编译根目录的build文件夹下
QT中使用opencv库
修改xxx.pro文件,格式如下:(这里我是QT控制台项目,所以没有GUI,不能imshow(),仅做测试)
QT -= gui
CONFIG += c++11 console
CONFIG -= app_bundle
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
INCLUDEPATH += \
"E:\ProgramData\opencv\opencv-build\install\include"
LIBS += -LE:\ProgramData\opencv\opencv-build\install\x64\mingw\lib \
-lopencv_core455 \
-lopencv_highgui455 \
-lopencv_imgcodecs455 \
-lopencv_imgproc455 \
-lopencv_features2d455 \
-lopencv_calib3d455
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
注意添加的INCLUDEPATH
和LIBS
,这些文件都在你的编译的根目录的install文件夹下
教程到这里就结束了,断断续续研究了好几天,每个人遇到的问题可能都不一样,我遇到的这个编译的问题内外网都没有找到解决办法,是自己琢磨出来的,不过我的经历至少可以证明这个东西是肯定的可以搞成的,祝大家编译顺利吧!