对于人脸识别开门的想法


前言

大学在大二还是大三建了很多人脸识别控制开关的门(记忆模糊,也许是封傻了),不由得引起思考。这些工程是如何实现的

使用Python 3.8.0
操作系统Windows11
可以去看看Murtaza’Workshop,这是一位油管博主,印度口音,但是在CV方面的实践很值得看


线索

  • 当我们在家里上网课的时候,班干部说过,要求每个人拍一张照片。

  • 这个照片最好是正面,最好整洁一点。(≡ ̄﹏ ̄≡)也许会有人和我一样

  • 回到学校后你通过那扇门的时候应该会注意到你的绝世容颜就会出现在显示屏上 ✪υ✪

思路

电影案例

  • 回忆起来一个经典片段:润发:这照片是你吗? 姜文:是,那时候我还很瘦。

  • 周润发说:“这就不是你。” 于是打开了Pycharm鼓捣了一顿,借助了第三方库 face_recognition来进行验证(^∀^)



分析

  • 电影情节:既然要通缉犯人,就要发布悬赏令,犯人不止一个,悬赏令也不止一个,也许在一个柜子里面存放着许多犯人的悬赏令,当抓到犯人后,会从悬赏令中一个一个与犯人的脸进行对比,就能知道他到底是谁。

  • 我们把名词进行改变,既然你要进出,就需要你的照片,学生不止一个,照片也不止一个,也许在一个文件夹或者数据库中存放着很多学生的照片,当你要出去,摄像头就会扫描你的脸与文件夹或数据库里面的照片进行对比,就能知道你能不能出去。

实际原理

之前提到的face_recognition是实现这个项目的关键库。这个库可以把人脸图像编码为128维向量,我们只需要输入图像即可,非常Nice。然后我们得到了你照片人脸的128维向量,当你站在摄像头面前的时候,摄像头会动态的识别你的脸,然后也进行编码,将两者进行比较,Value越靠近0越说明你就是照片上的人。
在这里插入图片描述


步骤

  1. 我们将创建一个文件夹,我们将在其中放置图像,然后遍历它们以获取读取它们的图像路径,将里面图像的文件名称改为:名字+后缀 ——>>Lena.png

  2. 找到图像的编码并将它们放入名为encodeListknown的列表中,然后打开相机以获取当前人脸的位置和编码

  3. 将相机捕获的面部与我们之前制作的文件夹中的图像进行比较,然后我们得到不同的结果,我们需要的是比较后的最小值,如果匹配两个人脸图像,则在框架上放置一个边界框。

  4. 录制名称和时间,我们可以创建一个cvs文件, 然后定义一个函数来记录当前名称和时间

    如果你如图所示

    没关系看看图总是好的。

Way to read the key codes

其实老外们写这些的时候,函数名称可能已经说的足够明白这个是干什么的,如果你还不明白可以Ctrl+左键进去读下解释,他会告诉你你应该给什么param,这个函数会return什么,写的清清楚楚,而且这个代码很简单,很容易看懂

成果和代码展示:(这里就不用展示我的帅气了(=ˇωˇ=))

Showmaker向众神祈祷,回应他的只有两年前的自己!(然后记录的当前的时间)



import os
from datetime import datetime
import cv2
import numpy as np
import face_recognition

path = "E:/PycharmProjects/faceImage"
images = []
classNames = []
myLists = os.listdir(path)
print(myLists)
for cls in myLists:
    curImg = cv2.imread(f"{path}/{cls}")
    images.append(curImg)
    classNames.append(os.path.splitext(cls)[0])
print(classNames)


def findEncodings(images):
    encodeList = []
    for img in images:
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        encode = face_recognition.face_encodings(img)[0]
        encodeList.append(encode)
    return encodeList


def markAttendance(name):
    with open("Attendance.csv","r+") as f:
        myDateList = f.readlines()
        nameList = []
        for line in myDateList:
            entry = line.split(",")
            nameList.append(entry[0])
        if name not in nameList:
            now = datetime.now()
            dtString = now.strftime("%H:%M:%S")
            f.writelines(f"\n{name},{dtString}")


encodeListKnown = findEncodings(images)
print("Encoding Complete")

cap = cv2.VideoCapture(0)
while True:
    success, img = cap.read()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    faceCurFrame = face_recognition.face_locations(imgS)
    encodingCurFrame = face_recognition.face_encodings(imgS, faceCurFrame)

    for encodeFace, faceLoc in zip(encodingCurFrame, faceCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        print(faceDis)
        matchIndex = np.argmin(faceDis)

        if matches[matchIndex]:
            name = classNames[matchIndex].upper()
            print(name)
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4
            cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.rectangle(img, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
            cv2.putText(img, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)
    cv2.imshow("webCam", img)
    cv2.waitKey(15)

问题总结

  • 问题一:因为你是动态计算的人脸的128维度向量,所以当我的脸靠近摄像头的时候,帧数会下降很多,变卡。
  • 问题二:可能会出现误识别的现象,当你的阈值取得不好,识别的效果可能也不好
  • 问题三:可以尝试将连接MySQL数据库和Python连接起来
  • 问题四:最好不要有中文
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苇名城的芦苇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值