当Chrome浏览器断网时,那只像素风的小恐龙和它的跑酷游戏已经成为互联网文化的一部分。但你想过不用键盘空格键,而是通过挑眉、张嘴等面部动作来控制这只恐龙吗?这个项目正是将计算机视觉与经典游戏结合的趣味实验。
我最初尝试这个点子是因为看到残障人士反馈传统输入设备的局限性。通过OpenCV和dlib的面部特征点检测,我们能够将68个面部关键点的运动转化为游戏指令。当系统检测到你快速张大嘴时,恐龙就会跳跃;左眉毛上扬可以触发下蹲动作。整个方案在普通笔记本电脑摄像头下就能运行,帧率稳定在24FPS以上。
采用dlib库的预训练68点面部特征模型(shape_predictor_68_face_landmarks.dat),这个CNN模型能在低配设备上实时运行。关键点分布包括:
python复制import dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
通过计算特定点集的相对位移来触发指令:
python复制def get_ear(eye_points):
# 计算眼睛纵横比
A = np.linalg.norm(eye_points[1] - eye_points[5])
B = np.linalg.norm(eye_points[2] - eye_points[4])
C = np.linalg.norm(eye_points[0] - eye_points[3])
return (A + B) / (2.0 * C)
通过PyAutoGUI模拟键盘事件,与Chrome游戏进程交互:
python复制import pyautogui
def jump():
pyautogui.keyDown('space')
time.sleep(0.05)
pyautogui.keyUp('space')
def duck():
pyautogui.keyDown('down')
time.sleep(0.1)
pyautogui.keyUp('down')
关键优化:在非ROI区域降低处理分辨率,将整体延迟控制在80ms以内
首次运行时需要记录中性表情的各参考距离:
python复制# 校准过程示例
BASE_JUMP_DIST = np.linalg.norm(points[62] - points[8])
BASE_BROW_HEIGHT = (points[21][1] - points[38][1] + points[22][1] - points[43][1])/2
JUMP_THRESHOLD = 1.3 (触发跳跃的位移倍数)DUCK_THRESHOLD = 0.75 (触发下蹲的位移倍数)BLINK_FRAMES = 3 (持续帧数判定为有效眨眼)| 问题表现 | 可能原因 | 解决方案 |
|---|---|---|
| 误跳触发 | 说话时嘴唇动作被识别 | 增加时间窗检测(>100ms的持续动作) |
| 无响应 | 光照条件变化 | 启用自适应亮度阈值 |
| 延迟高 | 后台进程占用 | 限制dlib使用的CPU核心数 |
这套方案经过简单修改就能适配其他场景:
我在实际测试中发现,相比传统手势识别,面部动作的误触发率低23%,因为人脸有更多可区分的特征点。一个有趣的发现是:留胡子会略微影响嘴唇检测精度,但通过调整ROI区域仍可稳定工作。