2 使用opencv进行人脸检测和识别
opencv地Haar级联不具有旋转不变性
Haar级联数据来源于data文件中
xml中存放的是训练后的特征池,特征size大小根据训练时的参数而定,检测的时候可以简单理解为就是将每个固定size特征(检测窗口)与输入图像的同样大小区域比较,如果匹配那么就记录这个矩形区域的位置,然后滑动窗口,检测图像的另一个区域,重复操作。由于输入的图像中特征大小不定,比如在输入图像中眼睛是50x50的区域,而训练时的是25x25,那么只有当输入图像缩小到一半的时候,才能匹配上,所以这里还有一个逐步缩小图像,也就是制作图像金字塔的流程。
import cv2
filename = 'face.jpeg'
def detect(filename):
# CascadeClassifier,是Opencv中做人脸检测的时候的一个级联分类器,需要data文件夹中
#的xml文件作为输入
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#调用CascadeClassifier类中的detectMultiScale函数对灰度图像进行人脸检测
#输入参数为scaleFactor和minNeighbors分别表示人脸检测过程中每次迭代图像地压缩率
#以及每个人脸矩形保留近邻数目的最小值
#输出为人脸矩形数组
faces = face_cascade.detectMultiScale(gray,1.3,5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.namedWindow('Demo')
cv2.imshow('Demo',img)
cv2.waitKey()
cv2.destroyAllWindows()
detect(filename)
import cv2
def detect(filename):
#不同的配置xml
face_cascade = cv2.CascadeClassifier('cascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('cascades/haarcascade_eye.xml')
img = cv2.imread(filename)
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#检测脸
faces = face_cascade.detectMultiScale(gray_img,1.3,5)
for (x,y,w,h) in faces:
#绘制人脸矩形
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
#选择人脸矩形作为眼睛待检区域 注意opencv中y是宽,x是高
roi_gray = gray_img[y:y+h,x:x+w]
#进行眼睛检测
#限制眼睛搜索的最小尺寸为40*40像素
eyes = eye_cascade.detectMultiScale(roi_gray,1.03,5,0,(40,40))
#由于得到的坐标为roi_gray坐标,因此需要增加x和y变为img坐标
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(img,(ex+x,ey+y),(x+ex+ew,y+ey+eh),(255,0,0),2)
cv2.imshow('demo',img)
cv2.waitKey()
cv2.destroyAllWindows()
detect('face3.jpeg')
人脸识别
opencv3有三种人脸识别方法,分别基于Eigenfaces、Fisherfaces以及Local Binary Pattern Histogram(LBPH)
使用Eigenfaces进行识别
import cv2
model = cv2.face.createEigenFaceRecognizer()
model.train(np.asarray(X),np.asarray(y))
params = model.predict(roi)
print 'Label:%s, Confidence:%.2f' % (params[0],params[1])
使用Fisherfaces进行识别
model = cv2.face_createFisherFaceRecognizer()
使用LBPH的人脸识别
model = cv2.face.createLBPHFaceRecognizer()