Python 基于OpenCV+face_recognition实现人脸捕捉与人脸识别(照片对比)

2023-05-16

1.安装包依赖

与上篇通过摄像头动态识别人脸一样,先下载好opencv-python、face-recognition,这里因为使用的是照片对比的方式,特意使用tkinter画了一个简单的GUI方便操作。

在python 3以上版本tkinter是环境自带的,所以这里不需要安装

2.代码示例

import os
import cv2
import numpy as np
import face_recognition
import tkinter as tk  
import tkinter.filedialog
from PIL import Image,ImageTk 

classNames=[]
img_path='Picture'
img_recognition_path='Recognition'
existsEncodeingList=[]
#对人脸集合进行编码进行处理
def findEncodeings(images):
    for img in images:
        #灰度处理
        img=cv2.cvtColor(src=img,code=cv2.COLOR_BGR2RGB)
        #face_encodings对图片对象a_images进行编码并返回数组0位置编码结果
        encode=face_recognition.face_encodings(img)[0]
        existsEncodeingList.append(encode)

#获取当前存储的人脸编码集合
def findExistsEncodeingList(img_path):
    images=[]
    #列出已经上传的所有图片
    imgList=os.listdir(img_path)
    #处理存储的图片得到其人脸编码
    for pic in imgList:
        img=cv2.imread('{}/{}'.format(img_path,pic))
        images.append(img)
        classNames.append(os.path.splitext(pic)[0])
    findEncodeings(images)

#选择并对比图片
def choosepic():
    choosepath = tkinter.filedialog.askopenfilename()
    path.set(choosepath)
    img_open = Image.open(entry.get()).resize((530,750))
    img = ImageTk.PhotoImage(img_open)
    lableShowImage.config(image=img)
    lableShowImage.image = img
    lableShowImage.place(x=30, y=70, width=530, height=750)
    faceRecognition(choosepath)

def faceRecognition(choosepath):
    frame=cv2.imread(choosepath)
    frameRGB=cv2.cvtColor(src=frame,code=cv2.COLOR_BGR2RGB)
    #对摄像头读取的检测人脸
    facesLocate=face_recognition.face_locations(frameRGB)
    #进行特征编码
    faceEncoded=face_recognition.face_encodings(frameRGB,facesLocate)
	#遍历检测的人脸和库中读取的图片进行对比,计算其相似度
    name='unknow'
    for (top,right, bottom,left),face_encoding in zip(facesLocate,faceEncoded):
        #进行匹配
        matchs=face_recognition.compare_faces(existsEncodeingList,face_encoding)
        #计算相似度
        distance=face_recognition.face_distance(existsEncodeingList,face_encoding)
        lab='unknow'
        for index, item in enumerate(distance):
           if item<0.5:
                if matchs[index]:
                    #得到匹配到的图片名称与相似度值
                    lab='name:{}; Similarity:{}'.format(classNames[index],item)
                    name=classNames[index]
                    break
        #初始化面部捕捉框显示绿色
        color1 =(0,255,0)
        if name =='unknow':
            #未能识别的时候显示蓝色
            color1 =(255,0,0)
        #画面部捕捉框
        cv2.rectangle(img=frame,pt1=(left,top),pt2=(right,bottom),color=color1,thickness=3)
        #在捕捉框上添加匹配到的图片信息
        cv2.putText(frame, lab, (left,top-8),cv2.FONT_HERSHEY_SIMPLEX, 0.7, color1, 2)
        cv2.imwrite('{}/{}.png'.format(img_recognition_path,name),frame)
    img_Recognition = Image.open('{}/{}.png'.format(img_recognition_path,name)).resize((530,750))
    img = ImageTk.PhotoImage(img_Recognition)
    lableShowImage2.config(image=img)
    lableShowImage2.image = img
    lableShowImage2.place(x=630, y=70, width=530, height=750)

if __name__ == '__main__':
    findExistsEncodeingList(img_path)
    #生成tk界面 app即主窗口
    app = tk.Tk()  
    #修改窗口titile
    app.title("show pictue")  
    #设置主窗口的大小和位置
    app.geometry("1200x900+200+50")
    #Entry widget which allows displaying simple text.
    path = tk.StringVar()
    entry = tk.Entry(app, state='readonly', text=path,width = 100)
    entry.pack()
    #使用Label显示图片
    lableShowImage = tk.Label(app)
    lableShowImage.pack()
     #使用Label2显示处理后的图片
    lableShowImage2 = tk.Label(app)
    lableShowImage2.pack()
    #选择图片的按钮
    buttonSelImage = tk.Button(app, text='choose picture', command=choosepic)
    buttonSelImage.pack()
    app.mainloop()

3.说明

首先我将需要被识别的人脸的照片预设到项目目录的Picture文件夹下,然后创建一个Recognition目录存放识别过的图片,这样方便在一个界面上展示对比结果照片。

 其实对比结果也可以不用存,直接将处理后的图片缓存直接展示在界面上,这里需要改一下此处的代码,将上述代码注释掉,然后换成下面的那行,通过数组直接转成图片

 但是效果会存在色彩的失真,效果如下:

也尝试了PIL的九种不同图片模式: 1,L,P,RGB,RGBA,CMYK,YCbCr,I,F,最终效果也没达到,大概与我resize((530,750))这个有关,也没继续纠结,有兴趣的同学可以尝试一下。

这里简单提下PIL的九种不同图片模式:

modes描述
11位像素,黑和白,存成8位的像素
L8位像素,黑白
P8位像素,使用调色板映射到任何其他模式
RGB3× 8位像素,真彩
RGBA4×8位像素,真彩+透明通道
CMYK4×8位像素,颜色隔离
YCbCr3×8位像素,彩色视频格式
I32位整型像素
F32位浮点型像素

