• 3
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【 2025 DigiKey 杯】基于眼睛眯眼程度的实时视频焦点控制系统

引言

         作为一名近视患者,我经常需要通过眯眼来获得更清晰的视觉体验。这种"眯眼对焦"的现象启发了我,能否通过技术手段模拟这一过程,让眯眼成为一个自然的交互方式?与此同时,随着计算机视觉技术的发展,实时人脸检测和眼部关键点识别已经变得非常成熟,为这个想法提供了技术基础。

         本项目实现了一个基于眼睛眯眼程度的实时视频焦点控制系统。系统通过摄像头实时检测用户的眼睛睁开程度(通过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. 跨平台支持

移植到移动设备和嵌入式平台。

总结

本项目成功实现了一个基于眼睛眯眼程度的实时视频焦点控制系统。通过结合计算机视觉技术和图像处理技术,系统能够实时检测用户的眼部状态,并根据眯眼程度动态调整视频清晰度。这个系统不仅技术实现简洁高效,而且具有实际的应用价值和教育意义。

项目的核心价值在于:

技术创新:将生理动作转化为交互方式

教育意义:直观展示近视对视觉的影响

实用价值:为非接触式交互提供新思路

开源共享:完整代码开源,促进技术交流

随着计算机视觉技术的不断发展,基于生理信号的交互方式将变得越来越普遍。本项目为这一方向提供了一个简单而有效的范例,展示了技术如何与人体自然行为相结合,创造出新颖而实用的应用。

演示视频附上:(因为本人不想露脸,所以使用两张图片分别表示眯眼和睁开眼)

全部回复(3)
正序查看
倒序查看
张洪瑜
LV.1
2
03-17 13:16

[2025 DigKey杯】该项目展示了较高的技术专业性,涉及到计算机视觉、实时人脸检测、眼部关键点识别、以及基于这些技术的视频焦点控制系统开发。使用了如OpenCV、MediaPipe和NumPy等专业的库和框架,并详细描述了Eye Aspect Ratio (EAR)的计算方法、焦点响应曲线的实现,以及实时模糊处理等关键技术。这些内容体现了作者在计算机视觉和图像处理领域的深入理解和实践能力。内容具有很强的实用性,项目实现了一个基于眼睛眯眼程度的实时视频焦点控制系统,这对于视力训练、交互式演示、游戏控制以及辅助技术等领域都有潜在的应用价值。特别是对于近视患者,这种系统可以作为一种新颖的交互方式,帮助他们更好地理解和控制自己的眼部肌肉。此外,系统还提供了可定制阈值、开源代码等特性,进一步增强了其实用性和可扩展性。

0
回复
fzwwj95
LV.7
3
03-24 17:24

【DigiKey杯点评】这个创意很巧,把近视人群的真实视觉习惯转成了自然交互方式,不是为了 AI 而 AI。基于 EAR 做实时模糊与清晰度调节,既有计算机视觉基础,也有很强的展示效果,是个很有想法的作品。

0
回复
only one
LV.8
4
03-26 23:54

 本项目实现了一个基于眼睛眯眼程度的实时视频焦点控制系统。系统通过摄像头实时检测用户的眼睛睁开程度(通过Eye Aspect Ratio, EAR计算),根据眯眼的程度动态调整视频的清晰度:睁大眼时视频模糊(模拟近视状态),眯眼时视频变清晰(模拟对焦过程,这个算法简单吗

0
回复