ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OpenCV contrib 人脸关键点检测实战:用 Facemark API 在视频中逐帧定位人脸关键点

OpenCV contrib 人脸关键点检测实战:用 Facemark API 在视频中逐帧定位人脸关键点 计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载本教程基于 OpenCV 扩展模块opencv_contrib的face模块完整讲解如何在视频中实现人脸检测 人脸关键点定位的流水线先由自定义人脸检测器框出每一帧中的人脸再通过 FacemarkKazemi 回归树集成方法拟合出每张人脸的 68 个关键点并实时绘制显示。读完本文你将掌握sampleDetectLandmarksvideo示例的运行方法、三个必填命令行参数的含义以及myDetector/FacemarkKazemi/getFaces/fit这一完整调用链的源码级原理可直接迁移到实时摄像头、视频分析等人脸应用场景。概述视频人脸关键点检测解决什么问题与静态图像中的人脸关键点检测不同视频场景要求对每一帧画面重复执行检测人脸 → 拟合关键点两步操作并把结果连续地显示在窗口中形成流畅的实时可视化效果。本教程对应的完整示例代码位于 sampleDetectLandmarksvideo.cpp它依赖以下模块能力opencv2/face.hppFacemark API 与 Kazemi 算法实现opencv2/videoio.hppVideoCapture读取视频opencv2/objdetect.hpp经由xobjdetect.hppCascadeClassifier人脸级联检测opencv2/imgproc.hpp与opencv2/highgui.hpp灰度转换、直方图均衡、缩放与窗口显示。整体流水线可以概括为打开视频 → 读帧 → 自定义人脸检测器框出人脸 → Facemark 拟合关键点 → 绘制并显示 → 按键退出。运行示例与命令行参数编译face模块并生成示例程序后在终端中按如下命令运行参数顺序不限使用-前缀配合参数缩写或全名均可./sampleDetectLandmarks -filetrained_model.dat -face_cascadelbpcascadefrontalface.xml -video/path_to_video/video.avi其中trained_model.dat是预训练好的关键点模型二进制文件lbpcascadefrontalface.xml是用于人脸检测的级联分类器文件可使用 OpenCV 官方数据目录中提供的lbpcascade_frontalface.xml或haarcascade_frontalface_alt.xml等video.avi是待检测的视频文件。命令参数说明参数名缩写必填说明示例model_filenamef✔存储已训练模型的二进制文件路径用于加载关键点模型/data/file.datvideov✔需要进行人脸关键点检测的视频文件路径/data/video.aviface_cascadec✔用作人脸检测器的级联分类器 XML 文件路径lbpcascadefrontalface.xml以上三个参数在示例源码中通过CommandLineParser解析见 sampleDetectLandmarksvideo.cpp任一必填参数缺失时程序会打印使用说明并返回-1。在命令行参数尾部键入--help或-h也可以随时查看这些说明。为规避路径解析问题示例还特别提示建议使用绝对路径。第一步编写自定义人脸检测器Facemark API 的设计目标是让人脸检测环节完全可插拔——你可以用任意检测器级联、DNN、自定义模型先框出人脸再把检测结果喂给关键点拟合算法。本教程的自定义检测器myDetector基于 Haar/LBP 级联分类器实现CascadeClassifier face_cascade; bool myDetector( InputArray image, OutputArray ROIs ); bool myDetector( InputArray image, OutputArray ROIs ){ Mat gray; std::vectorRect faces; if(image.channels()1){ cvtColor(image.getMat(),gray,COLOR_BGR2GRAY); } else{ gray image.getMat().clone(); } equalizeHist( gray, gray ); face_cascade.detectMultiScale( gray, faces, 1.1, 3,0, Size(30, 30) ); Mat(faces).copyTo(ROIs); return true; }该函数做三件事把彩色帧转成灰度图已是灰度则直接克隆、用equalizeHist做直方图均衡以增强对比度、调用detectMultiScale在多个尺度上扫描并返回所有人脸矩形。检测到的std::vectorRect通过Mat(faces).copyTo(ROIs)写入输出参数最终返回true表示检测成功。在示例源码中detectMultiScale的调用参数为1.4, 2, CASCADE_SCALE_IMAGE, Size(30, 30)即缩放因子 1.4、最小邻居数 2、最小人脸尺寸 30×30实际工程中可根据视频分辨率与漏检/误检的取舍调整这些数值。说明myDetector的函数签名InputArray, OutputArray, void*与 Facemark 内部定义的FN_FaceDetector函数指针类型一致见 facemark_train.hpp。示例通过(FN_FaceDetector)myDetector显式转型后注册进 Facemark并通过第二个参数把CascadeClassifier对象的地址一并传入保证检测器能访问到已加载的级联模型。第二步加载视频并初始化 FacemarkVideoCapture cap(video); if(!cap.isOpened()){ cerrVideo cannot be loaded. Give correct pathendl; return -1; }以上代码创建VideoCapture对象并尝试打开视频。若打开失败路径错误或文件损坏程序会提示 Video cannot be loaded. Give correct path 并提前退出。Mat img imread(image); face_cascade.load(cascade_name); FacemarkKazemi::Params params; params.configfile configfile_name; PtrFacemark facemark FacemarkKazemi::create(params); facemark-setFaceDetector(myDetector);初始化阶段的关键动作face_cascade.load(cascade_name)加载人脸检测级联分类器构造FacemarkKazemi::Params通过params.configfile指定算法配置文件XML 格式用于描述级联回归器的训练/运行参数详见下文配置文件参数详解一节留空时使用库内默认值FacemarkKazemi::create(params)创建 Kazemi 算法实例返回PtrFacemark基类指针facemark-setFaceDetector(myDetector)把第一步编写的自定义检测器以函数指针形式注册进 facemark之后getFaces就会调用它来完成人脸检测。在完整示例中紧接着还会调用facemark-loadModel(filename)加载预训练的关键点模型并打印 Loaded model这是拟合前必须完成的一步——模型未加载时fit无法工作。vectorRect faces; vector vectorPoint2f shapes; Mat img;这里创建三个核心数据结构faces保存当前帧检测到的所有人脸矩形Rectshapes是一个双层容器外层对应每一张人脸内层是该人脸的一组Point2f关键点坐标img存放当前帧图像。第三步逐帧检测与拟合的主循环while(1){ faces.clear(); shapes.clear(); capimg; resize(img,img,Size(600,600),0,0,INTER_LINEAR_EXACT); facemark-getFaces(img,faces); if(faces.size()0){ coutNo faces found in this frameendl; } else{ for( size_t i 0; i faces.size(); i ) { cv::rectangle(img,faces[i],Scalar( 255, 0, 0 )); } if(facemark-fit(img,faces,shapes)) { for(unsigned long i0;ifaces.size();i){ for(unsigned long k0;kshapes[i].size();k) cv::circle(img,shapes[i][k],3,cv::Scalar(0,0,255),FILLED); } } } namedWindow(Detected_shape); imshow(Detected_shape,img); if(waitKey(1) 0) break; }主循环的处理逻辑每轮先清空上一帧的faces与shapes然后capimg读取下一帧读取到文件尾时循环内img为空程序会自然结束用resize把帧统一缩放到 600×600图像版示例使用 460×460见 sampleDetectLandmarks.cpp小尺寸图像能显著提升处理速度INTER_LINEAR_EXACT保证缩放插值结果与 OpenCV 2.x 的线性插值行为一致facemark-getFaces(img,faces)调用注册的自定义检测器得到当前帧的人脸矩形若没有检测到人脸打印 No faces found in this frame否则先用蓝色矩形框出每张人脸Scalar(255,0,0)再调用facemark-fit(img,faces,shapes)对每张人脸拟合关键点fit成功后遍历shapes在每个人脸的关键点位置画半径 3 的红色实心圆Scalar(0,0,255)FILLEDnamedWindowimshow在 Detected_shape 窗口中显示当前帧结果waitKey(1) 0表示用户按下了任意键循环随即退出。配置文件参数详解FacemarkKazemi基于 Vahid Kazemi 与 Josephine Sullivan 提出的One Millisecond Face Alignment with an Ensemble of Regression Trees方法的训练与推理参数集中在一个 XML 配置文件中由params.configfile指定。仓库在 sample_config_file.xml 中提供了一份完整示例各参数含义如下配置项示例值含义cascade_depth15级联回归器的级数stage 数量级数越多拟合越精细但越慢tree_depth4梯度提升中作为弱学习器的决策树深度num_trees_per_cascade_level500每个级联层包含的决策树数量learning_rate0.1梯度提升的学习率shrinkage用于防止过拟合oversampling_amount20训练样本的过采样倍数数据增强num_test_coordinates400每次分裂决策前生成的候选测试坐标数量lambda0.1用于计算概率、帮助选择更近像素点进行分裂的 lambda 值num_test_splits20生成候选分裂的数量从中挑选最优分裂这些参数直接决定模型训练时的回归树结构。训练相关教程可参考 face_landmark_trainer.markdown其中描述了数据集准备HELEN/IBUG 等 68 点标注格式、loadDatasetList/loadFacePoints加载数据、addTrainingSample添加样本以及training()训练流程。关键 API 与底层实现Facemark 抽象基类facemark.hpp 定义了统一的 Facemark 接口核心方法有两个loadModel(String model)拟合前加载预训练模型例如facemark-loadModel(trained_model.dat)fit(InputArray image, InputArray faces, OutputArrayOfArrays landmarks)输入图像与人脸矩形输出每张人脸的关键点集合返回bool表示拟合是否成功。头文件同时声明了三个算法工厂函数createFacemarkAAM()主动外观模型、createFacemarkLBF()局部二值特征与createFacemarkKazemi()本教程使用的级联回归树方法你可以按需选择算法而接口保持一致。FacemarkTrain 与配套工具facemark_train.hpp 在基类之上补充了训练与检测基础设施setFaceDetector(FN_FaceDetector detector, void* userData)注册用户自定义人脸检测器这正是本教程myDetector的注册入口getFaces(InputArray image, OutputArray faces)使用默认或自定义检测器检测人脸CParams结构体封装级联文件、scaleFactor、minNeighbors、minSize/maxSize等检测参数drawFacemarks(InputOutputArray image, InputArray points, Scalar color)直接绘制一组关键点比手写circle循环更简洁loadFacePoints(filename, points)与loadDatasetList(...)读取标准格式的.pts/.txt标注与训练文件列表。与图像版示例的异同本视频教程是图像版人脸关键点检测教程的延伸两者共用myDetector、FacemarkKazemi、getFaces、fit调用链与绘制逻辑区别仅在于输入源VideoCapture逐帧读取 vsimread单图读取、每帧的缩放尺寸600×600 vs 460×460以及循环退出条件按键/帧尾 vswaitKey(0)单次等待。Facemark 的通用使用流程创建对象 → 设置检测器 → 加载模型 → 拟合还可以参考 facemark_usage.markdown。运行效果运行示例后程序会弹出 Detected_shape 窗口蓝色矩形框出每一帧中检测到的人脸红色圆点标出每张人脸的 68 个关键点涵盖眉毛、眼睛、鼻子、嘴巴与下颌轮廓。下图展示了单张人脸的检测框与关键点标记效果多张人脸、不同姿态与光照条件下的关键点检测结果如下图所示常见问题排查Video cannot be loaded检查video参数路径是否正确、视频编码是否被 OpenCV 支持必要时换用绝对路径。模型加载失败/无输出确认model_filename指向的是经过训练的.dat/.model文件且模型点数与算法一致同时确保先调用loadModel再调用fit。一帧都没有检测到人脸调低detectMultiScale的scaleFactor如 1.1~1.3与minNeighbors或减小minSize如 20×20以提升对小脸、侧脸的召回。处理速度偏慢降低resize的目标尺寸如 300×300或改用更轻量的级联文件与更少的cascade_depth。延伸关键点结果能做什么在 sample_face_swapping.markdown 与face_swapped.jpg等示例中可以看到68 点关键点结果是大量人脸应用的基础人脸对齐利用关键点估计仿射变换、人脸换脸、人脸平均、表情迁移等。掌握本教程的视频人脸检测 关键点拟合流水线后将VideoCapture换成摄像头设备号即可无缝迁移到实时人脸应用场景。赞分享计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载相关推荐OpenPose人脸70关键点检测特征点定位与表情分析应用OpenPose人脸70关键点检测特征点定位与表情分析应用 OpenPose作为业界领先的人体姿态估计框架其人脸关键点检测功能能够精准定位70个面部特征点人工智能计算机视觉深度学习RetinaFace关键点检测原理5点人脸特征定位技术详解RetinaFace关键点检测原理5点人脸特征定位技术详解 人脸检测与关键点定位是计算机视觉领域的重要研究方向而RetinaFace作为业界领先的单阶段密集计算机视觉人工智能深度学习MuseTalk DWPose姿态检测人脸关键点定位与对齐技术MuseTalk DWPose姿态检测人脸关键点定位与对齐技术 想要实现高质量的口型同步效果MuseTalk的DWPose姿态检测技术为你提供专业的人脸关键人工智能大模型计算机视觉语音媒体生成数字人预训练上一篇抖音无水印下载神器3分钟搞定批量下载支持直播回放下一篇抖音批量下载终极指南5步实现无水印视频高效下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表