OpenCV人脸分析------绘制面部关键点函数drawFacemarks()
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
该函数用于在图像上绘制面部关键点(facial landmarks),例如使用 FacemarkLBF, FacemarkKazemi 等算法检测到的 68 个面部关键点。
它会将每个关键点以圆形标记绘制在输入图像上,方便可视化检测结果。
参数说明
参数名 | 类型 | 描述 |
---|---|---|
image | InputOutputArray | 输入输出图像,通常是 BGR 彩色图像 (CV_8UC3)。绘制后会在原图上画出关键点。 |
points | InputArray | 关键点坐标集合,通常是一个 std::vectorcv::Point2f 或 cv::Mat 类型。每个元素代表一个关键点的 (x, y) 坐标。 |
color | Scalar | 可选参数,绘制关键点的颜色,默认为蓝色 Scalar(255, 0, 0)。如果是 BGR 图像,可以传入 (B, G, R) 值。 |
示例代码
#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>using namespace cv;
using namespace cv::face;
using namespace std;int main() {// 加载图像Mat img = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png");if (img.empty()) {cerr << "无法加载图像!" << endl;return -1;}// 创建 Facemark 实例(如 LBF)Ptr<Facemark> facemark = FacemarkLBF::create();facemark->loadModel("lbfmodel.yaml");// 检测人脸(使用 Haar 分类器或其它方式)CascadeClassifier face_cascade;face_cascade.load("haarcascade_frontalface_default.xml");vector<Rect> faces;Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);face_cascade.detectMultiScale(gray, faces);// 存储关键点vector<vector<Point2f>> landmarks;// 检测面部关键点bool success = facemark->fit(img, faces, landmarks);if (success) {for (size_t i = 0; i < landmarks.size(); i++) {// ✅ 绘制所有关键点drawFacemarks(img, landmarks[i], Scalar(0, 255, 0)); // 绿色点}imshow("Facemarks", img);waitKey(0);} else {cout << "未能检测到面部关键点。" << endl;}return 0;
}