使用OpenCV中的DNN模块进行人脸识别的官方示例代码(C++版本):

chatgpt生成


#include "mainwindow.h"
#include <QApplication>

#include <opencv2/core.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace dnn;//using namespace dnn; 是一个命名空间声明,用于导入命名空间 dnn 中的所有标识符,以便在当前作用域中直接使用该命名空间中的成员,而无需使用限定符。

int main(int argc, char *argv[])
{


QApplication a(argc, argv);
// 加载模型和配置文件
String model_path ="C:/Users/Administrator/Desktop/face/opencv_face_detector_uint8.pb";
String config_path = "C:/Users/Administrator/Desktop/face/opencv_face_detector.pbtxt";
Net net = readNetFromCaffe(config_path, model_path);

// 读取输入图像
Mat image = imread("E:/00.jpg");

// 构建blob,将图像输入模型中进行预处理
Mat blob = blobFromImage(image, 1.0, Size(300, 300), Scalar(104.0, 177.0, 123.0));

// 设置输入blob
net.setInput(blob);

// 运行前向传播,获取人脸检测结果
Mat detections = net.forward();

// 遍历检测结果
for (int i = 0; i < detections.size[2]; i++)
{
float confidence = detections.at<float>( i, 2); // 获取置信度 ,i是行索引,2是列索引 //用于访问一个名为 detections 的矩阵或数组中的元素值。

// 根据表达式的写法来看,detections 应该是一个浮点类型的矩阵或数组。.at<float>(i, 2) 则表示获取矩阵 detections 的第 i 行、第 2 列的浮点数值。
if (confidence > 0.5) // 设置置信度阈值
{
// 计算人脸框的位置
int startX = static_cast<int>(detections.at<float>( i, 3) * image.cols);//强制类型转换(cast)表达式,用于将浮点型的值转换为整型。

int startY = static_cast<int>(detections.at<float>( i, 4) * image.rows);
int endX = static_cast<int>(detections.at<float>( i, 5) * image.cols);
int endY = static_cast<int>(detections.at<float>( i, 6) * image.rows);

// 绘制人脸框和置信度
String text = format("%.2f%%", confidence * 100);//目的是将置信度 confidence 转换为带两位小数的百分比字符串。例如,如果 confidence 的值为 0.85,那么通过这行代码得到的结果将是 "85.00%"。confidence 是一个浮点数,表示某个事件或预测的置信度,范围通常为 0 到 1。confidence * 100 将置信度乘以 100,将其转换为百分比形式。format("%.2f%%", ...) 是一个格式化字符串的操作,其中 "%.2f" 表示保留两位小数的浮点数格式,"%%" 表示输出一个百分号。
int y = startY - 10 > 10 ? startY - 10 : startY + 10;//startY - 10 > 10 是一个条件判断,判断 startY - 10 是否大于 10。如果这个条件成立(即 startY - 10 大于 10),则表达式的值为 startY - 10。如果这个条件不成立(即 startY - 10 不大于 10),则表达式的值为 startY + 10。
rectangle(image, Point(startX, startY), Point(endX, endY), Scalar(0, 255, 0), 2);//使用了 OpenCV 库中的函数 rectangle(),用于在图像上绘制矩形。rectangle() 是一个函数,用于在图像上绘制矩形。image 是要绘制矩形的图像对象。Point(startX, startY) 表示矩形的左上角坐标。Point(endX, endY) 表示矩形的右下角坐标。Scalar(0, 255, 0) 表示矩形的边框颜色,这里使用了 RGB 颜色模式,(0, 255, 0) 表示绿色。2 表示矩形的边框粗细。
putText(image, text, Point(startX, y), FONT_HERSHEY_SIMPLEX, 0.45, Scalar(0, 255, 0), 2);//用了 OpenCV 库中的函数 putText(),用于在图像上绘制文本。putText() 是一个函数,用于在图像上绘制文本。image 是要绘制文本的图像对象。text 是要绘制的文本内容。Point(startX, y) 表示文本的左下角坐标。其中 startX 是文本左下角的 x 坐标,y 是文本左下角的 y 坐标。FONT_HERSHEY_SIMPLEX 是文本的字体类型,表示使用简单字体。0.45 是文本的字体缩放因子,用于调整文本的大小。Scalar(0, 255, 0) 是文本的颜色,这里使用了 RGB 颜色模式,(0, 255, 0) 表示绿色。2 是文本的线宽,用于绘制文本的边框。
}
}

// 显示输出图像
imshow("Output", image);
waitKey(0);//是一个 OpenCV 中的函数,通常用于等待用户按下键盘上的某个键。waitKey() 是一个函数,用于等待键盘输入。0 表示等待时间,如果设置为 0,表示无限期等待,直到用户按下键盘上的某个键。当用户按下键盘上的某个键时,waitKey() 函数会返回被按下的键的 ASCII 值(整数)。
destroyAllWindows();//建议使用 destroyAllWindows() 来关闭这些窗口,释放系统资源。

return a.exec();//用于启动事件循环并执行主程序的主事件循环(event loop)。a 可能是一个 QApplication 或 QCoreApplication 的实例。exec() 是 Qt 框架中的一个函数,用于启动事件循环。a.exec() 表示执行 a 所属对象的事件循环,即运行 Qt 应用程序的主事件循环。一般情况下,程序会在调用 exec() 后进入一个消息循环,等待用户的输入、消息、事件等,以确保程序正常运行并响应用户的操作。
}


以上代码将从给定的模型文件和配置文件中加载人脸检测器,并对输入图像进行人脸检测,然后显示输出图像,并在检测到的人脸周围绘制边框和检测到的置信度。

posted @   blackstrom  阅读(509)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示