OpenCV人脸识别C++代码实现Demo

        OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法。

        官网:https://opencv.org/

        Github:   https://github.com/opencv/opencv

        Gitcode: https://gitcode.net/opencv/opencv

        OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。

        OpenCV 4.5.4版本开始,DNN模块集成了高性能的人脸检测算法(使用模型YuNet,由OpenCV China团队贡献)和人脸识别算法(使用模型SFace,由北京邮电大学邓伟洪教授课题组贡献)。

1. 人脸检测

1.1 接口定义

        OpenCV基于深度学习的人脸检测FaceDetectorYN类定义如下

/** @brief DNN-based face detectormodel download link: https://github.com/opencv/opencv_zoo/tree/master/models/face_detection_yunet*/
class CV_EXPORTS_W FaceDetectorYN
{
public:virtual ~FaceDetectorYN() {}/** @brief Set the size for the network input, which overwrites the input size of creating model. Call this method when the size of input image does not match the input size when creating model** @param input_size the size of the input image*/CV_WRAP virtual void setInputSize(const Size& input_size) = 0;CV_WRAP virtual Size getInputSize() = 0;/** @brief Set the score threshold to filter out bounding boxes of score less than the given value** @param score_threshold threshold for filtering out bounding boxes*/CV_WRAP virtual void setScoreThreshold(float score_threshold) = 0;CV_WRAP virtual float getScoreThreshold() = 0;/** @brief Set the Non-maximum-suppression threshold to suppress bounding boxes that have IoU greater than the given value** @param nms_threshold threshold for NMS operation*/CV_WRAP virtual void setNMSThreshold(float nms_threshold) = 0;CV_WRAP virtual float getNMSThreshold() = 0;/** @brief Set the number of bounding boxes preserved before NMS** @param top_k the number of bounding boxes to preserve from top rank based on score*/CV_WRAP virtual void setTopK(int top_k) = 0;CV_WRAP virtual int getTopK() = 0;/** @brief Detects faces in the input image. Following is an example output.* ![image](pics/lena-face-detection.jpg)*  @param image an image to detect*  @param faces detection results stored in a 2D cv::Mat of shape [num_faces, 15]*  - 0-1: x, y of bbox top left corner*  - 2-3: width, height of bbox*  - 4-5: x, y of right eye (blue point in the example image)*  - 6-7: x, y of left eye (red point in the example image)*  - 8-9: x, y of nose tip (green point in the example image)*  - 10-11: x, y of right corner of mouth (pink point in the example image)*  - 12-13: x, y of left corner of mouth (yellow point in the example image)*  - 14: face score*/CV_WRAP virtual int detect(InputArray image, OutputArray faces) = 0;/** @brief Creates an instance of face detector class with given parameters**  @param model the path to the requested model*  @param config the path to the config file for compability, which is not requested for ONNX models*  @param input_size the size of the input image*  @param score_threshold the threshold to filter out bounding boxes of score smaller than the given value*  @param nms_threshold the threshold to suppress bounding boxes of IoU bigger than the given value*  @param top_k keep top K bboxes before NMS*  @param backend_id the id of backend*  @param target_id the id of target device*/CV_WRAP static Ptr<FaceDetectorYN> create(const String& model,const String& config,const Size& input_size,float score_threshold = 0.9f,float nms_threshold = 0.3f,int top_k = 5000,int backend_id = 0,int target_id = 0);/** @overload**  @param framework Name of origin framework*  @param bufferModel A buffer with a content of binary file with weights*  @param bufferConfig A buffer with a content of text file contains network configuration*  @param input_size the size of the input image*  @param score_threshold the threshold to filter out bounding boxes of score smaller than the given value*  @param nms_threshold the threshold to suppress bounding boxes of IoU bigger than the given value*  @param top_k keep top K bboxes before NMS*  @param backend_id the id of backend*  @param target_id the id of target device*/CV_WRAP static Ptr<FaceDetectorYN> create(const String& framework,const std::vector<uchar>& bufferModel,const std::vector<uchar>& bufferConfig,const Size& input_size,float score_threshold = 0.9f,float nms_threshold = 0.3f,int top_k = 5000,int backend_id = 0,int target_id = 0);};

1.2 性能指标

        人脸检测模型YuNet在WIDER Face数据集的验证集中达到了0.8871(Easy AP),0.8710(Medium AP),0.7681(Hard AP);

1.3 C++调用示例代码

