Opencv4基于C++的 实时人脸检测

news2024/11/26 4:36:51

文章目录:

一:环境配置搭建(VS2015+Opencv4.6)

二:下资源文件

第一种:本地生成

第二种 直接下载

三:代码展示

窗口布局

main.cpp

test.h

test.cpp


效果图◕‿◕✌✌✌:opencv人脸识别效果图(请叫我真爱粉)

一:环境配置搭建(VS2015+Opencv4.6)

OpenCV4基于C++基础入门笔记:OpenCV环境配置搭建

二:下资源文件

第一种:本地生成

第一步:进入自己的文件夹
        D:\OpenCV\opencv\sources\samples\dnn\face_detector


第二步:cmd命令行进入改目录下面去
        cd /d D:\OpenCV\opencv\sources\samples\dnn\face_detector

第三步:输入执行命令(如果你的目录下面没有download_weights.py文件夹,用第二种方法)
        Python download_weights.py

第二种 直接下载

地址:data——>modelsa——>face_detector文件夹下载

 

三:代码展示

窗口布局

main.cpp

#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}


    //在主函数中调用创建的类对象	
    QuickDemo qd;

	    //实时人脸检测
	    qd.face_detection_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

test.h

#include<opencv2/opencv.hpp>
using namespace cv;

//创建一个QuickDemo对象
class QuickDemo 
{
	public:

		//实时人脸检测
		void QuickDemo::face_detection_demo(Mat &image);
};

test.cpp

#include<test.h>
#include<opencv2/dnn.hpp> 

//命名空间
using namespace cv;
using namespace std;



