引言
作为一名近视患者,我经常需要通过眯眼来获得更清晰的视觉体验。这种"眯眼对焦"的现象启发了我,能否通过技术手段模拟这一过程,让眯眼成为一个自然的交互方式?与此同时,随着计算机视觉技术的发展,实时人脸检测和眼部关键点识别已经变得非常成熟,为这个想法提供了技术基础。
本项目实现了一个基于眼睛眯眼程度的实时视频焦点控制系统。系统通过摄像头实时检测用户的眼睛睁开程度(通过Eye Aspect Ratio, EAR计算),根据眯眼的程度动态调整视频的清晰度:睁大眼时视频模糊(模拟近视状态),眯眼时视频变清晰(模拟对焦过程)。整个过程完全实时、无需联网、基于本地计算。
特点
1.实时响应:系统能够实时检测眼部状态并立即调整视频清晰度
2.生理学原理:基于眼睛的实际眯眼动作,符合人体自然行为
3.完全离线:所有计算在本地完成,无需网络连接
4.可定制阈值:可根据不同用户的眼部特征调整响应阈值
5.轻量级实现:基于Python和MediaPipe,代码简洁高效
6.开源代码:完整代码开源,便于学习和改进
硬件环境
1.开发板:树莓派5(4GB RAM)
2.摄像头:普通USB摄像头(支持640x480分辨率)
3.显示器:任意显示器用于显示处理后的视频
4.供电:标准USB供电

硬件连接图使用得捷Scheme- it在线设计工具绘制。
软件环境
操作系统:Raspberry Pi OS
Python版本:3.9
主要库:
1.OpenCV:4.12.0.88
2.MediaPipe:0.10.14
3.NumPy:2.0.2
推理框架:MediaPipe Face Mesh(轻量级面部关键点检测)

系统工作流程:
1.摄像头捕获实时视频帧
2.MediaPipe Face Mesh检测面部并提取眼部关键点
3.计算Eye Aspect Ratio (EAR)值,反映眼睛睁开程度
4.根据EAR值计算焦点水平(0.0-1.0)
5.根据焦点水平应用相应程度的模糊效果
6.显示处理后的视频帧,并提供实时数据可视化
关键技术
Eye Aspect Ratio (EAR)计算
EAR是衡量眼睛睁开程度的关键指标,计算公式如下:
其中p1-p6是眼睛周围的6个关键点位置:
p1, p4:眼睛左右眼角
p2, p6:上眼睑中心点
p3, p5:下眼睑中心点
def calculate_eye_aspect_ratio(self, eye_landmarks):
if len(eye_landmarks) < 6:
return 0.0
p1 = eye_landmarks[0]
p2 = eye_landmarks[1]
p3 = eye_landmarks[2]
p4 = eye_landmarks[3]
p5 = eye_landmarks[4]
p6 = eye_landmarks[5]
A = np.linalg.norm(p2 - p6)
B = np.linalg.norm(p3 - p5)
C = np.linalg.norm(p1 - p4)
if C == 0:
return 0.0
ear = (A + B) / (2.0 * C)
return ear
焦点响应曲线
系统采用简单的线性响应曲线,将EAR值映射到焦点水平:
def calculate_focus(self, ear_value):
# 将EAR值限制在预定义的范围内
clamped_ear = np.clip(ear_value, self.min_ear, self.max_ear)
ear_range = self.max_ear - self.min_ear
if ear_range <= 0:
ear_range = 0.15
# 焦点水平:0.0(完全模糊)到1.0(完全清晰)
focus_level = (self.max_ear - clamped_ear) / ear_range
focus_level = np.clip(focus_level, 0, 1)
# 计算模糊半径
blur_range = self.max_blur_radius - self.min_blur_radius
target_blur_radius = self.max_blur_radius - (focus_level * blur_range)
return focus_level, int(target_blur_radius)
实时模糊处理
根据计算出的模糊半径,对视频帧应用高斯模糊:
def apply_blur(self, frame, blur_radius):
if blur_radius <= 1:
return frame.copy()
# 确保内核大小为奇数
kernel_size = max(1, int(blur_radius * 2 + 1))
if kernel_size % 2 == 0:
kernel_size += 1
# 应用高斯模糊
return cv2.GaussianBlur(frame, (kernel_size, kernel_size), blur_radius)
主要代码结构
系统主循环负责实时处理每一帧:
def main():
# 初始化摄像头
camera_index = 0
cap = cv2.VideoCapture(camera_index)
# 设置摄像头参数
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
# 创建焦点控制器
controller = SimpleEyeSquintController()
print("系统启动:睁眼=模糊,眯眼=清晰")
while True:
# 读取帧
ret, frame = cap.read()
if not ret:
break
# 镜像翻转
frame = cv2.flip(frame, 1)
# 处理帧
processed_frame, focus_info = controller.process_frame(frame)
# 显示处理后的帧
cv2.imshow('Eye Squint Focus Control', processed_frame)
# 处理按键
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('+'):
controller.adjust_max_blur(controller.max_blur_radius + 3)
elif key == ord('-'):
controller.adjust_max_blur(controller.max_blur_radius - 3)
# 释放资源
cap.release()
controller.release()
cv2.destroyAllWindows()
数据平滑处理
为了避免EAR值波动导致的视频闪烁,系统采用滑动平均进行平滑处理:
def __init__(self):
# EAR值平滑
self.EAR_SMOOTHING = 5
self.left_ear_history = deque(maxlen=self.EAR_SMOOTHING)
self.right_ear_history = deque(maxlen=self.EAR_SMOOTHING)
# 模糊半径平滑
self.focus_smoothing = 0.3
self.blur_history = deque(maxlen=3)
参数调优
EAR阈值设置
经过实验,找到适合大多数人的EAR阈值范围:
睁眼状态(模糊):EAR ≈ 0.38
眯眼状态(清晰):EAR ≈ 0.23
响应灵敏度调整
可以通过调整以下参数改变系统响应:
EAR_SMOOTHING:增大使响应更平滑,减小使响应更灵敏
focus_smoothing:控制模糊过渡的平滑程度
max_blur_radius:最大模糊程度,模拟不同的"近视度数"
效果演示
运行效果
系统运行时会在屏幕上显示以下信息:
实时EAR值(眼睛睁开程度)
当前焦点水平(0%-100%)
当前模糊半径
系统状态(BLURRY或CLEAR)
焦点水平进度条