4.实现效果

 

 

 可以实现简单的人脸对比,Similarity代表相似度值,值越小代表人脸与预设的图片越相似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 基于OpenCV+face_recognition实现人脸捕捉与人脸识别(照片对比) 的相关文章

  • 基本矩阵F和本质矩阵E的详细推导

    基本矩阵F E在计算机视觉中是提纯匹配点 恢复相机位姿的一个法宝 但是它是如何得到的 下面笔者做其简单的推导 如图下图 xff0c 两视几何图 其中C和C 分别代表左 右摄影中心 xff0c x和x 代表同名像点 xff0c e和e 代表极
  • [ubuntu]安装并使用python 3.6及与2.7的切换

    当前使用ubuntu14 04 1 添加python3 6安装包 xff0c 并安装 xff08 也可以去官网下载安装包 xff09 linux 报错E Unable To Locate Package Software propertie
  • Python + Requests 模拟登陆(含验证码)

    其实模拟登陆非常简单 xff0c 只要在打开网站的同时提交数据就可以了 下面通过登陆超星网来举例说明如何一步步实现模拟登陆 1 获取需要提交的数据 使用chrome的Network或者fiddler可以很轻易的得到我们想要的数据 xff0c
  • Cmake实现递归cpp和h

    为解决获取编译链所有C 43 43 源文件和头文件 Cmake实现递归目录 编程心得 拾随小笺
  • 鉴权 前后端常见的几种鉴权方式

    https juejin cn post 6844903927100473357 鉴权 xff08 authentication xff09 是指验证用户是否拥有访问系统的权利 传统的鉴权是通过密码来验证的 这种方式的前提是 xff0c 每
  • curl指令模拟postman发json数据,发本地文件

    菜鸟curl指令介绍 xff1a https www coonote com linux linux cmd curl html post formdata多个参数 多个参数可以使用 F进行串接 curl span class token
  • 最全的HTTP(get post)请求示例, 包括post模拟get请求

    public class HttpRequest private static SimpleDateFormat sdf 61 new SimpleDateFormat 34 yyyyMMddHHmmss 34 private static
  • python爬虫——模拟登陆

    参考链接 xff1a https blog csdn net weixin 39875941 article details 109878457 模拟登陆 Python网络爬虫应用十分广泛 xff0c 但是有些网页需要用户登陆后才能获取到信
  • vector数组 传递 引用 指针 参数

    一 一维 span class hljs stl container span class hljs built in vector span lt span class hljs keyword int span gt span vec
  • Oracle # 字符串匹配函数(Oracle、SQLSERVER、Excel)

    引言 xff1a 当数据库设置字段的时候 xff0c 会设置1表XXX xff1b 0表示XXX 查询的时候怎么显示汉字呢 xff1f Oracle数据库 xff1a 普通查询数据 xff1a select from U ORANGEZAT
  • 时间序列预测——Prophet模型

    文章链接 xff1a 时间序列预测 ARIMA模型 https blog csdn net beiye article details 123317316 spm 61 1001 2014 3001 5502 1 Propht模型概述 Pr
  • 机器人导航——路径跟踪

    要完成一套完整的机器人路径规划 xff0c 并完成其物理实验并非一件简单的事情 参考 xff1a http wenku baidu com link url 61 n11mP6EDlM78NZYZ4yQYXzmzPeBV6BeLNOUjIv
  • python 读取txt出现\xef\xbb\xbf…的问题

    用python读取txt文件 xff0c 文件的内容是一列数如下 xff1a 1883 1886 1900 1900 1897 1897 1897 1897 1906 1917 1910 1910 但是读取的时候第一个元素为 xef xbb
  • (算法)判断两个区间是否重叠

    题目 xff1a 判断两个区间是否重叠 思路 xff1a 假设区间表示为 start end xff0c 先存在两个区间A B 两个区间的关系有两种 xff1a 重叠与不重叠 重叠的情况有4种 xff0c 两种相交 xff0c 两种包含 x
  • python ctrl+c 退出while True:

    写了一个死循环 xff0c 类似 xff1a def function while True my code 程序运行后想用ctrl 43 c按键停止程序 xff0c 可是终止不了 以下为解决办法 xff1a 第一步 xff1a 加入sys
  • python二维字典

    感谢原文 xff1a http www jb51 net article 83108 htm 本文实例讲述了Python的 二维 字典 two dimension dictionary 定义与实现方法 分享给大家供大家参考 xff0c 具体
  • ros安装出现依赖问题

    http www liuxiao org 2015 10 ros E5 9C A8 ubuntu 14 04 E7 B3 BB E7 BB 9F E4 B8 8A E5 AE 89 E8 A3 85 ros indigo 0 安装环境 xf
  • KMP算法介绍

    参考 xff1a https www cnblogs com c cloud p 3224788 html 前言 之前对kmp算法虽然了解它的原理 xff0c 即求出P0 Pi的最大相同前后缀长度k xff1b 但是问题在于如何求出这个最大
  • 【python】*与** 参数问题

    原文地址 xff1a https www cnblogs com paulwinflo p 5764748 html 可变参数 在Python函数中 xff0c 还可以定义可变参数 顾名思义 xff0c 可变参数就是传入的参数个数是可变的
  • 计算机网络编程知识总结

    博客出处 xff1a http www cnblogs com maybe2030 阅读目录 1 网络层次划分 2 OSI七层网络模型 3 IP地址 4 子网掩码及网络划分 5 ARP RARP协议 6 路由选择协议 7 TCP IP协议

随机推荐