在本节将介绍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()
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
