当前位置: 首页 > news >正文

Qt+Opencv:人脸检测

话接上一篇,我们仍使用在上篇《Qt+Opencv:Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。

在正式开始本篇之前,我们先说做一下准备工作:

一、opencv官方文档

学习最权威和最可靠的方式,就是阅读官方文档和实践模块samples。同样,opencv的文档个人觉得做的还是可以的,当然,相对于我们熟悉Qt开发的朋友来说,这帮助文档还是“略微逊色”。
上篇,我们选定opencv 3.4.16 版本进行工程实践,所以我们对应去看该版本的文档即可。
doc地址:https://docs.opencv.org/3.4.16/
在这里插入图片描述

有朋友会问3.0和4.0的版本有什么大的变化么,答案是我目前也不知道,后面在逐渐精进深入的过程中,版本特性比较,必然也是我们要做的工作之一。所谓知己知彼,百战不殆。手握神剑,当然要尽可能把圣剑之威力发挥的淋漓尽致。不过话说回来,opencv太大面太广,深入研究某一模块到极致就可惊为天人了,不必泛泛求全。但是,保持对知识的贪婪和饥渴,总能促使人不断的学习和进步。话说,作者写这篇的时候已经忘记吃饭。

二、下载源码和samples

地址:https://github.com/opencv/opencv/tree/3.4

在这里插入图片描述
data中有我们本章人脸检测的数据模型,需要拷贝到我们Qt自己的项目目录下。譬如作者自己的:
在这里插入图片描述

三、项目实践

#include <QApplication>
#include <opencv.hpp>
#include <QDebug>
#include <opencv2/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core.hpp>     // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>  // OpenCV window I/O
#include <opencv2/features2d.hpp>
#include <opencv2/objdetect.hpp>
#include <stdio.h>using namespace std;
using namespace cv;const string WindowName = "Face Detection example";class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector
{public:CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat &Image, std::vector<cv::Rect> &objects) CV_OVERRIDE{Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter() CV_OVERRIDE{}private:CascadeDetectorAdapter();cv::Ptr<cv::CascadeClassifier> Detector;};int main(int , char** )
{namedWindow(WindowName);VideoCapture VideoStream(0);if (!VideoStream.isOpened()){printf("Error: Cannot open video stream from camera\n");return 1;}/// 这里模型文件的路径一定要写对,按照各位的项目配置实际填写/// 可以使用绝对路径,也可以使用相对路径std::string cascadeFrontalfilename = samples::findFile("data/lbpcascades/lbpcascade_frontalface.xml");cv::Ptr<cv::CascadeClassifier> cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);cv::Ptr<DetectionBasedTracker::IDetector> MainDetector = makePtr<CascadeDetectorAdapter>(cascade);if ( cascade->empty() ){printf("Error: Cannot load %s\n", cascadeFrontalfilename.c_str());return 2;}cascade = makePtr<cv::CascadeClassifier>(cascadeFrontalfilename);cv::Ptr<DetectionBasedTracker::IDetector> TrackingDetector = makePtr<CascadeDetectorAdapter>(cascade);if ( cascade->empty() ){printf("Error: Cannot load %s\n", cascadeFrontalfilename.c_str());return 2;}DetectionBasedTracker::Parameters params;DetectionBasedTracker Detector(MainDetector, TrackingDetector, params);if (!Detector.run()){printf("Error: Detector initialization failed\n");return 2;}Mat ReferenceFrame;Mat GrayFrame;vector<Rect> Faces;do{VideoStream >> ReferenceFrame;   /// 获取每一帧图像cvtColor(ReferenceFrame, GrayFrame, COLOR_BGR2GRAY);Detector.process(GrayFrame);Detector.getObjects(Faces);  for (size_t i = 0; i < Faces.size(); i++){rectangle(ReferenceFrame, Faces[i], Scalar(0,255,0));  /// 人脸检测并绘制矩形}imshow(WindowName, ReferenceFrame);} while (waitKey(30) < 0);  /// 等待按键触发,退出检测loopDetector.stop();return 0;
}

四、效果演示(博主自爆了*)

在这里插入图片描述
下一张我们深入研究人脸检测(此模型只支持正脸)的实现,以及模型文件杂谈一二~

相关文章:

  • Unity | 快速修复Animation missing错误
  • Android 跨进程之间通信(IPC)方式之ContentProvider
  • 信号处理设计模式
  • 【Linux】修复 Linux 错误 - 权限被拒绝
  • Pycharm引用其他文件夹的py
  • docker学习(十九、network使用示例bridge)
  • 16-网络安全框架及模型-BiBa完整性模型
  • TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)
  • OpenGL FXAA抗锯齿算法(Qt)
  • css中的BFC
  • LLM应用的分块策略
  • 记矩阵基础概念
  • OSG读取和添加节点学习
  • 渗透测试 | php的webshell绕过方法总结
  • 《MySQL系列-InnoDB引擎01》MySQL体系结构和存储引擎
  • 0基础学习移动端适配
  • Bytom交易说明(账户管理模式)
  • Git初体验
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS笔记四:作用域、变量(函数)提升
  • Python语法速览与机器学习开发环境搭建
  • Vue实战(四)登录/注册页的实现
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于游标的分页接口实现
  • 微信小程序实战练习(仿五洲到家微信版)
  • Java性能优化之JVM GC(垃圾回收机制)
  • MPAndroidChart 教程:Y轴 YAxis
  • 阿里云服务器如何修改远程端口?
  • # include “ “ 和 # include < >两者的区别
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (利用IDEA+Maven)定制属于自己的jar包
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .Net 4.0并行库实用性演练
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core中Emit的使用
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .net下简单快捷的数值高低位切换
  • .net专家(张羿专栏)
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [Android]通过PhoneLookup读取所有电话号码
  • [C puzzle book] types
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [HCTF 2018]WarmUp (代码审计)
  • [IE9] 解决了傲游、搜狗浏览器在IE9下网页截图的问题
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [Java] 图说 注解
  • [json]定义、读写