人脸识别就是一个程序能识别给定图像或视频中的人脸,OpenCV是用一系列分类好的图像来训练程序,并基于这些图像来进行识别。
它的每个识别,都有置信评分,在实际应用中通过对其设置阈值来进行筛选。
为了简单实现人脸识别的功能,写了几个函数从文件夹的图片、从视频中获取头像数据集合
-
从视频中获取头像
- 创建存储头像的文件夹,用名称做文件夹的名字
- 用上一节的检查头像的方法,检测到头像后,调整大小到200*200,方便后面头像识别时对比
def genarate(user_name):
userdir = './data/at/%s' % user_name
if not os.path.exists(userdir):
print('make dir ', userdir)
os.mkdir(userdir)
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')
camera = cv2.VideoCapture(0)
isopen = camera.isOpened()
if not isopen:
print('打开摄像头失败...')
camera.set(3, 1280)
camera.set(4, 720)
cv2.namedWindow('face')
while isopen:
ret, frame = camera.read()
if ret:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.2, 5,minSize=(50,50))
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
f = cv2.resize(gray[y:y+h,x:x+w],(200,200))
filename = './data/at/%s/%s.pgm' % (user_name, str(count))
cv2.imwrite(filename, f)
cv2.imshow('face', frame)
pressKey = cv2.waitKey(1)
if cv2.getWindowProperty('face', cv2.WND_PROP_AUTOSIZE) < 1:
break
if pressKey == 27: # ESC
print('退出。。。。。')
break
else:
break
camera.release()
cv2.destroyAllWindows()
-
从文件夹中获取头像图片
- 传入待查找的文件夹
- 读取目录里面的.jpg的图片,进行头像检测
- 将检测到头像存到文件夹中。(此处生成的图片用了.jpg的后缀,没有用之前的.pgm,用JPG方便后面手工分类,可以看到预览图)
- 这个函数主要是把目录里面的所有的头像生成到一个位置,再手工拷贝到对应的训练库的文件夹中去
def getpic_fromdir(dirname):
face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_alt.xml')
cv2.namedWindow('face',0)
cv2.resizeWindow('face',1280,720)
count = 0
for filename in os.listdir(dirname):
filedir = os.path.join(dirname,filename)
if os.path.isdir(filedir):
con