网站搭建大型公司,招投标网站开发公司,大型电商网站开发方案,网站做访问追踪前言
OpenCVSharp关于人脸检测提供了两个例子#xff0c;一个是使用级联分类器另一个是使用DNN模型。
使用级联分类器
级联分类器#xff08;Cascade Classifier#xff09;是计算机视觉中一种高效的目标检测方法#xff0c;特别广泛应用于人脸检测。
在这个例子中使用到了…前言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 特征和分类阈值通过级联结构实现快速人脸检测早期阶段快速排除非人脸区域可以在这里获取https://github.com/shimat/opencvsharp_samples/tree/master/SampleBase/Data/Text打开如下所示/* by yours.tools - online tools website : yours.tools/zh/checkurl.html */ // 加载级联分类器 using var haarCascade new CascadeClassifier(HaarCascade); using var 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.08, 2, HaarDetectionTypes.ScaleImage, new Size(30, 30)); // 更新人脸计数 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, 0, 0, 360, new Scalar(255, 0, 255), 4); } } return result; }Haar级联分类器与Lbp级联分类器介绍Haar级联分类器是一种基于Haar-like特征的目标检测方法它通过计算图像中不同区域的矩形特征值来识别目标使用积分图加速特征计算并通过AdaBoost算法训练多个弱分类器组合成强分类器最终形成级联结构实现快速人脸等目标检测具有检测速度快但对光照和姿态变化较为敏感的特点。LBP级联分类器采用局部二值模式(Local Binary Pattern)作为特征描述符通过比较像素邻域内像素与中心像素的灰度关系生成二进制编码来描述图像纹理特征具有计算简单、对光照变化不敏感的优势同样使用AdaBoost算法构建级联分类器在人脸检测等应用中表现出良好的鲁棒性和实时性特别适合资源受限的环境。查看CascadeClassifier构造函数/* by yours.tools - online tools website : yours.tools/zh/checkurl.html */ 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方法用于在输入图像中检测不同大小的目标对象常用于人脸检测。参数名参数含义image8位单通道输入图像(CV_8U类型)用于检测目标scaleFactor图像金字塔缩放比例(默认1.1)控制每次扫描时图像尺寸的缩小比例minNeighbors候选矩形保留所需的最小邻居数量(默认3)用于过滤误检flags检测模式设置与旧版cvHaarDetectObjects函数中的flags参数含义相同minSize检测目标的最小尺寸小于此尺寸的对象将被忽略maxSize检测目标的最大尺寸大于此尺寸的对象将被忽略返回矩形数组这里就一个人脸得到一个矩形区域如下所示效果如下所示使用DNN模型跟之前一样需要一个txt文件与一个模型文件。这两个文件可以在这里获取https://github.com/spmallick/learnopencv/tree/master/FaceDetectionComparison/models// 读取样本图像 using var frame new Mat(ImagePath); int frameHeight frame.Rows; int frameWidth frame.Cols; // 加载DNN模型 using var faceNet CvDnn.ReadNetFromCaffe(ConfigFile, FaceModel); // 创建输入blob using var blob CvDnn.BlobFromImage(frame, 1.0, new Size(300, 300), new Scalar(104, 117, 123), false, false); faceNet.SetInput(blob, data); // 前向传播 using var detection faceNet.Forward(detection_out); using var detectionMat Mat.FromPixelData(detection.Size(2), detection.Size(3), MatType.CV_32F, detection.Ptr(0));跟之前介绍的使用CaffeModel的步骤是一样的这里就不重复介绍了。效果如下所示