首页 理论教育 OpenCV人脸检测教程

OpenCV人脸检测教程

时间:2026-01-27 理论教育 凌薇 版权反馈
【摘要】:在本节将介绍OpenCV一个比较综合的应用——人脸检测,这也是OpenCV较为常见的应用场景。OpenCV中的人脸检测主要使用了Haar级联分类器,可以使用已经预训练好的模型直接调用。参数列表中的scaleFactor表示图片缩放比例,用于创建多尺度金字塔图像,1.05表示在金字塔层中逐层减小图像尺寸的5%;minNeighbors表示滑窗内设置多少个矩形来检测是否有人脸;minSize表示最小滑窗的尺寸,分类器检测的图像均大于该尺寸的滑窗。

在本节将介绍OpenCV一个比较综合的应用——人脸检测,这也是OpenCV较为常见的应用场景。OpenCV中的人脸检测主要使用了Haar级联分类器,可以使用已经预训练好的模型直接调用。Haar级联分类器会从左到右,从上到下,用不同大小的滑窗去扫描整张图片。滑窗每移动一定数量的像素,分类器便会检测滑窗内是否有人脸。

以下代码是人脸的检测示例,其中之所以将彩色图转换为灰度图主要是为了提高检测速度。

import cv2

img=cv2.imread('lena.jpg')

#将图片转化成灰度图像

gray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#加载Haar级联分类器模型

face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

faces_rects=face_cascade.detectMultiScale(gray, scaleFactor=1.05,min-Neighbors=5,minSize=(30,30))

#在原先的彩色图像上标志出宽度为2的蓝色包围框

for(x, y,w, h)in faces_rects:

img=cv2.rectangle(img,(x, y),(y+h, x+w),(255,0,0),2)

cv2. imshow('img',img)

cv2. waitKey()

cv2. destroyAllWindows()

以上代码中,cv2.CascadeClassifier(param_file)分类器接收一个XML文件地址参数,此文件可以从https://github.com/opencv/opencv/tree/master/data/haarcascades下载,然后就可以使用detectMultiScale函数进行目标(人脸)检测。参数列表中的scaleFactor表示图片缩放比例,用于创建多尺度金字塔图像,1.05表示在金字塔层中逐层减小图像尺寸的5%;minNeighbors表示滑窗内设置多少个矩形来检测是否有人脸;minSize表示最小滑窗的尺寸,分类器检测的图像均大于该尺寸的滑窗。返回参数faces_rects为代表了有人脸的矩形框,可以是包括多个人脸信息的一个列表,每一个矩形框均表示为(x, y,w, h),其中x, y表示左上点坐标,w和h表示宽度与高度(图3-18)。

图3-18 OpenCV人脸检测图像

对于视频或摄像头同样可以用OpenCV进行类似的操作,区别在于主要采用cv2.VideoCapture函数获取视频中的图像帧,每一帧就对应一幅图像,其余后续操作类似上面的例子,如果读取视频所有帧或利用摄像头循环检测便可用作人脸跟踪,在此不做赘述,以下展示主要代码:

import cv2

#加载Haar级联分类器模型

face_cascade=cv2.CascadeClassifier("haarcascade_frontalface_default.(https://www.xing528.com)

xml")

cameraCapture=cv2.VideoCapture(0)

if cameraCapture. isOpened():

while True:

success, image=cameraCapture.read()

if success:

#将图片转化成灰度图像

gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

faces=face_cascade.detectMultiScale(gray, scaleFactor=1.

25,minNeighbors=5,minSize=(30,30))

#在原先的彩图上画出包围框(蓝色框,边框宽度为2)

for(x, y,w, h)in faces:

img=cv2.rectangle(image,(x, y),(y+h, x+w),(255,0,0),2)

cv2. imshow('img',image)

else:

break

if cv2. waitKey(5)&0xFF==ord('q'):

cameraCapture. release()#释放资源

break

cv2. destroyAllWindows()

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