OpenCV人脸分析------绘制面部关键点函数drawFacemarks()

发布于:2025-07-08 ⋅ 阅读:(19) ⋅ 点赞:(0)
  • 操作系统: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;
}

运行结果

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到