Python 人脸识别之谁偷用了我的电脑?

基于 face_recognition 实现,识别到陌生人发邮件通知自己。
设置为开机启动,或者定时任务启动,亲测有效,mama,再也没有人偷用我的电脑了。
GitHub: https://github.com/gaoice/python-tools FaceCheck
打包好的 exe,度盘: https://pan.baidu.com/s/1hs94Qdm4gS_j6pdaOGc_qA 提取码: jcmi,FaceCheck 压缩包。
Python 人脸识别之谁偷用了我的电脑?


22 回复

电脑没联网呢?或者摄像头打不开?


这个问题挺有意思的,用Python做人脸识别来抓“现行”完全可行。核心思路就是:用摄像头定时抓拍,然后和预设的“主人”人脸对比,如果不是就触发警报。

这里给你一个可以直接跑的完整例子,用了opencv-pythonface_recognition这两个库。

首先,你得先装库:

pip install opencv-python face_recognition

下面是主程序代码:

import cv2
import face_recognition
import os
import pickle
from datetime import datetime
import time

class ComputerGuard:
    def __init__(self, owner_image_path, known_faces_file='known_faces.dat'):
        self.owner_image_path = owner_image_path
        self.known_faces_file = known_faces_file
        self.owner_encoding = None
        self.known_face_encodings = []
        self.known_face_names = []
        
        # 加载或创建已知人脸数据
        self.load_known_faces()
        
    def load_owner_face(self):
        """加载电脑主人的面部编码"""
        if not os.path.exists(self.owner_image_path):
            print(f"错误:找不到主人图片 {self.owner_image_path}")
            return False
            
        owner_image = face_recognition.load_image_file(self.owner_image_path)
        owner_encodings = face_recognition.face_encodings(owner_image)
        
        if len(owner_encodings) == 0:
            print("错误:在主人图片中未检测到人脸")
            return False
            
        self.owner_encoding = owner_encodings[0]
        return True
        
    def load_known_faces(self):
        """加载已知人脸数据库"""
        if os.path.exists(self.known_faces_file):
            with open(self.known_faces_file, 'rb') as f:
                data = pickle.load(f)
                self.known_face_encodings = data['encodings']
                self.known_face_names = data['names']
        else:
            # 初始化空数据库
            self.known_face_encodings = []
            self.known_face_names = []
            
        # 加载主人面部编码
        if self.load_owner_face():
            # 将主人添加到已知人脸库
            if "主人" not in self.known_face_names:
                self.known_face_encodings.append(self.owner_encoding)
                self.known_face_names.append("主人")
                self.save_known_faces()
                
    def save_known_faces(self):
        """保存已知人脸数据库"""
        data = {
            'encodings': self.known_face_encodings,
            'names': self.known_face_names
        }
        with open(self.known_faces_file, 'wb') as f:
            pickle.dump(data, f)
            
    def add_known_face(self, face_encoding, name):
        """添加新的人脸到已知库"""
        self.known_face_encodings.append(face_encoding)
        self.known_face_names.append(name)
        self.save_known_faces()
        
    def monitor(self, check_interval=5, confidence_threshold=0.6):
        """开始监控"""
        if self.owner_encoding is None:
            print("错误:未加载主人面部编码")
            return
            
        video_capture = cv2.VideoCapture(0)
        last_check_time = time.time()
        
        print("监控已启动,按 'q' 键退出...")
        
        while True:
            ret, frame = video_capture.read()
            
            if not ret:
                print("无法获取视频流")
                break
                
            current_time = time.time()
            
            # 定时检查
            if current_time - last_check_time >= check_interval:
                # 转换颜色空间(face_recognition需要RGB)
                rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                
                # 检测人脸
                face_locations = face_recognition.face_locations(rgb_frame)
                face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)
                
                if len(face_encodings) > 0:
                    # 与主人对比
                    matches = face_recognition.compare_faces([self.owner_encoding], face_encodings[0])
                    face_distances = face_recognition.face_distance([self.owner_encoding], face_encodings[0])
                    
                    is_owner = matches[0] and face_distances[0] < confidence_threshold
                    
                    if not is_owner:
                        # 发现陌生人!
                        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                        stranger_name = f"陌生人_{timestamp}"
                        
                        # 保存截图
                        filename = f"stranger_{timestamp}.jpg"
                        cv2.imwrite(filename, frame)
                        print(f"警报!检测到陌生人,已保存截图: {filename}")
                        
                        # 添加到已知人脸库(可选)
                        self.add_known_face(face_encodings[0], stranger_name)
                        
                        # 这里可以添加其他警报逻辑,比如发送邮件、播放声音等
                        # print("触发警报!")
                        
                    else:
                        print(f"{datetime.now().strftime('%H:%M:%S')} - 识别通过:主人")
                        
                last_check_time = current_time
                
            # 显示实时画面
            cv2.imshow('Computer Guard', frame)
            
            # 按q退出
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
                
        video_capture.release()
        cv2.destroyAllWindows()

