如果你想体验一下我们的小工程,可以打开这个zip文件。
请将两个文件在同一目录下运行,且确保摄像头存在且开启!
代码库 UESTC-ProjectM4 CameraRecord
Qt5.9 OpenCV3.4 下进行摄像头人脸检测的实现
为了让摄像头识别项目功能更加强大,且更加接近使用的程度。为此我研究了Qt下使用OpenCV。
环境版本
- Qt版本:Qt5.9.7
- Qt Creater版本:4.7.1
- OpenCV版本:3.4.8
- cmake版本:3.17.3
开发环境编译
确认Qt编译器
首先找到Qt的MinGW的C++和C编译器的目录
可以看到编译器放在D:\Qt\Qt5.9.7\Tools\mingw530_32\bin的目录下
配置CMake
为了对应版本的Qt和OpenCV最大程度上适配,我们需要自己用qt编译一个OpenCV版本。打开cmake-GUI界面填写OpenCV源代码,填写一个需要编译的地方。这里我新建了buildQt的文件夹存放编译出来的文件。
勾上Advancad选项让我们选择可以填写更多路径
点击Configure,弹出配置框,选择用MinGW Makefile文件作为项目的generator并选择Specify native comilers。
在Compilers里面填写步骤a确认到的Qt使用的MinGW的C和C++的位置。点击Finish完成编译配置。
第一次配置Cmake时候,会失败跳出Error in configuration process,project files may be invalid错误。这个时候在Cmake列表控件中,找到CMAKE_MAKE_PROGRAM这一项。填入和MinGW的C编译器同一目录下的mingw32-make.exe的地址即可。
配置完成后,再一次点击Configure文件,如果报故“由于找不到libwinpthread-1.dll,无法继续执行代码”,Qt\Tools\mingw530_32\bin下的libwinpthread-1.dll复制到
32位系统放入:C:\Windows\System32
64位系统放入:C:\Windows\SysWOW64
配置通过即可。
此时,配置通过,但需要将勾选WITH_OPENGL、WITH_QT、ENABLE_CXX11三项。并将WITH_OPENCL_D3D11_NV勾选状态去除。
以下选项只会在勾选WITH_QT后才会出现,OpenCV给QT预留了编译配置这样方便了我们编译自己的开发环境。在Qt5Concurrent_DIR,Qt5Core_DIR,Qt5Gui_DIR,Qt5Test_DIR,Qt5Widgets_DIR,Qt5OpenGL_DIR,它们的Value分别填写为:
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5Concurrent
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5Core
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5Gui
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5Test
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5Widgets
Qt5.9.7/5.9.7/mingw53_32/lib/cmake/Qt5OpenGL
再次configure,此时我们可以看到Configuring done。
新版本的OpenCV的Makefile需要自行选择生成的install目录,需要自行填写。
点击Generate,等待generating done。这样我们就完成了CMake的配置,我们就可以用Qt的MinGW编译我们的OpenCV版本,这样开发环境的契合度将会大大提高。
MinGW编译
我们将Qt\Tools\mingw530_32\bin\mingw32-make.exe复制到我们配置好的文件夹里面也就是bulidQt这个文件夹里面,mingw32-make.exe这是Qt官方给make工具,我们可以在目录下按住Shift点击右键的方法打开我们的PowerShell控制台。在控制台中输入 .\mingw32-make.exe运行make工具
编译时会遇到报错,error: ‘sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA’ was not declared in this scope这是因为没有宏定义这个变量导致的。根据GitHub上这一版本这一问题的讨论可以得知,需要修改在OpenCV的源代码的模块\modules\videoio\src\cap_dshow.cpp文件。在#include “DShow.h”这行的上面加一行#define NO_DSHOW_STRSAFE就可以了。再次运行make工具。
为了让编译加速,根据电脑CPU性能可以在命令后面加上 -j 8 的参数,这个意思是生成8个线程,同时用8个线程进行编译。
就完成了Qt的MinGW的OpenCV编译工作。
安装编译好的开发环境
在PowerShell下输入mingw32-make install,等待安装完成,完成安装后会生成到我们步骤b中选择的install文件夹。
Qt5配置OpenCV
首先找到3部分文件,静态库(.lib文件),动态库(.a文件)(VS的为.dll),头文件。
- 静态库文件位于通过CMAKE生成好的OpenCV文件夹内,示例路径为: opencv\buildQt\lib
- 动态库文件位于通过CMAKE生成好的OpenCV文件夹内,示例路径为:opencv\buildQt\bin
- 头文件位于通过CMAKE生成好的OpenCV文件夹内,示例路径为:opencv\buildQt\install\include
为了方便可以将动态链接库和可执行程序文件复制到Qt的编译器下面。
- 将Opencv\buildQt\lib内所有文件复制到9.7\mingw53_32\mingw53_32\lib下
- 将Opencv\buildQt\bin内所有文件复制到9.7\mingw53_32\mingw53_32\bin下
在5.9.7\mingw53_32\inclule下创建一个文件夹名称为OpenCV,
并将Opencv\buildQt\install\include内所有文件复制到这一文件夹下
项目中调用Opencv
只要在项目文件中的项目文件 .pro文件下加入
LIBS += D:\opencv3.4.8\opencv\buildQt\install\x86\mingw\lib\libopencv_*.a
INCLUDEPATH += D:\opencv3.4.8\opencv\buildQt\install\include
就可以进行Qt加OpenCV的开发了!