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的安 ...
随机推荐
- NZOJ 模拟赛3
T1 地理geo 奶牛们刚学习完地理课,知道地球是个球.他们非常震惊,满脑子都是球形. 他们试图把地球表面看成一个NxN (1 <= N <= 100)的方格,但是顶端连接着底部.左边连接 ...
- JVM 核心技术
1.Java代码编译和执行的整个过程: 2. JVM内存管理及垃圾回收机制: 先看图, 二.Java代码编译和执行的整个过程 Java代码编译是由Java源码编译器来完成,流程图如下所示: Java ...
- 基于 .NET 的开源工作流引擎框架
前言 工作流管理成为了提高应用灵活性和可维护性的重要手段.Elsa 作为一款针对 .NET 平台的强大工作流库,为开发者提供了在各种 .NET 应用中轻松集成和执行复杂工作流的能力. 本文将详细介绍 ...
- 2019GPLT
2019GPLT 7-2 6翻了 从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9:但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27.其他内容 ...
- manim边做边学--文字的创建与销毁
本篇开始介绍Manim中的动画模块,动画模块是整个框架的核心魅力所在. Manim不仅提供了可以直接实现各种各样动画效果的对象, 还提供了设置动画的时长.延迟时间以及运动速率等参数,可以据此发挥自己的 ...
- 一款渗透测试信息收集集成工具--mitan密探
本工具仅供安全测试人员运用于授权测试, 禁止用于未授权测试, 违者责任自负.作者及本公众号相关负责人不对您使用该工具所产生的任何后果负任何法律责任,在扫描模块使用多线程,在测试过程中根据目标的实际情况 ...
- SQLServer创建用户后无法登录,报错18456的解决方式
原因:SQLServer没有设置为混合模式. 解决方法: 服务器本地通过Windows验证,打开SQLServer 右键服务器,选择安全性,选择为混合验证模式,然后重启SQLServer服务即可.
- IOS获取蓝牙状态
IOS获取蓝牙状态 监听蓝牙状态 在Link Binaries With Libraries中添加CoreBluetooto.framework 创建CBCentralManager对象 为了避免每次 ...
- 5.mysql中的触发器
创建存储过程和函数 触发器 ● create trigger语句用来创建一个触发器,触发器的作用是当表上有对应SQL语句发生时,则触发执行 ● 触发器创建时需要指定对应的表名tbl_name crea ...
- 在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly
在 ASP.NET Core 2.1 之后与 HttpClient 工厂一起使用 Polly 在 ASP.NET Core 2.1 中提供的 HttpClient factory 提供了一种预配置 H ...