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

OpenCV 人脸分析------面部关键点检测类cv::face::FacemarkLBF

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

使用 Local Binary Features (LBF) 算法进行面部关键点检测(facial landmark detection)。该算法通过级联回归树预测人脸的 68 个关键点,具有较高的精度和速度。

公共成员函数

static Ptr<FacemarkLBF> create(const Params &parameters = Params())

作用:创建一个 FacemarkLBF 实例。
参数:
parameters: 可选的 LBF 参数配置。
返回值:返回 FacemarkLBF 的智能指针对象。

 virtual bool loadModel(const String& filename) override

作用:加载预训练的 LBF 模型文件(.yaml 或 .yml 格式)。
参数:
filename: 模型文件路径。
返回值:成功返回 true,失败返回 false。
注意:模型文件通常是 lbfmodel.yaml。

 virtual bool fit(InputArray image, const std::vector<cv::Rect>& faces, CV_OUT std::vector<std::vector<cv::Point2f>>& landmarks) override

作用:对图像中的一张或多张人脸进行面部关键点拟合。
参数:

  • image: 输入图像(建议为灰度图)。
  • faces: 包含每张人脸的边界框(std::vectorcv::Rect)。
  • landmarks: 输出结果,是一个二维向量,每个子向量对应一张人脸的关键点集合。

返回值:成功返回 true,否则 false。

`void setParameters(const Params& parameters)`

作用:设置 LBF 算法的参数。
参数:

  • parameters: LBF 参数结构体。
const Params& getParameters() const

作用:获取当前设置的 LBF 参数。

参数结构体 cv::face::FacemarkLBF::Params

这是 FacemarkLBF 的参数结构体,可以自定义以下参数:

成员变量类型默认值含义
scale_factorfloat1.0f图像缩放因子,影响检测速度与精度
n_landmarksint68关键点数量(通常为 68)
n_treesint500使用的回归树数量
tree_depthint5每棵树的最大深度
valid_radiusfloat1.0f特征采样半径范围
oversampling_ceilint30过采样上限
use_eye_centersboolfalse是否使用眼睛中心作为初始点

示例代码


#include <opencv2/face.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::face;
using namespace std;int main()
{// 加载 Haar 分类器CascadeClassifier faceCascade( "haarcascade_frontalface_default.xml" );if ( faceCascade.empty() ){cerr << "无法加载 Haar 分类器!" << endl;return -1;}// 创建 FacemarkLBF 实例Ptr< FacemarkLBF > facemark = FacemarkLBF::create();facemark->loadModel( "lbfmodel.yaml" );// 加载图像Mat img = imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png" );if ( img.empty() ){cerr << "图像加载失败!" << endl;return -1;}Mat gray;cvtColor( img, gray, COLOR_BGR2GRAY );// 检测人脸vector< Rect > faces;faceCascade.detectMultiScale( gray, faces, 1.1, 3, 0, Size( 100, 100 ) );if ( faces.empty() ){cout << "未检测到人脸。" << endl;return -1;}// ✅ 改为二维向量存储关键点vector< vector< Point2f > > landmarks;// 拟合关键点if ( facemark->fit( img, faces, landmarks ) ){// 遍历每个人脸的关键点集合并绘制for ( const auto& face_landmarks : landmarks ){for ( const auto& point : face_landmarks ){circle( img, point, 2, Scalar( 0, 255, 0 ), FILLED );}}imshow( "Facial Landmarks", img );waitKey( 0 );}else{cout << "未能拟合面部关键点。" << endl;}return 0;
}

运行结果

在这里插入图片描述

http://www.dtcms.com/a/268684.html

相关文章:

  • 【Java面试】如何保证Java应用的安全性
  • Node.js 后台系统 - 基本增删改查实现
  • 【Python】类中的参数传递
  • HBuilder Cli创建的uniapp项目,引入unoCss插件
  • 在本地部署mcp服务器实现自然语言操作mysql数据库,轻松实现数据表的增~ 删~ 改~ 查~
  • 七牛云Java开发面试题及参考答案
  • Unity接入Steamworks.NET实现通信功能
  • C#和SQL Server连接常用通讯方式
  • MsSql 其他(2)
  • Excel 的多线程特性
  • JavaWeb笔记07
  • LLM(大语言模型)能识别图像的核心原因:图像和文本记性特征识别且对其
  • [C语言笔记]11、结构体
  • 实用机器学习
  • 算法————模拟算法
  • Oracle实用参考(13)——Oracle for Linux PSR及PSU升级
  • C++系列(七):深度探索C++内存 --- 分区、堆栈、new/delete与高效编程实践
  • 动态规划递归与迭代实现对比
  • Data Agent:从技术本质到企业级实践的全景解析
  • LeetCode Hot 100 除自身以外数组的乘积
  • 16th Day| 222.完全二叉树的节点个数,110.平衡二叉树,257.二叉树的所有路径,404.左叶子之和
  • 分布式推客系统架构设计:从微服务到高性能计算的实践路径
  • WebView 中 Cookie 丢失怎么办?跨域状态不同步的调试与修复经验
  • 6,Receiving Messages:@KafkaListener Annotation
  • 诊断工程师进阶篇 --- 车载诊断怎么与时俱进?
  • vue3 字符包含
  • vue openlayer 找出直线上的某一个点 , 点距离直线 最短路径的点 WKT坐标转换为GeoJSON坐标
  • iOS Widget 开发-1:什么是 iOS Widget?开发前的基本认知
  • 亚马逊运营进阶指南:如何用AI工具赋能广告运营
  • 期待在 VR 森林体验模拟中实现与森林的 “虚拟复现”​