码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • face_recognition结合opencv进行多人脸识别


    目录

    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()

    效果图演示:

  • 相关阅读:
    mac 桌面不能右键 文件也不见了 但在finder的桌面上有
    【Linux】RPM包使用详解
    8月3日第壹简报,星期三,农历七月初六
    【云原生之Docker实战】使用docker部署DokuWiki知识库系统
    Java基础—char类型数据
    创作一款表情包生成微信小程序:功能详解与用户体验优化
    现学现用的 10 个 Python 技巧
    Spring 使用指南 ~ 1、Spring 的 IOC 和 DI 简介
    数据集MNIST手写体识别 pyqt5+Pytorch/TensorFlow
    正则表达式提取豆瓣T250中的部分信息
  • 原文地址:https://blog.csdn.net/weixin_54627824/article/details/127137534
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号