//实时人脸检测
void QuickDemo::face_detection_demo(Mat &image) {
	//自己opencv的face_detector文件夹路径
	std::string root_dir = "D:/OpenCV/opencv/sources/samples/dnn/face_detector/";

	//读取以TensorFlow框架格式存储的网络文件
		//opencv_face_detector_uint8.pb模型		opencv_face_detector.pbtxt配置文件
	dnn::Net net = dnn::readNetFromTensorflow(root_dir + "opencv_face_detector_uint8.pb", root_dir + "opencv_face_detector.pbtxt");

	//第一种:对本地视频进行识别
		//自己视频的地址
		VideoCapture capture("F:/images/kunkun.mp4");
	//第二种:摄像头进行人脸检测
		//VideoCapture capture(0);

	// 定义一个Mat对象,用于存储捕获到的视频帧
	Mat frame;
	while (true) {
		// 从摄像头捕获一帧视频,并将捕获到的视频帧传入frame
		capture.read(frame);

		// 如果捕获到的视频帧为空,跳出循环
		if (frame.empty()) {
			break;
		}

		//左右翻转
		//flip(frame, frame, 1);

		//DNN模块从图像创建blob的过程:从给定的图像帧创建一个blob,该blob可以用于深度学习模型的输入
			//参数:输入的图像帧,图像缩放的因子,图像裁剪的大小,图像的色彩空间转换,后面2个参数是确定图像是否需要进行翻转或旋转的标记
		Mat blob = dnn::blobFromImage(frame, 1.0, Size(300, 300), Scalar(104, 177, 123), false, false);

		// 设置深度学习模型的输入:将blob作为模型的输入。blob是一个包含了图像数据的矩阵,通常用于模型的输入层
		net.setInput(blob);			

		//是OpenCV中DNN模块的一个函数,用于前向传播计算模型的输出
		Mat probs = net.forward();	//计算模型的预测结果

		//从预测结果中获取人脸检测的矩阵
		//新的Mat对象detectionMat:它的大小是probs的第二维和第三维的大小,数据类型为32位浮点数(对应于OpenCV中的CV_32F)
		Mat detectionMat(probs.size[2], probs.size[3], CV_32F, probs.ptr<float>());
			
		// 解析检测结果,对每一个检测到的人脸进行处理
		for (int i = 0; i < detectionMat.rows; i++) {

			//从detectionMat矩阵中提取第i行、第2列的元素,并将其存储在confidence变量中
			// 获取检测到的人脸的概率(即得分),如果得分大于0.5,则认为检测到了人脸
			float confidence = detectionMat.at<float>(i, 2);	// 第三个值 得分

			if (confidence > 0.5) {
				// 因为预测来的值为[0,1]范围的数,我们还需要*原图像的宽度和长度,得到实际的位置坐标

				//从detectionMat中获取第i行、第3列的元素,也就是每个检测到的对象的置信度(confidence)
				//这是深度学习模型输出的一个值,表示模型对检测结果的信任程度
					//第1个坐标的起始位置
						//表示1个坐标或边界的起始位置的x坐标。
						int x1 = static_cast<int>(detectionMat.at<float>(i, 3)*frame.cols);	//frame.cols帧的列数
						//表示1个坐标或边界的起始位置的y坐标。
						int y1 = static_cast<int>(detectionMat.at<float>(i, 4)*frame.rows);
					//第2个坐标的起始位置
						int x2 = static_cast<int>(detectionMat.at<float>(i, 5)*frame.cols);
						int y2 = static_cast<int>(detectionMat.at<float>(i, 6)*frame.rows);

				// 在原图像上画出检测到的人脸的位置框,并用红色边框显示出来
					//左上角坐标(x1,y1)和右下角坐标(x2,y2)
					Rect box(x1, y1, x2 - x1, y2 - y1);
					//画矩形:原始图像,坐标,红色,线条宽度为2,线条类型为8,没有填充
					rectangle(frame, box, Scalar(0, 0, 255), 2, 8, 0);
			}
		}



		imshow("人脸检测演示", frame);
		int c = waitKey(1);
		if (c == 27) { 
			break;// 退出
		}
	}
	capture.release();	//释放资源
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运算器组成实验

1.实验目的及要求 实验目的 1、熟悉双端口通用寄存器组的读写操作。 2、熟悉运算器的数据传送通路。 3、验证运算器74LS181的算术逻辑功能。 4、按给定数据&#xff0c;完成指定的算术、逻辑运算。 实验要求 1、做好实验预习。掌握运算器的数据传送通路和ALU的功能特性&…

7.3.tensorRT高级(2)-future、promise、condition_variable

目录 前言1. 生产者消费者模式2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-future、promise…

【算法——双指针】LeetCode 1089 复写零

千万不要被这道题标注着“简单”迷惑了&#xff0c;实际上需要注意的细节很多。 题目描述&#xff1a; 解题思路&#xff1a; 正序遍历&#xff0c;确定结果数组的最后一个元素所在的位置&#xff1b;知道最后一个元素的位置后倒序进行填充。 先找到最后一个需要复写的数 先…

C++ 泛型编程:函数模板

文章目录 前言一、什么是泛型编程二、函数模板三、函数模板的使用四、多参数函数模板五&#xff0c;示例代码&#xff1a;总结 前言 当需要编写通用的代码以处理不同类型的数据时&#xff0c;C 中的函数模板是一个很有用的工具。函数模板允许我们编写一个通用的函数定义&#…

php从静态资源到动态内容

1、从HTML到PHP demo.php:后缀由html直接改为php,实际上当前页面已经变成了动态的php应用程序脚本 demo.php: 允许通过<?php ... ?>标签,添加php代码到当前脚本中 php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析 <!DOCTYPE html>…

Qt中将信号封装在一个继承类中的方法

QLabel标签类对应的信号如下&#xff1a; Qt中标签是没有双击&#xff08;double Click&#xff09;这个信号的&#xff1b; 需求一&#xff1a;若想双击标签使其能够改变标签中文字的内容&#xff0c;那么就需要自定义一个“双击”信号&#xff0c;并将其封装在QLabel类的派生…

使用vscode写vue文件代码有时不提示

背景&#xff1a; 安装了volar插件&#xff0c;但是在vue文件中导入js文件代码不提示&#xff0c;准确来说是有时提示有时不提示 解决方案&#xff1a; 插件冲突&#xff0c;卸载 JavaScript (ES6) code snippets 插件&#xff0c;这个插件在vue文件中适配不是很好。 很有可能…

【正版系统】2023热门短剧SAAS版开源 | 小程序+APP+公众号H5

当我们在刷百度、D音、K手等各种新闻或短视频时经常会刷到剧情很有吸引力的短剧广告&#xff0c;我们点击广告链接即可进入短剧小程序&#xff0c;小程序运营者通过先免费看几集为诱耳然后在情节高潮时弹出充值或开VIP会员才能继续看的模式来赚钱&#xff0c;以超级赘婿、乡村小…

电影数据可视化综合分析

数据可视化&分析实战 1.1 沈腾参演电影数据获取 1.2 电影数据可视化分析 目录 数据可视化&分析实战前言1. 数据认知2. 数据可视化2.1 解决matplotlib不能绘制中文字符的问题2.2 折线图2.3 柱状图绘制2.4 箱线图绘制2.5 饼图 3. Na值处理及相关性分析3.1 相关性分析3.2…

2023.08.13 学习周报

文章目录 摘要文献阅读1.题目2.要点3.问题4.解决方案5.本文贡献6.方法6.1 特征选择6.2 时间序列平稳性检测与数据分解6.3 基于GRU神经网络的PM2.5浓度预测 7.实验7.1 网络参数7.2 实验结果7.3 对比实验 8.讨论9.结论10.展望 PINNS模型1.自动微分2.全连接神经网络3.PINNs模型的P…

NavMeshPlus 2D寻路插件

插件地址:h8man/NavMeshPlus&#xff1a; Unity NavMesh 2D Pathfinding (github.com) 我对Unity官方是深恶痛觉,一个2D寻路至今都没想解决,这破引擎早点倒闭算了. 这插件是githun的开源项目,我本身是有写jps寻路的,但是无法解决多个单位互相阻挡的问题(可以解决但是有性能问…

Yolov5(一)VOC划分数据集、VOC转YOLO数据集

代码使用方法注意修改一下路径、验证集比例、类别名称&#xff0c;其他均不需要改动&#xff0c;自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下&#xff0c;大家可以直接修改相应的配置文件进行训练。 目录 使用方法&#xff1a; 全部代码…

Window停止更新操作

在这里插入图片描述

Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

我们在做Android平台RTMP推送和GB28181设备对接的时候&#xff0c;遇到这样的问题&#xff0c;有的设备&#xff0c;麦克风采集出来的audio&#xff0c;音量过高或过低&#xff0c;特别是有些设备&#xff0c;采集到的麦克风声音过低&#xff0c;导致播放端听不清前端采集的aud…

1216. 验证回文字符串 III;764. 最大加号标志;1135. 最低成本联通所有城市

1216. 验证回文字符串 III 核心思想&#xff1a;动态规划&#xff0c;这题需要一个思路的转换&#xff0c;删除最多k个字符判断是否为回文串&#xff0c;就相当于问你子序列中最长的回文串的长度是否比n-k长,就将这题转换为了最长回文子序列。 764. 最大加号标志 核心思想&am…

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Shader 编程:三角形、矩形等多边形绘制

该原创文章首发于微信公众号&#xff1a;字节流动 未经作者&#xff08;微信ID&#xff1a;Byte-Flow&#xff09;允许&#xff0c;禁止转载 SDF 有向距离场 上节其实牵扯到 SDF 算法&#xff0c;因为后面涉及高级特效的时候会经常用到&#xff0c;这里先提前对它做个简单的介…

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区&#xff0c;因为当前地域下的可用区可能不支持备案&#xff0c;阿里云百科分享提醒大家&#xff0c;如果你的购买的云服务器搭建网站应用&#xff0c;网站域名需要使用这台云服务器备案的话&#xff0c;不要随机分配可用区&…

从源码分析常见集合的区别之List接口

说到Java集合&#xff0c;共有两大类分别是Collection和Map。今天就详细聊聊大家耳熟能详的List吧。 List接口实现自Collection接口&#xff0c;是Java的集合框架中的一员&#xff0c;List接口下又有ArrayList、LinkedList和线程安全的Vector&#xff0c;今天就简单分析一下Ar…

力扣刷题(C++)知识点

一&#xff0c;找到数组的中间位置 这个是错的&#xff0c;不能分开来 C vector<int>& nums 用法 创建一维数组vector&#xff1a; vector<int> nums; //不指定长度vector<int> nums(n); //指定长度为n c &#xff1c;numeric&#xff1e; accumul…