OpenCV使用级联分类器实现人脸检测
一、概述
案例:使用opencv级联分类器CascadeClassifier+其提供的特征数据实现人脸检测,检测到人脸后使用红框画出来。
API介绍:
detectMultiScale( InputArray image, CV_OUT std::vector<Rect>& objects,double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, Size minSize = Size(), Size maxSize = Size(), );
image:输入图像
objects:检测到的目标区域数组(因一副图像中有可能有多个人脸)
scaleFactor:搜索前后两次窗口大小比例系数,默认为1:1,即每次搜索窗口扩大10%
minNeighbors:构成检测目标的相邻矩形的最小个数 如果组成检测目标的小矩形的个数和小于minneighbors - 1 都会被排除,如果minneighbors为0 则函数不做任何操作就返回所有被检候选矩形框。
flags:若设置为CV_HAAR_DO_CANNY_PRUNING 函数将会使用Canny边缘检测来排除边缘过多或过少的区域,默认写0即可
minSize:检测的最小尺寸
maxSize:检测的最大尺寸
实现人脸检测的步骤:
1.实例化CascadeClassifier face_cascade
2.使用load加载特征数据
3.载入待检测图像
4.图像灰度化
5.将灰度图进行直方图均衡化
6.进行多尺度检测,并输出检测到的人脸区域候选数组
7.将人脸区域数组绘制并显示到原图输出
二、代码示例
//加载特征数据 CascadeClassifier face_cascade; if(!face_cascade.load(xmlPath.toStdString())){ qDebug()<<"不能加载特征数据"; return; } Mat src = imread(filePath); if(src.empty()){ qDebug()<<"图片不能为空"; return; } imshow("src",src); Mat gray; cvtColor(src,gray,COLOR_BGR2GRAY); //进行直方图均衡化 equalizeHist(gray,gray); // imshow("equalizHist",gray); //执行多尺度特征检测 vector<Rect> faces; face_cascade.detectMultiScale(gray,faces,1.1,minTargetRectCount,0,Size(24,24)); for(size_t i = 0;i<faces.size();i++){ rectangle(src,faces[i],Scalar(0,0,255),2,LINE_8,0); } imshow("result",src);
三、示例图片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探