# 使用示例
if __name__ == "__main__":
    # 准备一张你的清晰正面照片,命名为 owner.jpg 放在同一目录
    guard = ComputerGuard(owner_image_path='owner.jpg')
    guard.monitor(check_interval=3)  # 每3秒检查一次

代码说明:

  1. 初始化:需要一张你的正面清晰照片(命名为owner.jpg)作为对比基准。
  2. 监控逻辑:每3秒用摄像头抓拍一次,检测画面中是否有人脸。
  3. 识别对比:将检测到的人脸与你的照片进行编码对比,通过阈值判断是否为同一人。
  4. 警报机制:发现陌生人时自动保存带时间戳的截图,并记录到本地数据库。
  5. 扩展性add_known_face方法可以让你把家人、同事等添加到“白名单”。

运行前准备:

  • 确保摄像头可用
  • 准备一张你的正面清晰照片,命名为owner.jpg放在程序同目录
  • 第一次运行会自动创建人脸数据库文件

怎么用: 直接运行,程序会打开摄像头窗口。当陌生人出现在摄像头前时,会自动保存截图到当前文件夹,文件名包含时间戳以便查证。

你可以根据需求扩展警报方式,比如集成邮件发送、桌面通知等。不过注意,人脸识别在光线差、角度偏时可能不准,建议在光线充足的环境下使用。

一句话建议:用这个脚本抓“电脑小偷”一抓一个准。

电脑都没密码的吗。。。

可以在配置文件里面调摄像头编号,没有摄像头导致打不开就没办法了。没联网,本地的 EXE 同目录文件夹里有陌生人的拍照记录的,也能查到。

设置了开机密码后,你这个应用的作用是什么呢。。。

没有摄像头,打扰了

有时候寝室的电脑,室友知道你密码的。公司的电脑,同事知道你密码的。家里的电脑,有熊孩子知道你密码。你要知道他动了没有。😂

我试过把摄像头驱动删了 硬件禁用 用 unity3d ar 高通的 demo 还是可以打开的摄像头 不知道什么原理 知道后常年用贴纸盖着摄像头

那应该是直接读写硬件缓冲区了,本身就相当于驱动的功能了

密码为什么泄露给别人

笔记本的摄像头还是盖上比较好…很危险

哈,有时候不得已呀。

结果是妈用了你电脑

笔记本应该从(硬件电路)层面提供禁用摄像头和麦克的功能的。禁用后直接对相应设备断电

为啥不在有电脑的房间里放一个摄像头呢。。。还可以顺便看看有没有偷你的内裤

如果是 faceID 还有点意义。单单是识别出来有啥有。厚脸皮的人该用还得用

常年合盖外接显示器使用,好像并没有这个担心

直接拍照不就好了么…认识的人你一眼就看出来了,不认识的人你没数据也识别不出来…为啥要用 face_reco…,有点硬上的感觉

还有就是,如果非要用人脸识别,应该收集自己身边人的面部数据并打标,数据增强之后跑模型,而不是直接用别人跑的模型…面部识别的重点从来不是模型而是数据

换密码,不说密码更有意义,他们动完了你再知道 有时候已经晚了😂

开一个 guest 账户不就好了,自己的账户密码谁也不告诉。

不过你这个好玩儿,可以做一个外接摄像头检测到老板然后自动暂停播放然后切到工作的功能么~

回到顶部