linux实现人脸识别锁定解锁
环境
archlinux
桌面管理器i3wm
登录管理器 slim
python 3.10.4
dlib
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple dlib
face_recognition 依赖dlib
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple face_recognition
opency 读取摄像头
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
笔记本内置摄像头
流程图

代码
"""
人脸识别认证
使用摄像头检验当前用户是否匹配
"""
# -*- coding: utf-8 -*-
import cv2
import os
import face_recognition
import pyautogui
import time
class AuthByFace:
    def __init__(self, clicked, clocked):
        self.clicked = clicked
        self.clocked = clocked
        # 设置图像保存目录
        self.SUCCESS_DIR = os.environ['HOME'] + "/Pictures/authFaces/success/"
    # 认证通过返回true
    def isAuthSuccess(self):
        # 获取摄像头中人脸
        cameraCapture = cv2.VideoCapture(0)
        result, image = cameraCapture.read()
        if result:
            # cameraImageRgb = image[:, :, ::-1]
            # 摄像头中的人脸位置, 可能出现多张脸
            cameraImageFaceLocations = face_recognition.face_locations(image)
            # 摄像头中人脸进行编码
            cameraImageEncodings = face_recognition.face_encodings(image, cameraImageFaceLocations)[0]
            # 使用仓库中文件 测试匹配
            # unknownImage = face_recognition.load_image_file(self.SUCCESS_DIR + "image_1.jpg")
            # cameraImageEncodings = face_recognition.face_encodings(unknownImage)[0]
            personNames = []
            knownImageEncodings = []
            # 跟所有保存的人脸比对
            files = os.listdir(self.SUCCESS_DIR)
            for file in files:
                if file.endswith("jpg") or file.endswith("png"):
                    name, _ = os.path.split(file)
                    personNames.append(name)
                    knowImagePath = self.SUCCESS_DIR + file
                    knownImage = face_recognition.load_image_file(knowImagePath)
                    # 将仓库中照片全部编码, 后续比对需要
                    knownImageEncodings.append(face_recognition.face_encodings(knownImage)[0])
            # 遍历locations,face_encodings,识别图片中的人脸
            matchs = face_recognition.compare_faces(knownImageEncodings, cameraImageEncodings)
            print("hhaha", matchs)
            for index, match in enumerate(matchs):
                if match:
                    # 有一个匹配就返回
                    print("图像: ", personNames[index], "匹配成功")
                    return True
    # 打开摄像头, 监听鼠标事件
    def onMouse(self, event, x, y, flags, param):
        # 点击左键, 重置click状态
        if event == cv2.EVENT_LBUTTONUP:
            self.clicked = True
    def savePicture(self):
        # 打开摄像头
        # VideoCapture()中参数是0,表示打开笔记本的内置摄像头,
        # 参数是视频文件路径则打开视频
        cameraCapture = cv2.VideoCapture(0)
        if not cameraCapture.isOpened():
            print("摄像头未打开~~")
            exit()
        cameraCapture.set(3, 100)
        # 帧宽度和帧高度都设置为100像素
        cameraCapture.set(4, 100)
        cv2.namedWindow('MyWindow')
        cv2.setMouseCallback('MyWindow', self.onMouse)
        # 点击左键保存
        print('showing camera feed. Click window or press and key to stop.')
        result, image = cameraCapture.read()
        # True/False 是否读取到照片
        print(result)
        # 点击鼠标左键后, 保存图片, 关闭窗口
        while result and cv2.waitKey(1) == -1 and not self.clicked:
            cv2.imshow('MyWindow', cv2.flip(image, 0))
            result, image = cameraCapture.read()
            name = self.SUCCESS_DIR + 'image_0.jpg'
            cv2.imwrite(name, image)
        cv2.destroyWindow('MyWindow')
        cameraCapture.release()
if __name__ == '__main__':
    authByFace = AuthByFace(False, False)
    # 仓库没有照片则先录入照片
    files = os.listdir(authByFace.SUCCESS_DIR)
    if len(files) < 1:
        authByFace.savePicture()
    else:
        # 锁定状态才会走这个认证逻辑
        # 每1分钟运行一次认证
        while True:
            time.sleep(10)
            try:
                isSuccess = authByFace.isAuthSuccess()
                if authByFace.clocked and isSuccess:
                    # 认证通过则解开锁屏
                    print("认证通过")
                    # 输入锁屏密码
                    pyautogui.typewrite("1")
                    pyautogui.press("enter")
                    pyautogui.press("Esc")
                    authByFace.clocked = False
                elif not isSuccess:
                    # 如果认证不通过, 调用系统快捷键, 锁定屏幕
                    pyautogui.hotkey('win', 'c')
                    pyautogui.press(['l'], interval=0.1)
                    # 对象设置为锁定状态
                    authByFace.clocked = True
            except Exception as exc:
                print(type(exc))
                if not authByFace.clocked:
                    pyautogui.hotkey('win', 'c')
                    pyautogui.press(['l'], interval=0.1)
                    # 对象设置为锁定状态
                    authByFace.clocked = True
