Qt5.9 OpenCV3.4 下进行摄像头人脸检测的实现

如果你想体验一下我们的小工程,可以打开这个zip文件。

请将两个文件在同一目录下运行,且确保摄像头存在且开启!

M4CamerRelease.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编译器

wingw编译器路径

首先找到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的开发了!