计算机视觉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的基本使用方法(人脸识别为例)的所有内容,如果你感到对你有用,可以一键三连支持一下博主!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值