前面一文我们介绍了电脑打开摄像头,没基础的小伙伴可以点下面链接去看看
opencv人脸识别(一)调用笔记本摄像头
本文我将介绍opencv人脸检测,我使用的是LBP特征级联分类器,这个模型是2016年12月21日上传的,使用 OpenCV 的级联分类器 CascadeClassifier加载预训练模型lbpcascade_frontalface_improved.xml,这个模型我放在了迅雷网盘上的地址如下:
链接:https://pan.xunlei.com/s/VN3KgTfLTRfTHox3_bizI4mBA1
提取码:35qw
人脸识别流程:
代码演示:
import cv2
import time
#加载训练模型
face_detect=cv2.CascadeClassifier(r"./data1/lbpcascade_frontalface_improved.xml")
cap=cv2.VideoCapture(0)
while cap.isOpened():
#读取摄像头画面
frla,img=cap.read()
#画面翻转y轴
img=cv2.flip(img,1)
#视频图片经过灰色处理后只有黑白两种颜色,像素的位置并不会改变,便于像素识别
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#进行人脸检测
faces = face_detect.detectMultiScale(
img_gray, #进行检测的灰度图片
scaleFactor=1.02,#将检测图片放大1.02被
minNeighbors=5)#表示构成检测目标的相邻矩形的最小个数(默认为3个),这里设置了5个。
#判断是否有人脸
if len(faces):
#遍历检测到的人脸
for x,y,w,h in faces:
#绘制人脸矩形框
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
if cv2.waitKey(30) & 0xff == ord('q'):
break
if cv2.waitKey(30)&0xff == ord('s'):#按s键保存图片
timer=time.time()#获取时间戳
name=str(int(timer))+".jpg"#将时间戳转换成字符串类型和.jpg拼接,用作下一步的保存图片的名字
cv2.imwrite(name,img)#保存图片
print("图片保存成功")
#显示人脸
cv2.imshow("face",img)
#释放摄像头
cap.release()
#销毁窗口
cv2.destroyAllWindows()
detecMultiScale()
opencv中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示)所以我们遍历返回的人脸数据faces就可以使用opencv中的rectangle()方法绘制人脸矩形框,函数由分类器对象调用。
函数的相关参数介绍:
参数 | 说明 |
---|---|
image | 待检测图片,使用灰度图识别效果好 |
objects | 表示检测到的人脸目标序列 |
scaleFactor | 表示每次图像尺寸减小的比例 |
minNeighbors | 表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸), |
flags | 要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为 CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域, 因此这些区域通常不会是人脸所在区域; |
minSize | 目标最小尺寸 |
maxSize | 目标最大尺寸 |
cv2.rectangle(img, pt1, pt2, color, thickness)
rectangle()经常使用的参数:
参数 | 说明 |
---|---|
img | 要操作的图片 |
pt1 | 矩形框的左上角坐标 |
pt2 | 矩形框的右下角坐标 |
color | 矩形框线条颜色 |
thickness | 矩形框的线条粗细 |
我使用女神做了测试,我们看看效果:
我编写的一个opencv人脸识别案例:地址YueXia/Face-opencv - 码云 - 开源中国 (gitee.com)