news 2026/4/15 14:43:17

OpenCVSharp:学习人脸检测例子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenCVSharp:学习人脸检测例子

前言

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的步骤是一样的,这里就不重复介绍了。

效果如下所示:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 17:23:43

三分钟构建智能AI集群:Exo资源配额自动分配全解析

三分钟构建智能AI集群:Exo资源配额自动分配全解析 【免费下载链接】exo Run your own AI cluster at home with everyday devices 📱💻 🖥️⌚ 项目地址: https://gitcode.com/GitHub_Trending/exo8/exo 还在为家中闲置设备…

作者头像 李华
网站建设 2026/4/15 14:15:34

国产出图神器!行政边界一键填充配色、秒出专业图,附完整教程

告别繁琐,三步出图!从加载数据、自定义配色到添加指北针、比例尺等专业元素,Bigemap Pro助你轻松完成一张规范、美观的行政边界图。支持直接打印,或导出高清PDF无缝嵌入汇报PPT。一、行政边界图制作全流程详解 1. 数据加载与边界提…

作者头像 李华
网站建设 2026/4/7 6:20:41

测试精粹:资深专家的十项实战心法

测试专家的价值与时代意义 在数字化浪潮席卷全球的今天,软件质量已成为企业竞争力的核心要素。作为软件测试从业者,我们不仅是缺陷的发现者,更是质量文化的推动者。测试专家通过多年的项目历练,总结出宝贵的经验教训,…

作者头像 李华
网站建设 2026/4/14 4:25:08

完整指南:用Figma-Context-MCP实现AI助手与设计稿的智能对话

完整指南:用Figma-Context-MCP实现AI助手与设计稿的智能对话 【免费下载链接】Figma-Context-MCP MCP server to provide Figma layout information to AI coding agents like Cursor 项目地址: https://gitcode.com/gh_mirrors/fi/Figma-Context-MCP 想要让…

作者头像 李华
网站建设 2026/4/15 5:44:12

AI 正在“吃光内存”,NVIDIA与SK海力士把目光投向了 NAND

继大规模蚕食DRAM市场后,英伟达与SK海力士计划推出性能提升近10倍的"AI SSD",引发NAND供应警报。随着AI产业重心从训练转向推理,技术栈需全面升级以构建低延迟、高吞吐环境,行业正聚焦通过NAND芯片打造推理优化的AI存储…

作者头像 李华
网站建设 2026/4/15 12:48:43

ThingsBoard智能消息路由:3大策略提升物联网数据处理效率

ThingsBoard智能消息路由:3大策略提升物联网数据处理效率 【免费下载链接】thingsboard Open-source IoT Platform - Device management, data collection, processing and visualization. 项目地址: https://gitcode.com/GitHub_Trending/th/thingsboard 在…

作者头像 李华