【OpenCV人脸检测】写了个智能锁屏小工具!人离开电脑自动锁屏

文章目录

  • 1. 写在前面
  • 2. 设计思路
  • 3. 人脸检测
  • 4. 程序实现

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  在职场中,我们经常会遇到这样的情况:由于各种原因离开电脑时忘记了锁屏!这时你可能正在浏览一些私密的内容,或者在打开聊天软件与亲朋好友交流。在公司这种人来人往的环境中,甚至可能有人在你的工位周围活动。如何防止他人无意中看到你的隐私对于我们程序员来说就变得很简单了

这不仅仅是关于信息安全的问题,更是关于保护个人隐私的重要一环

2. 设计思路

  为了解决这个问题,我们将实现一个小工具,通过调用摄像头不定时抓拍图片,再借助OpenCV做人脸识别检测,我们能够实时监测电脑前是否有人。检测到无人在电脑屏幕前则触发自动锁屏操作。而当有人回来入座时,系统又将自动检测并唤醒屏幕

当然,这个地方有更多的细节可以在后续功能中进行优化与升级,例如,我们可以添加人脸识别库,进行人脸特征提取与对比,提高识别精度!根据个人需求训练人脸模型,采集一些自己的图像来进行训练。最后在唤醒之前对人脸进行对比,是本人则唤醒,不是的话也可以抓拍一张…

另外也可以对用户在设备上的活动进行监测,如键盘的输入、鼠标的移动,以此来判断用户是否离开

在开始之前我们需要安装如下模块:

pip3 install opencv-python

OpenCV是迄今为止解决基于计算机视觉问题最流行的开源库之一,其下载量已超过1800万次,活跃的用户社区拥有47000名成员。OpenCV具备2500种优化算法,涵盖了一整套经典和最先进的计算机视觉以及机器学习算法,使其成为机器学习领域中最为重要的库之一

3. 人脸检测

人脸检测的一般步骤如下:为了实现精准的人脸检测,首先需构建人脸模型,获取可靠的人脸分类器。通常我们会使用网上公开的扩展包或已训练好的分类器。为此,将haarcascades与lbpcascades中相关的XML文件下载至本地,以备后续调用,为人脸检测提供必要的支持

下面我们做一个示例,使用Python+OpenCV实现单人脸检测,代码如下:

import cv2
import os

def face_detection(image):
    # 创建一个级联分类器,加载Haar特征的.xml分类器文件
    face_cascade_path = os.path.join(cv2.data.haarcascades, 'haarcascade_frontalface_default.xml')
    
    if not os.path.isfile(face_cascade_path):
        print("Error: Haarcascade file not found.")
        return

    face_detector = cv2.CascadeClassifier(face_cascade_path)

    # 多个尺度空间进行人脸检测,返回检测到的人脸区域坐标信息
    faces = face_detector.detectMultiScale(image=image, scaleFactor=1.1, minNeighbors=5)
    print('检测到的人脸信息如下:\n', faces)

    for x, y, w, h in faces:
        # 在原图像上绘制矩形标识
        cv2.rectangle(img=image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)

    cv2.imshow('result', image)

# 读取图像
src_path = os.path.join('Desktop', 'kunkun.png')
src = cv2.imread(src_path)

if src is None:
    print(f"Error: Could not read image from {src_path}")
else:
    cv2.imshow('input image', src)
    face_detection(src)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4. 程序实现

首先,我们需要初始化摄像头并检测判断摄像头是否打开:

cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Error: Could not open camera.")
    exit()

接下来,为了进行人脸检测,我们需要载入OpenCV的人脸检测模型:

face_cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
if not os.path.isfile(face_cascade_path):
    print("Error: Haarcascade file not found.")
    exit()

face_cascade = cv2.CascadeClassifier(face_cascade_path)
if face_cascade.empty():
    print("Error: Could not load haarcascade.")
    exit()

为了方便,我们创建了一个函数来检测人脸:

def detect_faces(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)
    return faces

接着,我们需要根据不同系统执行不同命令,实现锁屏和唤醒屏幕的操作:

# 执行锁屏命令
def lock_screen(os_type):
    if os_type == 'windows':
        os.system('rundll32.exe user32.dll, LockWorkStation')
    elif os_type == 'mac':
        subprocess.run(['pmset', 'displaysleepnow'])

# 执行唤醒屏幕命令
def wake_screen():
    subprocess.run(['caffeinate', '-u', '-t', '1'])

