// 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);