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

2023-11-14

文章目录:

一:环境配置搭建(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();	//释放资源
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv4基于C++的 实时人脸监测 的相关文章

  • 为什么模板类的静态成员不唯一

    看一下下面的代码 include
  • 快速 log2(float x) 实现 C++

    我需要在 C 中非常快速地实现 log2 float x 函数 我发现了一个非常有趣的实现 而且速度非常快 include
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 基于多线程的 RabbitMQ 消费者

    我们有一个 Windows 服务 它监听单个 RabbitMQ 队列并处理消息 我们希望扩展相同的 Windows 服务 以便它可以监听 RabbitMQ 的多个队列并处理消息 不确定使用多线程是否可以实现这一点 因为每个线程都必须侦听 阻
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 在 T4 代码生成中,如何从引用的程序集中获取类型?

    由于 T4 在项目上下文之外运行 因此我无权访问当前程序集或其他程序集 如何注册对引用程序集的访问 然后从中获取类型 我猜您想访问项目中建筑物的程序集 我在下面的示例代码中所做的是将一个名为 TestLib 的项目添加到我的解决方案中 我将
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 我们什么时候应该在.NET中使用NativeMemory.Alloc()? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 NET6 C 引入NativeMemory类 但我不知道什么时候应该使用NativeMemory Alloc 而不是普通的数组实例化
  • 如何在控制器中使用多个 DBContext

    如何在控制器中使用多个 DBContext 我尝试以不同的方式重载构造函数 一些控制器 public C1 DBContext1 a DBContext2 b DBContext3 c public C1 DBContext1 a publ
  • 代码块 - 使用大地址感知标志进行编译

    如何使用以下命令在 64 位系统上编译 32 位应用程序LARGE ADRESS AWARE使用代码块标记 我需要使用超过 2GB 的内存 应该是添加的情况 Wl large address aware到链接标志 我不使用 CodeBloc
  • C# SignalR 异常 - 连接在收到调用结果之前开始重新连接

    我正在开发 2 个应用程序 第一个是 C 控制台应用程序 另一个是 Asp net Web 应用程序 我正在使用 SignalR 连接两者 这是我的 C 控制台应用程序 客户端 public class RoboHub public sta
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 在 C++ 中什么时候首选传递指针而不是引用传递?

    我可以想象一种情况 其中输入参数可以为 NULL 以便首选传递指针而不是传递引用 有人可以添加更多案例吗 在传递的对象实际上将被修改的情况下 有些人更喜欢传递指针 当对象通过引用传递时 它们使用 pass by const referenc
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include

随机推荐