开启启动
方式1 systemd (未通过)
经过测试,
无法将该程序放入到systemd单元,跟cv2等包有关系,引入就启动失败
方式2
直接加入到i3wm的开机启动即可,加载该文件时图形界面已经加载,正合适
exec --no-startup-id /usr/bin/python ~/workspace/python/demo/AuthByFace.py > /tmp/authByFace.log 2>&1
参考
https://www.cnblogs.com/sclu/p/12626553.html
问题列表
解决python安装opencv速度慢
使用清华镜像(速度快)
pip install --user -i https://pypi.tuna.tsinghua.edu.cn/simple
opencv-python
linux实现人脸识别锁定解锁的更多相关文章
- 【Linux】人脸识别的封装
		
写了一个linux下的Face Recognition的封装,当作是练习.语言: C++的封装,结合opencv,使用方便.下载源码:https://github.com/zacario-li/Fac ...
 - 虹软人脸识别——官方 Qt Demo 移植到 Linux
		
一.前言 最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK.之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果.打开 Li ...
 - Python人脸识别最佳教材典范,40行代码搭建人脸识别系统!
		
Face Id是一款高端的人脸解锁软件,官方称:"在一百万张脸中识别出你的脸."百度.谷歌.腾讯等各大企业都花费数亿来鞭策人工智能的崛起,而实际的人脸识别技术是否有那么神奇? 绿帽 ...
 - C#_Demo_摄像头实时_4线程人脸识别注册开发全过程
		
v效率有点低,大家看看哪里开可以节省时间?源代码:https://github.com/catzhou2002/ArcFaceDemo说实话,为了提高识别效率,我也是竭尽所能,干了不少自认为的优化,如 ...
 - 指纹识别人脸识别 iOS
		
//1.判断iOS8及以后的版本 if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){ //从iPhone5S开始,出现指 ...
 - 介绍n款计算机视觉库/人脸识别开源库/软件
		
计算机视觉库 OpenCV OpenCV是Intel®开源计算机视觉库.它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV 拥有包括 300 多个 ...
 - paper 97:异质人脸识别进展的资讯
		
高新波教授团队异质人脸图像识别研究取得新突破,有望大大降低刑侦过程人力耗费并提高办案效率 近日,西安电子科技大学高新波教授带领的研究团队,在异质人脸图像识别研究领域取得重要进展,其对香 ...
 - atitit.人脸识别的应用场景and使用最佳实践 java .net php
		
atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...
 - 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】
		
文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...
 - openFace  人脸识别框架测试
		
openface 人脸识别框架 但个人感觉精度还是很一般 openface的githup文档地址:http://cmusatyalab.github.io/openface/ openface的安 ...
 
随机推荐
- Visual Studio 存在版本之间冲突
			
1 . 检查项目中有没有重复引用的包,如果有的话卸掉一个. 2.. 检查项目中引用的包是否自带所重复的包,这样会导致项目之间引发包冲突. 举个例子: 我的项目里ICSharpCode.SharpZip ...
 - JBOSS漏洞复现
			
Jboss漏洞复现 统一靶场:/vulhub/jboss JMX Console 未授权访问漏洞 # 介绍 JBoss的webUI界面 http://ip:port/jmx-console未授权访问( ...
 - 使用 ibatis 处理复杂对象数据关系的实例
			
如何使用 ibatis 处理复杂对象数据关系 iBatis 是一个开源的对象关系映射程序,其工作是将对象映射到 SQL 语句.和其它 O/R Mapping 框架不同,iBatis 开发者需要自己编写 ...
 - 13TB的StarRocks大数据库迁移过程
			
公司有一套StarRocks的大数据库在大股东的腾讯云环境中,通过腾讯云的对等连接打通,通过dolphinscheduler调度datax离线抽取数据和SQL计算汇总,还有在大股东的特有的Flink集 ...
 - Element-ui 表单嵌套验证
			
1.当表单的字段值是数组或者对象时的rules配置 对象:直接用obj.xx配置rules和prop 数组:用list.index.xx配置rules和prop <el-form :model= ...
 - SaaS架构中多租户的概念
			
SaaS架构中多租户的概念 租户可以理解为部署在云端的客户,通常出现在2B的企业中,比如现在学校的一卡通管理,通常是一个公司来做的,学校本地不需要做任何部署,而这个公司又是服务了很多个学校,那么学校对 ...
 - .NET周刊【12月第2期 2024-12-08】
			
国内文章 终于解决了.net在线客服系统总是被360误报的问题(对软件进行数字签名) https://www.cnblogs.com/sheng_chao/p/18581139 升讯威在线客服与营销系 ...
 - Flutter WebView报错ERR_NAME_NOT_RESOLVED
			
WebView报错ERR_NAME_NOT_RESOLVED 用的webview_flutter插件,开始都用的好好的,后面突然报错ERR_NAME_NOT_RESOLVED,上网逛了一圈说如果要用h ...
 - 中电金信:产教联合共育人才 AFAC2024金融智能创新大赛启动
			
当前,人工智能技术正在蓬勃发展,引领着各行各业迈向智能化的新纪元,特别是在金融科技领域,伴随人工智能技术的不断迭代与突破,金融服务的边界也在不断拓展,传统的金融业态正经历着深刻的变革与重塑. 与此同时 ...
 - 部署docker-registry +ui , 使用ansible部署docker实例
			
#部署docker-registry +ui , 使用ansible部署docker实例 docker registry 配置域名证书, 用户密码认证, 轻量UI shell部署docker-regi ...