当前位置: 首页 > news >正文

计算机视觉cv入门之Haarcascade的基本使用方法(人脸识别为例)

        Haar CascadeXML特征分类器,是一种基于机器学习的方法,它利用了积分图像(或总面积)的概念有效地提取特征(例如,边缘、线条等)的数值。“级联分类器”即意味着不是一次就为图像中的许多特征应用数百个分类器,而是一对一地应用分类器。

        利用OpenCV自带的xml文件,可以实时检测摄像头中人脸Haar特征或LBP特征,它们描述不同的局部信息。

opencv自带Haar级联分离器XML文件

        opencv自带的Haar级联特征分类器都位于cv2/data这个文件夹下,检测的对象和内容都包含在名称里。

导入并初始化分类器

自动获取xml文件路径

为了更方便的获取路径来导入,我们就可以使用sys.modules模块来获取这些文件的路径

#导入各个分类器xml文件
import sys
facehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_frontalface_default.xml')
eyehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_eye.xml')
smilehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_smile.xml')
print(facehaar)

初始化分类器

#初始化各个分类器
face_detector=cv2.CascadeClassifier(facehaar)
eye_detector=cv2.CascadeClassifier(eyehaar)
smile_detector=cv2.CascadeClassifier(smilehaar)

detectMutiScale函数

在进行检测时,我们主要用的detectMutiScale这个函数,使用前需要先定义分类器

#检测人脸
'''
detecMultiScale()函数参数详解:
image: 8-bit灰度图像
scaleFactor: float=1.1 图像金字塔缩放比例(每次缩小倍数),值越小检测越精细但速度越慢。
minNeighbors:int=3  候选矩形需有的最少相邻矩形数,值越大误检越少但可能漏检。
minSize:tuple 目标最小尺寸(如 (30, 30))主要用来忽略更小的区域以加速检测。
maxSize:tuple 目标最大尺寸(如 (100, 100))主要用来忽略更大的区域。
'''
faces=face_detector.detectMultiScale(image=gray_image,scaleFactor=1.15,minNeighbors=5)
mark_image=src_image.copy()
mark_image_gray=gray_image.copy()
for x,y,w,h in faces:cv2.rectangle(mark_image,(x,y),(x+w,y+h),(0,255,0),3)cv2.rectangle(mark_image_gray,(x,y),(x+w,y+h),0,3)
plt.subplot(1,2,1),plt.imshow(mark_image),plt.text(x=x,y=y,s='人脸')
plt.subplot(1,2,2),plt.imshow(mark_image_gray,cmap='gray'),plt.text(x=x,y=y,s='人脸')

detecMultiScale函数参数详解:

