计算机视觉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函数参数详解:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
image | 8-bit 灰度图像 | 无 | 输入的单通道灰度图像,需先通过 cv2.cvtColor() 转换。 |
scaleFactor | float | 1.1 | 图像金字塔缩放比例(每次缩小倍数),值越小检测越精细但速度越慢。 |
minNeighbors | int | 3 | 候选矩形需有的最少相邻矩形数,值越大误检越少但可能漏检。 |
minSize | tuple (w, h) | None | 目标最小尺寸(如 (30, 30), 用来 忽略更小的区域以加速检测。 |
maxSize | tuple (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的基本使用方法(人脸识别为例)的所有内容,如果你感到对你有用,可以一键三连支持一下博主!