
以前在家出门的时候,经常走出一段路之后会产生一种错觉:刚刚出来锁门了吗?后来换了智能锁,通过手机APP监控门锁状态,解决了这种担忧。而现在,有时候离开工位的时候,总会有一种忘了锁屏,被人发现我在摸鱼的电脑界面。所以我就突发奇想:我能不能设计一个应用,能够发现是谁偷看了我的屏幕。
PC端人脸检测:

微信查看监控图片:

我想要通过的MacBook摄像头,如果识别到人脸靠近屏幕,就会自动截图保存到本地然后发送给我。所以在整个应用的设计中需要实现以下5个功能:
对于前四个还是挺好实现的,使用OpenCV就可以实现,成熟的人脸检测方案,Haar Cascades 分类器开箱即用,然后使用macOS 原生的摄像头访问框架:AVFoundation就可以实现,然后将识别到的人脸图片保存到本地。但是如何做到即时通知呢?
这要是放在以前确实很复杂,但是如今拥有openclaw的AI时代,显得尤为简单。尤其是支持微信和PC端互联的QClaw,让这个功能的实现看起来更为简单。
QClaw 是腾讯电脑管家基于 OpenClaw 开源生态打造的本地化 AI Agent 助手,无需复杂的配置可以直接一键安装。通过微信发送指令,就能让电脑自动完成报表处理、文件传输、文档编辑等工作。产品内置多款优质国产大模型,拥有丰富技能生态与超强上下文记忆能力。
进入QClaw官网下载相应系统版本的安装包,安装即可使用。

安装成功之后打开 QClaw。

在QClaw的首页,我们通过微信扫码登录即可。

点击左下方登录,用微信扫码登录之后,点击弹出框关联微信,这样手机微信就可以操控电脑上的龙虾了。

扫码关联之后,在微信的客服消息中就可以收到 QClaw客服 的消息。

你可以通过对话的形式给QClaw发送指令:

所以说,我的目标是:通过微信给QClaw发送启动监控程序的指令,并可以将识别到的人脸截图,通过QClaw发送到微信上。 我的思路是基于 Python 开发一个人脸识别的程序,然后开发一个 skills 将人脸识别的能力嵌入到 Qclaw 中,这样就可以通过微信调用。
在有了上面的整体思路之后,如何将图片发送到手机上,这一块还是让我思考了许久。刚开始我想着QClaw是否可以直接将图片发送到我的微信上,但是效果不太理想。后来我发现,QClaw有免费的云端存储。

于是我思路一转,可以直接让QClaw直接将最新的监控照片发送到云端,然后直接将照片链接发送给我。

这里先开发一个人脸识别的程序。在技术选型阶段,我对比了几种方案。其中深度学习模型(MTCNN、RetinaFace)精度高但依赖重;云服务 API(AWS Rekognition、Azure Face)方便但要有网还得花钱。最后选了 OpenCV 自带的 Haar Cascades,通过 pip install opencv-python 安装即可。
核心检测逻辑并不复杂,代码如下:
class FaceDetector:
def __init__(self):
cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
self.face_cascade = cv2.CascadeClassifier(cascade_path)
self.cap = None
def start(self):
self.cap = cv2.VideoCapture(0)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
return self.cap.isOpened()
def detect_faces(self):
ret, frame = self.cap.read()
if not ret:
return [], None
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = self.face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30)
)
return faces, frame这段代码的原理是:把彩色画面转成灰度图,然后用预训练的级联分类器扫描,返回所有人脸的位置和大小。scaleFactor 和 minNeighbors 是两个关键参数,控制检测的灵敏度和误报率,需要针对实际场景微调。
检测到人脸只是第一步,更重要的是判断"靠得有多近"。我用了个取巧的办法:看人脸在画面里占多大面积。这个思路基于简单的几何关系:当人脸离摄像头越近,在成像平面上的投影就越大。通过实测,我总结了几个距离值:
于是设定阈值 15000,超过就触发警报:
def should_alert(self, faces):
if not faces:
return False
max_area = max(w * h for (x, y, w, h) in faces)
return max_area > self.config["min_face_area"]触发警报时,系统会自动保存一张照片。但 raw 图没什么说服力,我加了两个增强:
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cv2.putText(frame, timestamp, (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)这样得到一张具有标注和核时间戳的人脸图片了。
daemon.py:守护进程,解决后台运行和摄像头权限问题
def main():
# 写入 PID 文件,方便外部管理和查重
with open(".face-alert.pid", "w") as f:
f.write(str(os.getpid()))
# 注册信号处理,支持优雅退出
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGINT, signal_handler)
# 初始化(在主线程中,满足 macOS 要求)
skill = FaceAlertSkill()
if not skill.detector.start():
sys.exit(1)
# 监控主循环
skill.is_monitoring = True
while skill.is_monitoring:
faces, frame = skill.detector.detect_faces()
if skill.should_alert(faces) and frame is not None:
skill.trigger_alert(faces, frame)
time.sleep(0.5)然后启动程序,进行人脸识别的测试。