​​参数​​​​类型​​​​默认值​​​​说明​​
image8-bit 灰度图像输入的单通道灰度图像,需先通过 cv2.cvtColor() 转换。
scaleFactorfloat1.1图像金字塔缩放比例(每次缩小倍数),值越小检测越精细但速度越慢。
minNeighborsint3候选矩形需有的最少相邻矩形数,值越大误检越少但可能漏检。
minSizetuple (w, h)None目标最小尺寸(如 (30, 30),用来忽略更小的区域以加速检测。
maxSizetuple (w, h)None目标最大尺寸(如 (100, 100),用来忽略更大的区域。

 这里的这个minNeighbors参数与KNN中的K值有一些相似之处:

  • 两者都通过“邻居数量”过滤噪声或不确定性。
  • 值越大,结果越保守(漏检增多或分类边界更平滑);值越小,结果越敏感(误检增多或过拟合风险)。

detectMultiscale函数最终的返回值为list([x,y,w,h])即测到的目标矩形列表(左上角坐标 + 宽高)

如果有需要的话,我们还可以使用cv2.rectangle将检测到的目标在原始图像中绘制出来。

检测任务

        在检测时,我们只需要使用分类器.detectMultiScale即可进行后续的检查任务,这里我们以人脸,眼镜,以及微笑为例来进一步说明具体的使用方法。

读取图像

import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
src_image=cv2.imread(filename='strongman.jpg',flags=cv2.IMREAD_COLOR_RGB)
height,width=src_image.shape[:2]
plt.title('原始图像')
plt.xticks(ticks=range(0,width,10),minor=True)
plt.yticks(ticks=range(0,height,10),minor=True)
plt.imshow(src_image)

转为灰度图 

#转灰度图
gray_image=cv2.cvtColor(src=src_image,code=cv2.COLOR_RGB2GRAY)
plt.title('灰度图像')
plt.xticks(ticks=range(0,width,10),minor=True)
plt.yticks(ticks=range(0,height,10),minor=True)
plt.imshow(gray_image,cmap='gray')

导入要用到的XML文件 

#导入各个分类器xml文件
import sys
facehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_frontalface_default.xml')
eyehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_eye.xml')
smilehaar=sys.modules['cv2.data'].__file__.replace('__init__.py','haarcascade_smile.xml')

初始化各个分类器 

#初始化各个分类器
face_detector=cv2.CascadeClassifier(facehaar)
eye_detector=cv2.CascadeClassifier(eyehaar)
smile_detector=cv2.CascadeClassifier(smilehaar)

人脸检测

#检测人脸
faces=face_detector.detectMultiScale(image=gray_image,scaleFactor=1.15,minNeighbors=5)
mark_image=src_image.copy()
mark_image_gray=gray_image.copy()
for x,y,w,h in faces:cv2.rectangle(mark_image,(x,y),(x+w,y+h),(0,255,0),3)cv2.rectangle(mark_image_gray,(x,y),(x+w,y+h),0,3)
plt.subplot(1,2,1),plt.imshow(mark_image),plt.text(x=x,y=y,s='人脸')
plt.subplot(1,2,2),plt.imshow(mark_image_gray,cmap='gray'),plt.text(x=x,y=y,s='人脸')

分割人脸

faces_color=src_image[y:y+h,x:x+w]
faces_gray=gray_image[y:y+h,x:x+w]
plt.subplot(1,2,1),plt.imshow(faces_color)
plt.subplot(1,2,2),plt.imshow(faces_gray,cmap='gray')

 眼睛与微笑检测

#眼睛与微笑检测
mark_image=faces_color.copy()
mark_image_gray=faces_gray.copy()
eyes=eye_detector.detectMultiScale(image=faces_gray,scaleFactor=1.15,minNeighbors=2,minSize=(50,50),maxSize=(60,60))
for x,y,w,h in eyes:cv2.rectangle(mark_image,(x,y),(x+w,y+h),(0,255,0),3)cv2.rectangle(mark_image_gray,(x,y),(x+w,y+h),0,3) cv2.putText(img=mark_image,text='eyes',org=(x+w//6,y+h//2),fontFace=1,fontScale=1.8,color=(255,255,165))cv2.putText(img=mark_image_gray,text='eyes',org=(x+w//6,y+h//2),fontFace=1,fontScale=1.8,color=0)
smiles=smile_detector.detectMultiScale(image=faces_gray,scaleFactor=2,minNeighbors=7,minSize=(80,150),maxSize=(120,200))
for x,y,w,h in smiles:cv2.rectangle(mark_image,(x,y),(x+w,y+h),(255,0,0),3)cv2.rectangle(mark_image_gray,(x,y),(x+w,y+h),0,3)cv2.putText(img=mark_image,text='Smile',org=(x+w//3,y+h//2),fontFace=1,fontScale=1.8,color=(255,255,135))cv2.putText(img=mark_image_gray,text='Smile',org=(x+w//3,y+h//2),fontFace=1,fontScale=1.8,color=0)
plt.subplot(1,2,1),plt.imshow(mark_image),plt.text(x=200,y=50,s='微笑ing',color='black',size=15)
plt.subplot(1,2,2),plt.imshow(mark_image_gray,cmap='gray'),plt.text(x=100,y=50,s='微笑ing',color='black',size=10)

 总结

        以上便是 计算机视觉cv入门之Haarcascade的基本使用方法(人脸识别为例)的所有内容,如果你感到对你有用,可以一键三连支持一下博主!

相关文章:

  • 【后端】【Django】Django 模型中的 `clean()` 方法详解:数据校验的最后防线
  • 【人工智能】推荐开源企业级OCR大模型InternVL3
  • css3新特性第四章(渐变)
  • 【条形码识别改名工具】如何批量识别图片条形码,并以条码内容批量重命名,基于WPF和Zxing的开发总结
  • 【iOS】alloc init new底层原理
  • 嵌入式---零点漂移(Zero Drift)
  • 网络设备基础运维全攻略:华为/思科核心操作与巡检指南
  • IDEA多环节实现优雅配置
  • IDEA在Git提交时添加.ignore忽略文件,解决为什么Git中有时候使用.gitignore也无法忽略一些文件
  • 国际数据加密算法(IDEA)详解
  • 按字符串长度升序,长度相同则按字典序
  • 【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
  • 30天开发操作系统 第26天 -- 为窗口移动提速
  • 实现AWS Data Pipeline安全地请求企业内部API返回数据
  • 2026《数据结构》考研复习笔记四(第一章)
  • 蓝桥杯 二进制问题 刷题笔记
  • Linux操作系统简介:从开源内核到技术生态
  • BeautifulSoup 库的使用——python爬虫
  • AWS EC2完全指南:如何快速搭建高性能云服务器?
  • maven的安装与配置、IDEA集成maven
  • 上海黄金交易所:贵金属价格波动剧烈,提示投资者做好风险防范
  • 江西省人大教育科学文化卫生委员会主任委员王水平被查
  • 深一度|奥运一年后丢冠不稀奇,但究竟谁来扛起男乒的大旗
  • 嵩山少林风景区女游客进男厕:不能止步于批评
  • 外交部回应美新任驻日大使涉华言论:外交官的职责不应是抹黑别国、煽动对抗
  • 俄总统新闻秘书:乌克兰问题谈判相当艰难