最后,我们将以上所有的组件整合到一起,形成一个完整的程序,如下所示:

import cv2
import time
import os
import platform
import subprocess

# 常量定义
NO_PERSON_THRESHOLD = 3
SAVE_IMAGE_DELAY = 5
IMG_NAME = "face_photo.jpg"

# 检测操作系统
def detect_os():
    os_name = platform.system()
    if os_name == 'Windows':
        return 'windows'
    elif os_name == 'Darwin':
        return 'mac'
    else:
        return 'other'

# 执行锁屏命令
def lock_screen(os_type):
    if os_type == 'windows':
        os.system('rundll32.exe user32.dll, LockWorkStation')
    elif os_type == 'mac':
        subprocess.run(['pmset', 'displaysleepnow'])

# 执行唤醒屏幕命令
def wake_screen():
    subprocess.run(['caffeinate', '-u', '-t', '1'])

# 初始化摄像头
cap = cv2.VideoCapture(0)

# 载入OpenCV的人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 无人状态计时器
no_person_timer = 0
# 是否保存图像的标志
save_image = False

# 检测操作系统类型
os_type = detect_os()

while True:
    ret, frame = cap.read()

    if not ret:
        break

    # 转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.1, 4)

    if len(faces) == 0:
        no_person_timer += 1
        if no_person_timer > NO_PERSON_THRESHOLD:
            lock_screen(os_type)
    else:
        no_person_timer = 0
        # 当检测到人脸时唤醒屏幕
        wake_screen()

        # 检测到人脸时保存当前帧
        if not save_image:
            cv2.imwrite(IMG_NAME, frame)
            print(f"Saved image: {IMG_NAME}")
            save_image = True

            # 延迟一定时间再继续保存,避免频繁保存
            cv2.waitKey(SAVE_IMAGE_DELAY * 1000)

    # 检测键盘输入,以退出程序
    key = cv2.waitKey(1) & 0xFF
    if key == 27:  # ESC键
        break

cap.release()
cv2.destroyAllWindows()

通过这个小工具,我们不仅可以提高电脑的安全性,还能够保护个人隐私,使我们的工作环境更加舒适。当然,用户可以根据个人需求对该工具进行进一步定制,使其更符合个性化的使用体验。在实际使用中,我们可以根据自己的需求进行调整和改进,以满足不同场景下的锁屏需求

赶紧试一试吧~~

好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/369958.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

React Hooks 学习笔记

