当前位置:   article > 正文

face_recognition结合opencv进行多人脸识别_opencv face recognition

opencv face recognition

目录

step1:准备好opencv,numpy和face_recognition三个库

step2:准备好人脸图像

 step3:利用opencv读取三张图片

 step4:将图片转为特征向量,并将向量和名字添加到列表中,一一对应

step5:摄像头展示,读取摄像头图片帧

step6:将图片缩放到1/4,进行处理时候更加的迅速

step7: opencv摄像头读取的是BGR格式,这里转为face_recognition需要的RGB形式,同时将图像原图和图像中的所有人脸面部以及对应的所有特征信息放入faces_encodings列表中

step8:一一遍历该图像帧中所有人脸的面部特征,并计算特征向量的比较,compare_faces返回的是一个True和False的列表,同时获取当前人脸面部信息和数据库中的人脸面部信息的特征向量差值,即欧氏距离,姓名默认为unknown,用距离最小的图像的下标去在True和False的列表中去查看是否匹配,最终结果存放于detect_names中

step9:最后进行一个人脸检测框以及姓名标签的绘制,循环遍历一张图像中的所有人脸面部,以及一一对应的检测出的人脸的姓名,利用face_locations对应的人脸的(top, right, bottom, left)信息,进行绘制

step10:最后进行opencv的imshow显示图片,最后按q退出循环

全部代码:

效果图演示:


先来了解下face_recognition的各个函数的作用

开始进行识别:

step1:准备好opencv,numpy和face_recognition三个库

step2:准备好人脸图像

 step3:利用opencv读取三张图片

  1. frame1 = cv2.imread(r'images/liudehua.jpeg')
  2. frame2 = cv2.imread(r'images/shileipeng.png')
  3. frame3 = cv2.imread(r'images/linluocheng.jpg')

 step4:将图片转为特征向量,并将向量和名字添加到列表中,一一对应

  1. frame1_encoding = face_recognition.face_encodings(frame1)[0]
  2. encodings.append(frame1_encoding)
  3. names.append('liudehua')
  4. frame2_encoding = face_recognition.face_encodings(frame2)[0]
  5. encodings.append(frame2_encoding)
  6. names.append('shileipeng')
  7. frame3_encoding = face_recognition.face_encodings(frame3)[0]
  8. encodings.append(frame3_encoding)
  9. names.append('linluocheng')

step5:摄像头展示,读取摄像头图片帧

  1. while True:
  2. ret, img = cap.read()

step6:将图片缩放到1/4,进行处理时候更加的迅速

change_img = cv2.resize(img,(0,0),fx=0.25,fy=0.25)

step7: opencv摄像头读取的是BGR格式,这里转为face_recognition需要的RGB形式,同时将图像原图和图像中的所有人脸面部以及对应的所有特征信息放入faces_encodings列表中

  1. frame_RGB = change_img[:, :, ::-1]
  2. faces_locations = face_recognition.face_locations(frame_RGB)
  3. faces_encodings = face_recognition.face_encodings(frame_RGB, faces_locations)

step8:一一遍历该图像帧中所有人脸的面部特征,并计算特征向量的比较,compare_faces返回的是一个True和False的列表,同时获取当前人脸面部信息和数据库中的人脸面部信息的特征向量差值,即欧氏距离,姓名默认为unknown,用距离最小的图像的下标去在True和False的列表中去查看是否匹配,最终结果存放于detect_names中

  1. for face_encoding in faces_encodings:
  2. matches = face_recognition.compare_faces(encodings,face_encoding)
  3. distances = face_recognition.face_distance(encodings, face_encoding)
  4. min_distance_index = np.argmin(distances)
  5. name = 'unknown'
  6. if matches[min_distance_index]:
  7. name = names[min_distance_index]
  8. detect_names.append(name)

step9:最后进行一个人脸检测框以及姓名标签的绘制,循环遍历一张图像中的所有人脸面部,以及一一对应的检测出的人脸的姓名,利用face_locations对应的人脸的(top, right, bottom, left)信息,进行绘制

  1. for (top, right, bottom, left), name in zip(faces_locations, detect_names):
  2. top *= 4
  3. right *= 4
  4. bottom *= 4
  5. left *= 4
  6. cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 2)
  7. cv2.putText(img, name, (left, top - 6), font, 1.0, (255, 255, 255), 1)

step10:最后进行opencv的imshow显示图片,最后按q退出循环

  1. cv2.imshow('test',img)
  2. key = cv2.waitKey(1)
  3. if key == ord('q'):
  4. break

全部代码:

  1. import face_recognition
  2. import cv2
  3. import numpy as np
  4. cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
  5. encodings = []
  6. names = []
  7. font = cv2.FONT_HERSHEY_SIMPLEX
  8. detect_names=[]
  9. class init():
  10. frame1 = face_recognition.load_image_file(r'images/liudehua.jpeg')
  11. frame2 = face_recognition.load_image_file(r'images/shileipeng.png')
  12. frame3 = face_recognition.load_image_file(r'images/linluocheng.jpg')
  13. frame1_encoding = face_recognition.face_encodings(frame1)[0]
  14. encodings.append(frame1_encoding)
  15. names.append('liudehua')
  16. frame2_encoding = face_recognition.face_encodings(frame2)[0]
  17. encodings.append(frame2_encoding)
  18. names.append('shileipeng')
  19. frame3_encoding = face_recognition.face_encodings(frame3)[0]
  20. encodings.append(frame3_encoding)
  21. names.append('linluocheng')
  22. class show():
  23. while True:
  24. ret, img = cap.read()
  25. change_img = cv2.resize(img,(0,0),fx=0.25,fy=0.25)
  26. frame_RGB = change_img[:, :, ::-1]
  27. faces_locations = face_recognition.face_locations(frame_RGB)
  28. faces_encodings = face_recognition.face_encodings(frame_RGB, faces_locations)
  29. for face_encoding in faces_encodings:
  30. matches = face_recognition.compare_faces(encodings,face_encoding)
  31. distances = face_recognition.face_distance(encodings, face_encoding)
  32. min_distance_index = np.argmin(distances)
  33. name = 'unknown'
  34. if matches[min_distance_index]:
  35. name = names[min_distance_index]
  36. detect_names.append(name)
  37. for (top, right, bottom, left), name in zip(faces_locations, detect_names):
  38. top *= 4
  39. right *= 4
  40. bottom *= 4
  41. left *= 4
  42. cv2.rectangle(img, (left, top), (right, bottom), (0, 0, 255), 2)
  43. cv2.putText(img, name, (left, top - 6), font, 1.0, (255, 255, 255), 1)
  44. cv2.imshow('test',img)
  45. key = cv2.waitKey(1)
  46. if key == ord('q'):
  47. break
  48. if __name__ == '__main__':
  49. init()
  50. show()
  51. cap.release()
  52. cv2.destroyAllWindows()

效果图演示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/945784
推荐阅读
相关标签
  

闽ICP备14008679号