概述
第5章:人脸检测和识别(原书第二版目录)
5.1 Haar级联的概念
5.2 获取Haar级联数据
5.3 使用OpenCV进行人脸检测
5.3.1 静态图像中的人脸检测
5.3.2 视频中的人脸检测
5.3.3 人脸识别
5.4 总结
类Haar特征:一种用于实现实时人脸跟踪的特征。每个类Haar特征都描述了相邻图像区域的对比模式。
窗口大小:对给定图像,特征会因区域大小而有所不同
级联:图像之间的特征集合。Haar级联具有尺度不变性,也即尺度变化上具有鲁棒性
OpenCV提供的Haar级联不具有旋转不变性
静态图像中的人脸检测
import cv2
filename = 'img/Img.jpg'
def detect(filename):
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# scaleFactor表示人脸检测过程中每次迭代时图片的压缩率(1.3)
# minNeighbors:每个人脸矩形保留近邻数目的最小值(5)
for (x, y, w, h) in faces:
# 通过坐标绘制矩形,x,y是左上角坐标;w,h分别是宽度和高度
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 其中参数的含义:(255, 0, 0)表示颜色, 2表示线条粗细
cv2.namedWindow('Viking Detected!!')
cv2.imshow('Viking Detected!!', img)
cv2.imwrite('/img/viking.jpg', img)
cv2.waitKey(0)
detect(filename)
代码中的两个参数不太理解,标记一下。scaleFactor和minNeighbors
minNeighbors为5的时候,表明至少有5次重叠检测。
调为1的时候
调为0的时候,百度上的解释是:此时函数不做任何操作就返回所有的被检候选矩形框
视频中的人脸检测
效果不是很好,脸可以准确识别,但是眼睛识别不了。
对于脸部的识别一旦有遮挡也是无法识别。
import cv2
def detect():
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture('video/input.avi') # 读取视频文件
while(True):
ret, frame = camera.read() # 从视频中获取布尔值(是否读取帧)以及帧本身
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x, y, w, h) in faces:
img = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
roi_gray = gray[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray, 1.03, 5, 0, (40, 40))
for (ex, ey, ew, eh) in eyes:
cv2.rectangle(img, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
cv2.imshow("camera", frame)
if cv2.waitKey(1000//50) & 0xff == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if __name__ =="__main__":
detect()
在网上找的另一段代码,记录一下:OpenCV-Python 摄像头实时识别人脸
代码相比简洁一些,本质还是一样的。
import cv2
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml') # 加载人脸特征库
while(True):
ret, frame = cap.read() # 读取一帧的图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰
faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.15, minNeighbors = 5, minSize = (5, 5)) # 检测人脸
for(x, y, w, h) in faces:
cv2.rectangle(gray, (x, y), (x + w, y + h), (0, 255, 0), 2) # 用矩形圈出人脸
cv2.imshow('Face Recognition', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 释放摄像头
cv2.destroyAllWindows()
人脸识别
实现人脸识别的方法之一:用一系列分好类的图像(人脸数据库)来训练程序,并基于这些图像进行识别
1、生成人脸识别数据
import cv2
def generate():
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
camera = cv2.VideoCapture(0) # 使用第一个摄像头
count = 0
while (True):
ret, frame = camera.read()
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
else:
break
faces = face_cascade.detectMultiScale(gray, 1.3, 3)
for (x, y, w, h) in faces:
img = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
f = cv2.resize(gray[y:y+h, x:x+w], (200, 200))
cv2.imwrite('jm/%s.pgm' % str(count), f)
count += 1
cv2.imshow("camera", frame)
if cv2.waitKey(1000 // 50) & 0xff == ord("q"):
break
camera.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
generate()
运行生成
2、人脸识别
OpenCV3有三种人脸识别方法,基于三种不同算法:Eigenfaces、Fisherfaces、Local Binary Pattern Histogram(LBPH)
书中贴了几个链接
Principal Component Analysis(PCA):https://arxiv.org/pdf/1404.1100v1.pdf
下略
3、准备训练数据
需要两个数组:图像数组和标签数组。创建一个基于逗号分隔符的CSV文件,用来根据ID记录样本图像的路径。
4、加载数据并识别人脸
书本上的代码,还有一点不明白。
5、基于Eigenfaces的人脸识别
6、基于Fisherfaces的人脸识别
7、基于LBPH的人脸识别
8、通过置信度评分来丢弃结果
最后
以上就是细腻电灯胆为你收集整理的OpenCV计算机视觉(Python实现)-3:人脸检测和识别的全部内容,希望文章能够帮你解决OpenCV计算机视觉(Python实现)-3:人脸检测和识别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复