1.useState() 实现对页面数据的存储,当数据改变时候,自动触发render函数 2.useRef 用来解决两个问题: 1).是获取DOM元素或子组件的实例对象 2).存储渲染周期之间共享的数据 3.useEffect 4.useLayoutEffect 5…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数(主函数)test.cpp 测试结果 参考、格式 数据结构课本2.3节(严蔚敏版&a…

【PLC一体机】PLC一体机中如何实现触摸屏和PC电脑的通讯

博主今天准备把之前买的PLC一体机拿出来玩一下,翻看以前的博文,发现没有记录分享PLC一体机中如何实现触摸屏程序下载的内容。 如之前博文介绍的那样,PLC一体机由PLC和触摸屏两部分集成的设备,因此设备内部已经做好了PLC和触摸屏之…

树莓派5一键安装C++版本OpenCV

安装环境 本人当前的安装环境: 树莓派5Raspberry Pi os (64-bit) Debian12 Bookworm 镜像下载地址 我这里是将镜像安装好后直接安装opencv,如果不是刚安装好的镜像需要注意是否有openCV的python之类的安装过,不然可能出现编译错误 一、扩展内…

HubSpot营销自动化如何优化营销流程?

HubSpot营销自动化在优化营销流程、减少手动工作以及提高效率方面发挥着关键作用。以下是一些具体的方法和策略: 1. 自动化电子邮件营销: 利用HubSpot的电子邮件自动化功能,设置触发条件,使邮件发送根据用户行为或阶段自动进行。…

Java 数据结构 二叉树(一)二叉查询树

目录 树的种类 二叉树 二叉查找树 满二叉树 ​编辑 完全二叉树 二叉树的数据存储 链式存储 数组存储 寻址方式: 二叉树的遍历(了解即可) ​编辑 二叉查询树缺点 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满…

Web项目利用OSS进行图像存储服务

一、OSS介绍 在Web项目中,一些常见的功能,比如展示图片,修改头像等,都需要进行图片的上传操作,但是如果是存储在Web服务器中,在读取图片的时候会占用比较多的资源,影响服务器的性能。 常…

EasyCVR智能视频监控平台云台降低延迟小tips

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

零基础爬什么值得买的榜单——爬虫练习题目一(答三)

一步一步似爪牙,先给爷爬一个! 引言分析数据上一节代码运行 工具:JSON 在线解析使用实操 获取其中一个数据添加代码知识点 结尾 引言 我也太能拖了 这个假期前确实有点懒惰 加上这个周末连班 不能去打篮球 腿没有得到充分的运动 像是千万只蚂蚁在爬一样…

AI Infra论文阅读之将流水线并行气泡几乎降到零(附基于Meagtron-LM的ZB-H1开源代码实现解读)

0x0. 前言 这篇论文对应的链接为:https://openreview.net/pdf?idtuzTN0eIO5 ,最近被ICLR 2024接收,但不少AI Infra的同行已经发现了这个工作的价值,并且已经开源在 https://github.com/sail-sg/zero-bubble-pipeline-parallelis…

编写程序实现二叉树的创建,三种遍历自己销毁

#include <myhead.h>// 定义二叉树节点结构体 struct tree {char value; //二叉树的值struct tree* left; //左子树struct tree* right; //右子树 };// 创建节点 struct tree* create_node(int value) {//申请空间struct tree* new (struct tree*)malloc(sizeof(st…

[Python] opencv - 什么是直方图?如何绘制图像的直方图?

什么是直方图&#xff1f; 直方图是一种统计图&#xff0c;用于展示数据的分布情况。它将数据按照一定的区间或者组进行划分&#xff0c;然后计算在每个区间或组内的数据频数或频率&#xff08;即数据出现的次数或占比&#xff09;&#xff0c;然后用矩形或者柱形图的形式将这…

学成在线:媒体资源管理系统(MAM)

媒体资源管理系统(MAM) 媒体资源管理系统(Media Asset Management)是建立在多媒体、网络、数据库和数字存储等先进技术基础上的一个对各种媒体及内容进行数字化存储、管理以及应用的总体解决方案,可以满足媒体资源拥有者收集、保存、查找、编辑、发布各种信息的要求,为媒体资源…

Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1

目录 【问题描述】maven环境报错 Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.8.1 【解决办法】 检查maven路径是否一致 路径一致的话&#xff0c;更改配置文件settings.xml的镜像源。 添加代码到 <mirrors> <!-- 阿里镜像 --> &l…

Security ❀ TCP异常报文详解

文章目录 1. TCP Out-Of-Order2. TCP Previous Segment Lost3. TCP Retransmission4. TCP Dup Ack XXX#X5. TCP Windows Update6. TCP Previous segment not captured7. 异常案例分析 TCP协议中seq和ack seq的联系&#xff1a; id4的http请求报文由客户端发向服务器&#xff0…

Transformer实战-系列教程1:Transformer算法解读1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 现在最火的AI内容&#xff0c;chatGPT、视觉大模…

初识webpack(一)概念、入口配置、输出配置、loader等

目录 (一)概念 webpack的依赖图 (二)webpack的基本使用 (三)webpack的配置文件 1.入口(entry)配置 2.输出(output)配置 (三)loader 1.css文件处理 (1)安装css-loader和style-loader (2)在webpack.config.js中配置loader 2.less文件处理 3.postcss的使用 (1)安装…

mysql索引有哪些,如何分类

前言 按数据结构分类可分为&#xff1a;Btree索引、Hash索引、Full-text索引。 按物理存储分类可分为&#xff1a;聚簇索引、二级索引&#xff08;辅助索引&#xff09;。 按字段特性分类可分为&#xff1a;主键索引、普通索引、前缀索引。 按字段个数分类可分为&#xff1…

C++拷贝构造函数、赋值运算符重载

1.拷贝构造函数 拷贝构造函数的写法如图所示 调用方式如下 接下来我来说说它的特征 1.1特征 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造函…

推荐系统(Recommender Systems)

一、问题形式化 在接下来的内容中&#xff0c;我将开始讲解推荐系统的一些理论知识。我们从一个例子开始定义推荐系统&#xff0c;假使我们是一个电影供应商&#xff0c;我们有 5 部电影和 4 个用户&#xff0c;我们要求用户为电影打分 前三部电影是爱情片&#xff0c;后两部是…