交互体验
正常睁眼:视频呈现模糊状态,模拟近视效果
逐渐眯眼:随着眯眼程度加深,视频逐渐变清晰
完全眯眼:视频达到最清晰状态
再次睁眼:视频逐渐恢复模糊状态
控制功能
q键:退出程序
+键:增加最大模糊程度(模拟更高度数近视)
-键:减小最大模糊程度(模拟更低度数近视)
性能优化
1. 计算效率
MediaPipe Face Mesh在CPU上高效运行
高斯模糊使用OpenCV优化实现
只计算必要的眼部关键点,减少计算量
2. 内存使用
使用deque实现滑动窗口,内存占用恒定
实时处理,不存储历史帧
轻量级UI叠加,不增加显著开销
3. 实时性
在树莓派5上达到15-20 FPS
响应延迟<100ms
应用场景
1. 视力训练
通过眯眼-清晰的反馈循环,帮助用户了解自己的眼部肌肉控制能力。
2. 交互式演示
生动展示近视患者如何通过眯眼改善视力,用于眼科科普教育。
3. 游戏控制
将眯眼作为一种新颖的游戏控制方式,增加游戏的沉浸感。
4. 辅助技术
为有特殊需求的人群提供非接触式交互方式。
改进方向
1. 个性化校准
添加校准功能,自动适应用户的个体差异。
2. 多级近视模拟
提供不同度数的近视模拟,从轻度到重度。
3. 散光模拟
添加方向性模糊,更真实地模拟散光效果。
4. 眼部疲劳检测
长时间眯眼提醒,防止眼部疲劳。
5. 跨平台支持
移植到移动设备和嵌入式平台。
总结
本项目成功实现了一个基于眼睛眯眼程度的实时视频焦点控制系统。通过结合计算机视觉技术和图像处理技术,系统能够实时检测用户的眼部状态,并根据眯眼程度动态调整视频清晰度。这个系统不仅技术实现简洁高效,而且具有实际的应用价值和教育意义。
项目的核心价值在于:
技术创新:将生理动作转化为交互方式
教育意义:直观展示近视对视觉的影响
实用价值:为非接触式交互提供新思路
开源共享:完整代码开源,促进技术交流
随着计算机视觉技术的不断发展,基于生理信号的交互方式将变得越来越普遍。本项目为这一方向提供了一个简单而有效的范例,展示了技术如何与人体自然行为相结合,创造出新颖而实用的应用。
演示视频附上:(因为本人不想露脸,所以使用两张图片分别表示眯眼和睁开眼)