// 第一步:导入相关头文件
#include <opencv2/imgproc.hpp> 
#include <opencv2/objdetect.hpp>  
using namespace cv; 
int main() {// 模型下载地址:https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunetString modelPath = "face_detection_yunet_2023mar.onnx";// 第二步:读取图像Mat img = imread("face.jpg");// 第三步:初始化FaceDetectorYNPtr<FaceDetectorYN> faceDetector = FaceDetectorYN::create(modelPath, "", img.size());// 第四步:检测人脸并将结果保存到一个Mat中Mat faces; faceDetector->detect(img, faces);// faces是一个nx15的二维Mat,每一行分别是:// [x1, y1, w, h, x_re, y_re, x_le, y_le, x_nt, y_nt, x_rcm, y_rcm, x_lcm, y_lcm, score]// 其中,x1, y1是人脸框左上角坐标,w和h分别是人脸框的宽和高;//      {x, y}_{re, le, nt, rcm, lcm}分别是人脸右眼瞳孔、左眼瞳孔、鼻尖、右嘴角和左嘴角的坐标;//       score是该人脸的得分。// ...return 0;
}

2. 人脸识别

2.1 接口定义

        OpenCV基于深度学习的人脸识别FaceRecognizerSF类定义如下

/** @brief DNN-based face recognizermodel download link: https://github.com/opencv/opencv_zoo/tree/master/models/face_recognition_sface*/
class CV_EXPORTS_W FaceRecognizerSF
{
public:virtual ~FaceRecognizerSF() {}/** @brief Definition of distance used for calculating the distance between two face features*/enum DisType { FR_COSINE=0, FR_NORM_L2=1 };/** @brief Aligning image to put face on the standard position*  @param src_img input image*  @param face_box the detection result used for indicate face in input image*  @param aligned_img output aligned image*/CV_WRAP virtual void alignCrop(InputArray src_img, InputArray face_box, OutputArray aligned_img) const = 0;/** @brief Extracting face feature from aligned image*  @param aligned_img input aligned image*  @param face_feature output face feature*/CV_WRAP virtual void feature(InputArray aligned_img, OutputArray face_feature) = 0;/** @brief Calculating the distance between two face features*  @param face_feature1 the first input feature*  @param face_feature2 the second input feature of the same size and the same type as face_feature1*  @param dis_type defining the similarity with optional values "FR_OSINE" or "FR_NORM_L2"*/CV_WRAP virtual double match(InputArray face_feature1, InputArray face_feature2, int dis_type = FaceRecognizerSF::FR_COSINE) const = 0;/** @brief Creates an instance of this class with given parameters*  @param model the path of the onnx model used for face recognition*  @param config the path to the config file for compability, which is not requested for ONNX models*  @param backend_id the id of backend*  @param target_id the id of target device*/CV_WRAP static Ptr<FaceRecognizerSF> create(const String& model, const String& config, int backend_id = 0, int target_id = 0);
};

2.2 性能指标

        人脸识别模型SFace在LFW数据集上达到了99.40%的准确率。

2.3 C++调用示例代码

2.3.1 人脸对齐

        将检测到的人脸输入人脸识别模型前,通常需要先进行人脸对齐。人脸对齐利用检测部分提取到的关键点,与给定关键点之间计算变换矩阵,使用仿射变换对人脸进行变换,以减轻人脸尺度、姿态等对人脸特征提取的性能的影响。

// 模型下载地址:https://github.com/opencv/opencv_zoo/tree/master/models/face_recognition_sface
String recog_model_path= "face_recognition_sface_2021dec.onnx";
// 初始化FaceRecognizerSF
Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(recog_model_path, "");// 在人脸检测部分的基础上, 对齐检测到的首个人脸(faces.row(0)), 保存至aligned_face。
Mat aligned_face;
faceRecognizer->alignCrop(image, faces.row(0), aligned_face);

2.3.2 人脸特征提取

        人脸识别模型以尺寸为3*112*112的人脸图像对齐作为输入,输出维度为128维的人脸特征。

// 在上文的基础上, 获取对齐人脸的特征feature。
Mat feature;
faceRecognizer->feature(aligned_face, feature);

2.3.3 人脸特征比对

        对于不同人脸图像的人脸特征,经过人脸特征比对求出特征之间的距离,以确定不同人脸图像是否属于同一身份。当使用consine距离时,值越大,则人脸越相似身份越接近;当使用normL2距离时,值越小,则人脸越相似身份越接近。

