在Emgucv中使用FaceDetectorYN进行人脸检测


// 1. 初始化检测器(加载ONNX模型)
string modelPath = "face_detection_yunet_2023mar.onnx"; // 需从官方下载
var inputSize = new System.Drawing.Size(320, 320); // 建议与模型训练尺寸一致
FaceDetectorYN detector = new FaceDetectorYN(modelPath, "", inputSize, 0.5f, 0.3f, 0);

// 2. 加载图像
var image = CvInvoke.Imread("face.jpg");
if (image.IsEmpty) throw new Exception("图像加载失败");

// 3. 设置输入尺寸(必须与模型匹配)
detector.InputSize=image.Size;

// 4. 执行检测
var results = new Emgu.CV.Mat();
detector.Detect(image, results);

// 5. 解析并绘制结果

MCvScalar[] landmark_color=
{
    new MCvScalar(255, 0, 0), // right eye
    new MCvScalar(0, 0, 255), // left eye
    new MCvScalar(0, 255, 0), // nose tip
    new MCvScalar(255, 0, 255), // right mouth corner
    new MCvScalar(0, 255, 255)  // left mouth corner
};
if (!results.IsEmpty)
{
    // 每行对应一个人脸,每行15个元素:[x,y,w,h, 关键点x10, 置信度]
    for (int i = 0; i < results.Rows; i++)
    {
        float[] data = new float[15];
        results.Row(i).CopyTo(data);

        // 提取人脸矩形
        Rectangle faceRect = new Rectangle(
            (int)data[0], (int)data[1], (int)data[2], (int)data[3]);
        float confidence = data[14];

        // 绘制矩形
        CvInvoke.Rectangle(image, faceRect, new Bgr(0,255,0).MCvScalar, 2);

        // 绘制关键点(5个点:右眼、左眼、鼻尖、右嘴角、左嘴角)
        int colorIndex = 0;
        for (int p = 4; p < 14; p += 2)
        {
            System.Drawing.Point point = new System.Drawing.Point((int)data[p], (int)data[p + 1]);
            CvInvoke.Circle(image, point, 3, landmark_color[colorIndex], -1);
            colorIndex++;
        }
    }
}

// 6. 保存/显示结果
CvInvoke.Imwrite("output.jpg", image);
CvInvoke.Imshow("Faces", image);
CvInvoke.WaitKey(0);

模型下载地址:GitCode - 全球开发者的开源社区,开源代码托管平台

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值