可以对人脸进行实时检测:

然后对识别到的人脸图片保存到 screenshots 目录。
完成核心代码开发之后,就要将这个人脸检测代码封装成skills,这里我走了一个捷径,直接使用codebuddy帮我生成。在skill的生成提示词中,我们要做以下限定:

SKILL.md 文件定义了触发条件和行为逻辑,所以我们让CodeBuddy读取项目,然后在根目录下生成 SKILL.md。

文件内容如下:
name: face-alert
description: "人脸监控警报系统 - 实时检测人脸,自动捕获照片并上传云端,支持启动、停止、状态查询和警报检查。"
version: "1.0.0"
user-invocable: true
# Face Alert Skill
> 实时监控人脸,自动捕获并上传照片
## ⚠️ 注意事项
- **摄像头权限**:首次使用需在 Terminal 授权,后续可直接语音控制
- **图片上传**:检测到人脸后返回本地路径,QClaw 自动上传云端
## 📋 快速使用
### 首次授权
`cd ~/.qclaw/skills/FishGuard && python3 main.py --action start --daemon`
- macOS 弹窗允许 Terminal 访问摄像头
- 启动成功后,后台运行中,后续直接语音控制即可
### 已授权用户
直接对 QClaw 说:
- `"启动人脸监控"` - 启动监控
- `"有没有检测到人脸?"` - 获取最新照片
- `"查看监控状态"` - 查看状态
- `"停止人脸监控"` - 停止监控
## 命令行操作
# 启动监控(后台)
python3 main.py --action start --daemon [--threshold 15000]
# 停止监控
python3 main.py --action stop
# 查看状态
python3 main.py --action status
# 获取最新照片
python3 main.py --action get_latest_photo
- 返回 JSON,QClaw 自动上传云端
## 📂 安装依赖
cd ~/.qclaw/skills/FishGuard
pip3 install -r requirements.txt
## 🎯 触发命令
用户可用以下方式触发技能:
- `/face-alert`
- `"启动人脸监控"` / `"人脸监控"` / `"启动监控"`
- `"停止人脸监控"` / `"查看监控状态"` / `"有没有检测到人脸"`将整个项目(包括代码和SKILL.md)上传到github。

在 QClaw 的设置中,找到技能管理,通过 github导入 的方式写入添加人脸监控这个skill。github地址(https://github.com/guanshilong/FishGuard
)

QClaw会自动拉去github的分支,导入之后再技能管理列表就可以看到 face-alert 这个skill。

这样,我们就可以通过QClaw来调用skill实现监控。
在微信中,找到Qclaw管家,发送启动人脸监控的指令。

QClaw在接收到指令之后,就会调用我们的face alert的skill。

并自动在Terminal中启动进程。

我们进入保存人脸截图的目录,可以看到已经监控到了我的很多人脸图片。

我们给QClaw发送获取监控照片的指令:

QClaw就会根据SKILL.md中指定的目录,获取最新的照片,然后自动上传到QClaw云端文件中,并通过微信返回文件的url。

在微信中,通过点击url,可以直接跳转到QClaw管家小程序中,直接查看照片。

我们可以通过发送关闭人脸监控:

QClaw就会kill掉监控进程。

这样通过QClaw完成了人脸监控程序,从手机微信到电脑的互通闭环。
这个源于日常突发的小创意,终于形成了完整的闭环。在QClaw出现之前,要想实现微信和PC端互通,还是挺困难的。而现在,我可以自己开发代码,然后封装成skill,就能被QClaw完美识别调用。而且还可以通过微信发送指令,解决了交互难题。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。