// 在上文的基础上, 比对两张人脸的特征feature1,feature2以确认身份。
// 使用consine距离作为指标
const double cosine_similarity_threshold = 0.363;
double cos_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_COSINE); 
if (cos_score >= cosine_similarity_threshold)
{// the same identity 
}
else 
{// different identities
}// 使用normL2距离作为指标
const double l2_similarity_threshold = 1.128;
double L2_score = faceRecognizer->match(feature1, feature2, FaceRecognizerSF::DisType::FR_NORM_L2); 
if (L2_score <= l2_similarity_threshold)
{// the same identity 
}
else 
{// different identities
}

3. 演示Demo

3.1 开发环境

  • OpenCV 4.9.0
  • Visual Studio 2015
  • Windows 10 Pro x64

3.2 功能介绍

        演示程序主界面如下图所示,具有人脸检测、人脸注册和人脸识别等功能。

        人脸检测:启动摄像头,进行实时人脸检测演示,结果显示在左侧(包括FPS,人脸框、五官坐标、人脸得分)。

        人脸注册:读取一张人脸图片,进行人脸检测、特征提取;左侧显示人脸检测结果,右侧显示对齐后人脸图,并保存人脸特征。

        人脸识别:读取一张人脸图片,进行人脸检测、特征提取,并与已存储的注册人脸特性进行比对;结果显示在左侧(其中:蓝色得分认为是同一人,红色得分认为是不同人)。

3.3 下载地址

        开发环境:

  • Windows 10 pro x64
  • Visual Studio 2015
  • OpenCV4.9.0

        下载地址: OpenCV人脸识别C++代码实现Demo

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

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

相关文章

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法&#xff08;递归实现&#xff09; int binarySearch(int *nums, int target, int left, int right) // left代表左边界&#xff0c;right代表右边界 {if (left > right) return -1; // 如果左边大于右边&#xff0c;那么…

初始化Linux或者Mac下Docker运行环境

文章目录 1 Mac下安装Docker2 Linux下安装Docker2.1 确定Linux版本2.2 安装Docker2.3 配置加速镜像 3 Docker安装校验4 安装docker-compose4.1 直接下载二进制文件4.2 移动二进制文件到系统路径4.3 设置可执行权限4.4 验证安装 1 Mac下安装Docker mac 安装 docker 还是比较方便…

配置Zephyr编译环境

安装chocolatey 以管理员身份运行PowerShell&#xff0c;然后在PowerShell下执行以下命令&#xff0c;安装chocolatey。 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::Securi…

【深度学习实战(32)】模型结构之解耦头(de-coupled head)与耦合头(coupled head)

一、传统耦合头局限性 传统的检测模型&#xff0c;如YOLOv3和YOLOv4&#xff0c;使用的是单一的检测头&#xff0c;它同时预测目标类别和框的位置。然而&#xff0c;这种设计存在一些问题。首先&#xff0c;将类别预测和位置预测合并在一个头中&#xff0c;可能导致一个任务的…

Wireshark CLI | 过滤包含特定字符串的流

问题背景 源自于和朋友的一次技术讨论&#xff0c;关于 Wireshark 如何查找特定字符串所在的 TCP 流&#xff0c;原始问题如下&#xff1a; 仔细琢磨了下&#xff0c;基于我对 Wireshark 的使用经验&#xff0c;感觉一步到位实现比较困难&#xff0c;所以想着说用 Wireshark C…

旅游系列之:庐山美景

旅游系列之&#xff1a;庐山美景 一、路线二、住宿二、庐山美景 一、路线 庐山北门乘坐大巴上山&#xff0c;住在上山的酒店东线大巴游览三叠泉&#xff0c;不需要乘坐缆车&#xff0c;步行上下三叠泉即可&#xff0c;线路很短 二、住宿 长江宾馆庐山分部 二、庐山美景

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

机器学习之基于Jupyter多种混合模型的糖尿病预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着现代生活方式的改变&#xff0c;糖尿病的患病率在全球范围内呈现上升趋势。糖尿病是一种慢性代谢…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 lua是一个脚本语言&#xff0c;比c语言开发容易&#xff0c;也没有python那么重&#xff0c;整体使用还是非常方便的。一般当成胶水语言进行开发&a…

【Hadoop】--基于hadoop和hive实现聊天数据统计分析,构建聊天数据分析报表[17]

