大数跨境
0
0

OpenCVSharp:学习人脸检测例子

OpenCVSharp:学习人脸检测例子 dotNET跨平台
2025-12-17
6
导读:前言OpenCVSharp关于人脸检测提供了两个例子,一个是使用级联分类器另一个是使用DNN模型。使用级联分

前言

OpenCVSharp关于人脸检测提供了两个例子,一个是使用级联分类器另一个是使用DNN模型。

使用级联分类器

级联分类器(Cascade Classifier)是计算机视觉中一种高效的目标检测方法,特别广泛应用于人脸检测。

在这个例子中使用到了Haar级联分类器与Lbp级联分类器。

首先需要准备haarcascade_frontalface_default.xml与lbpcascade_frontalface.xml。

介绍一下haarcascade_frontalface_default.xml,另一个也是差不多的东西。

haarcascade_frontalface_default.xml 是 OpenCV 中用于人脸检测的预训练 Haar 级联分类器文件。它包含了从大量人脸样本中学习到的特征模式,以 XML 格式存储了多阶段级联分类器的参数。

这个文件的主要作用是:

提供预训练的人脸检测模型,无需从头训练

包含 24x24 像素检测窗口的 Haar 特征和分类阈值

通过级联结构实现快速人脸检测,早期阶段快速排除非人脸区域

打开如下所示:

 // 加载级联分类器
usingvar haarCascade = new CascadeClassifier(HaarCascade);
usingvar lbpCascade = new CascadeClassifier(LbpCascade);

// 检测人脸
 Mat haarResult = DetectFace(haarCascade, true);
 Mat lbpResult = DetectFace(lbpCascade, false);

private Mat DetectFace(CascadeClassifier cascade, bool isHaar)
 {
     Mat result;

     using (var src = new Mat(ImagePath, ImreadModes.Color))
     using (var gray = new Mat())
     {
         result = src.Clone();
         Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);

         // 检测人脸
         Rect[] faces = cascade.DetectMultiScale(
             gray, 1.082, HaarDetectionTypes.ScaleImage, new Size(3030));

         // 更新人脸计数
         if (isHaar)
         {
             FaceCountHaar = faces.Length;
         }
         else
         {
             FaceCountLbp = faces.Length;
         }

         // 渲染所有检测到的人脸
         foreach (Rect face in faces)
         {
             var center = new Point
             {
                 X = (int)(face.X + face.Width * 0.5),
                 Y = (int)(face.Y + face.Height * 0.5)
             };
             var axes = new Size
             {
                 Width = (int)(face.Width * 0.5),
                 Height = (int)(face.Height * 0.5)
             };
             Cv2.Ellipse(result, center, axes, 00360new Scalar(2550255), 4);
         }
     }
     return result;
 }

Haar级联分类器与Lbp级联分类器介绍

Haar级联分类器是一种基于Haar-like特征的目标检测方法,它通过计算图像中不同区域的矩形特征值来识别目标,使用积分图加速特征计算,并通过AdaBoost算法训练多个弱分类器组合成强分类器,最终形成级联结构实现快速人脸等目标检测,具有检测速度快但对光照和姿态变化较为敏感的特点。

LBP级联分类器采用局部二值模式(Local Binary Pattern)作为特征描述符,通过比较像素邻域内像素与中心像素的灰度关系生成二进制编码来描述图像纹理特征,具有计算简单、对光照变化不敏感的优势,同样使用AdaBoost算法构建级联分类器,在人脸检测等应用中表现出良好的鲁棒性和实时性,特别适合资源受限的环境。

查看CascadeClassifier构造函数:

 public CascadeClassifier(string fileName)
 {
     if (string.IsNullOrEmpty(fileName))
         throw new ArgumentNullException(nameof(fileName));
     if (!File.Exists(fileName))
         throw new FileNotFoundException("\""+ fileName + "\"not found", fileName);

     NativeMethods.HandleException(
         NativeMethods.objdetect_CascadeClassifier_newFromFile(fileName, out ptr));
 }

从一个文件中加载级联分类器。

检测人脸使用级联器类的DetectMultiScale方法,查看这个方法的签名:

 public virtual Rect[] DetectMultiScale(
     Mat image,
     double scaleFactor = 1.1,
     int minNeighbors = 3,
     HaarDetectionTypes flags = 0,
     Size? minSize = null,
     Size? maxSize = null
)

这是OpenCV中CascadeClassifier类的DetectMultiScale方法,用于在输入图像中检测不同大小的目标对象(常用于人脸检测)。

参数名
参数含义
image
8位单通道输入图像(CV_8U类型),用于检测目标
scaleFactor
图像金字塔缩放比例(默认1.1),控制每次扫描时图像尺寸的缩小比例
minNeighbors
候选矩形保留所需的最小邻居数量(默认3),用于过滤误检
flags
检测模式设置,与旧版cvHaarDetectObjects函数中的flags参数含义相同
minSize
检测目标的最小尺寸,小于此尺寸的对象将被忽略
maxSize
检测目标的最大尺寸,大于此尺寸的对象将被忽略

返回矩形数组,这里就一个人脸,得到一个矩形区域,如下所示:

效果如下所示:

使用DNN模型

跟之前一样需要一个txt文件与一个模型文件。

 // 读取样本图像
usingvar frame = new Mat(ImagePath);
int frameHeight = frame.Rows;
int frameWidth = frame.Cols;

// 加载DNN模型
usingvar faceNet = CvDnn.ReadNetFromCaffe(ConfigFile, FaceModel);

// 创建输入blob
usingvar blob = CvDnn.BlobFromImage(frame, 1.0new Size(300300), new Scalar(104117123), falsefalse);
 faceNet.SetInput(blob, "data");

// 前向传播
usingvar detection = faceNet.Forward("detection_out");
usingvar detectionMat = Mat.FromPixelData(detection.Size(2), detection.Size(3), MatType.CV_32F, detection.Ptr(0));

跟之前介绍的使用CaffeModel的步骤是一样的,这里就不重复介绍了。

效果如下所示:

【声明】内容源于网络
0
0
dotNET跨平台
专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
内容 914
粉丝 0
dotNET跨平台 专注于.NET Core的技术传播。在这里你可以谈微软.NET,Mono的跨平台开发技术。在这里可以让你的.NET项目有新的思路,不局限于微软的技术栈,横跨Windows,
总阅读15.0k
粉丝0
内容914