目录 一、需求分析 1、背景介绍 2、目标 3、需求 4、数据内容 5、建库建表 二、ETL数据清洗 1、数据问题 2、需求 3、实现 4、扩展概念&#xff1a;ETL 三、指标计算 1、指标1&#xff1a;统计今日消息总量 2、指标2&#xff1a;统计每小时消息量、发送量和接收用…

哥白尼高程Copernicus DEM下载(CSDN_20240505)

哥白尼数字高程模型(Copernicus DEM, COP-DEM)由欧洲航天局(European Space Agency, 简称ESA或欧空局)发布&#xff0c;全球范围免费提供30米和90米分辨率DEM。COP-DEM是数字表面模型(DSM)&#xff0c;它表示地球表面(包括建筑物、基础设施和植被)的高程。COP-DEM是经过编辑的D…

循环神经网络模块介绍(Pytorch 12)

到目前为止&#xff0c;我们遇到过两种类型的数据&#xff1a;表格数据和图像数据。对于图像数据&#xff0c;我们设计了专门的卷积神经网络架构(cnn)来为这类特殊的数据结构建模。换句话说&#xff0c;如果我们拥有一张图像&#xff0c;我们 需要有效地利用其像素位置&#xf…

算法课程笔记——蓝桥云课第六次直播

&#xff08;只有一个数&#xff0c;或者因子只有一个&#xff09;先自己打表&#xff0c;找找规律函数就是2的n次方 异或前缀和 相等就抵消 先前缀和再二分

【Python】机器学习之Sklearn基础教程大纲

机器学习之Sklearn基础教程大纲 1. 引言 机器学习简介Scikit-learn&#xff08;Sklearn&#xff09;库介绍安装和配置Sklearn 2. 数据预处理 2.1 数据加载与查看 - 加载CSV、Excel等格式的数据- 查看数据的基本信息&#xff08;如形状、数据类型等&#xff09;2.2 数据清洗…

本地部署大模型ollama+docker+open WebUI/Lobe Chat

文章目录 大模型工具Ollama下载安装运行Spring Ai 代码测试加依赖配置写代码 ollama的web&Desktop搭建部署Open WebUI有两种方式Docker DesktopDocker部署Open WebUIDocker部署Lobe Chat可以配置OpenAI的key也可以配置ollama 大模型的选择 本篇基于windows环境下配置 大模型…

翔云优配恒生指数涨1.85%、恒生科技指数涨3.74% 小鹏汽车涨超8%

5月3日港股开盘&#xff0c;恒生指数涨1.85%&#xff0c;报18543.3点&#xff0c;恒生科技指数涨3.74%&#xff0c;报4009.96点&#xff0c;国企指数涨2.23%&#xff0c;报6580.81点&#xff0c; 翔云优配是一家领先的在线投资平台,提供全球范围内的股票、期货、基金等交易服务…

小程序引入 Vant Weapp 极简教程

一切以 Vant Weapp 官方文档 为准 Vant Weapp 官方文档 - 快速入手 1. 安装nodejs 前往官网下载安装即可 nodejs官网 安装好后 在命令行&#xff08;winr&#xff0c;输入cmd&#xff09;输入 node -v若显示版本信息&#xff0c;即为安装成功 2. 在 小程序根目录 命令行/终端…

C++类的小结

1、类定义 使用class关键字定义类。 类名通常以大写字母开头&#xff0c;以符合命名规范。 类包含成员变量&#xff08;也称为属性或数据成员&#xff09;和成员函数&#xff08;也称为方法或行为&#xff09;。 class MyClass { public: int x; // 数据成员 void setX…

【Gateway远程开发】0.5GB of free space is necessary to run the IDE.

【Gateway远程开发】0.5GB of free space is necessary to run the IDE. 报错 0.5GB of free space is necessary to run the IDE. Make sure that there’s enough space in following paths: /root/.cache/JetBrains /root/.config/JetBrains 原因 下面两个路径的空间不…

【OpenNJet下一代云原生之旅】

OpenNJet下一代云原生之旅 1、OpenNJet的定义OpenNJet架构图 2、OpenNJet的特点性能无损动态配置灵活的CoPilot框架支持HTTP/3支持国密企业级应用高效安全 3、OpenNJet的功能特性4、OpenNJet的安装使用编译安装配置yum源创建符号连接修改配置编译 5、通过 OpenNJet 部署 WEB SE…