0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发一个完整的眼动追踪应用-Python版

云深之无迹 来源:云深之无迹 2023-04-13 11:10 次阅读

目前有几个方案,在下面:

1.电极式眼动追踪:这种技术通过在眼球周围放置电极来测量眼睛的运动。它可以提供非常高的准确性和分辨率,但需要接触眼球,因此不太适合长时间使用或需要无接触测量的应用场景。2.红外线眼动追踪:这种技术使用红外线摄像机来观察眼睛的位置和运动。由于它不需要接触眼球,因此非常适合长时间使用和需要无接触测量的应用场景。它的准确性和分辨率通常比电极式眼动追踪低。3.磁共振眼动追踪:这种技术使用磁共振成像来测量眼球的位置和运动。它可以提供非常高的空间分辨率,但时间分辨率较低,因此不太适合研究快速眼动的过程。4.可穿戴式眼动追踪:这种技术使用小型传感器或摄像头,可以放置在眼镜或头盔上,可以随身携带,适用于移动应用场景。但是由于可穿戴设备的尺寸和重量限制,其准确性和分辨率通常较低。5.视网膜追踪:这种技术利用视网膜图像来跟踪眼球的位置和运动。它可以提供非常高的准确性和分辨率,但只能在特定的实验条件下使用,例如黑暗环境下观察单一的点光源。

以我目前念的这个书,我还是用视觉方案来实现:

1.特征提取:选择适当的特征来描述眼睛的形状、颜色、纹理等信息例如,可以使用Haar级联检测器来提取眼睛的轮廓特征,或者使用颜色分布模型来提取眼球的颜色特征。这步主要是传统的2.目标检测:使用机器学习计算机视觉技术来检测眼睛的位置和方向。因为直接目标检测是识别不准的,现实太复杂了。可以使用级联分类器或支持向量机(SVM)来识别眼睛的位置和方向,或者使用卷积神经网络(CNN)来分类眼动类型。3.跟踪和估计:根据检测结果,使用跟踪和估计算法来跟踪眼睛的位置和运动轨迹。在捕捉的基础上开始进行跟踪,持续的来捕获。使用卡尔曼滤波器或粒子滤波器来估计眼睛的位置和速度,或者使用光流算法来估计眼球的运动轨迹。4.数据分析:根据眼动追踪的结果,进行数据分析和可视化。可以计算注视点的位置、持续时间和注视次数等统计信息,或者使用热力图和轨迹图来可视化眼动数据。这个也是这次要写的一个点。

我们在这里主要是直接给出ROI的区域减少算力。

57fa0ad6-d963-11ed-bfe3-dac502259ad0.png

在预处理步骤中,使用了高斯平滑和边缘检测来增强图像特征

5815e620-d963-11ed-bfe3-dac502259ad0.png

在特征提取步骤中,使用了霍夫圆变换来检测圆形区域

5821ba5e-d963-11ed-bfe3-dac502259ad0.png

参数

584318d4-d963-11ed-bfe3-dac502259ad0.png

在目标检测步骤中,找到最大的圆形区域作为眼球,并在图像中标记出来

太简单了家人们!

但是这个程序太简单了,就是一个找特征啥的,有点傻。这次换个库:

Dlib是一个C++编写的机器学习库,提供了用于人脸检测、关键点检测、姿态估计等任务的算法,其中也包括用于眼动追踪的算法。Dlib同样也提供了Python接口,可以在Python中使用Dlib的算法实现眼动追踪。

dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到128维空间向量再度量它们的欧氏距离(Euclidean distance)是否足够小来判定是否为同一个人。我不要人我就要眼睛。

5855b656-d963-11ed-bfe3-dac502259ad0.png

上次觉得CMake碍眼,卸载了

586910fc-d963-11ed-bfe3-dac502259ad0.png

稍等不知道多久,反正我吃了个橘子

 python.exe -m pip install --upgrade pip
更新一下

58719736-d963-11ed-bfe3-dac502259ad0.png

安装成功了

5887ecc0-d963-11ed-bfe3-dac502259ad0.png

58a59874-d963-11ed-bfe3-dac502259ad0.png

这个就是里面的dat文件,68个关键点

先找脸,再找眼,合理!

58b572c6-d963-11ed-bfe3-dac502259ad0.png

简单的转下颜色,然后直接找

dlib 库提供了两个用于人脸检测的功能。

第一个是HOG+线性SVM人脸检测器,另一个是深度学习MMOD CNN人脸检测器。

反正就是找一下面部的区域:

58c32cae-d963-11ed-bfe3-dac502259ad0.png

这些代码是再找眼部的位置

58d4989a-d963-11ed-bfe3-dac502259ad0.png

在范围之内就可以了

58e37a68-d963-11ed-bfe3-dac502259ad0.png

有极值坐标嘎嘎算

58fe6cc4-d963-11ed-bfe3-dac502259ad0.png

接着进一步给出瞳孔的坐标

2.0~8.0mm之间瞳孔大小是指虹膜中央的一圆孔的直径,受光线、年龄、人种、屈光状态、目标远近和情绪等因素影响,正常范围在2.0~8.0mm之间。瞳孔在强光下缩小,在黑暗下扩大,这是人体的正常生理反应。瞳孔大小不一致或对光反应异常可能是脑部或眼部疾病的征兆。

5912ca3e-d963-11ed-bfe3-dac502259ad0.png

我考你,你遇到这种情况怎么写?

5942df4e-d963-11ed-bfe3-dac502259ad0.png

先给外圈的大圆套上

595fa69c-d963-11ed-bfe3-dac502259ad0.png

再处理瞳孔

多数情况下,我们是要实时的检测的:

59788bb2-d963-11ed-bfe3-dac502259ad0.png

来一段从摄像头捕获的代码

5996a886-d963-11ed-bfe3-dac502259ad0.png

祖传代码不能丢

更实用性的是两个摄像头来捕捉眼动:

59a52aa0-d963-11ed-bfe3-dac502259ad0.png

这个写的比较呆逼,不过我在后面会有进行封装

现在是弹出两个框来输出图像,赶紧不好看捏!我们来让他并排排列!

使用OpenCV中的cv2.hconcat()函数将两个视频帧水平合并在一起,并使用cv2.imshow()函数将合并后的视频帧显示出来。

59c91866-d963-11ed-bfe3-dac502259ad0.png

就很简单,其实这里就变成一个合并横向排列的视频组,但是在处理流程上面有问题,应该先单一处理,最后合并结果。

59de788c-d963-11ed-bfe3-dac502259ad0.png

封装好啦!(有点傻逼哦~)

59fe641c-d963-11ed-bfe3-dac502259ad0.png

继续封装,注意视频流

工程问题的话,上面的代码还是太慢了,让我来加一点多线程的魔法!

设计两个线程分别处理左右眼视频帧的读取和合并:

5a102648-d963-11ed-bfe3-dac502259ad0.png

队列无疑是最合适的数据结构

5a26a9b8-d963-11ed-bfe3-dac502259ad0.png

合并函数也是如此,因为图像这种处理的方式就适合队列

5a4fbca4-d963-11ed-bfe3-dac502259ad0.png

这个是提前设置好的

5a6a037a-d963-11ed-bfe3-dac502259ad0.png

标准的流程

5a9197a0-d963-11ed-bfe3-dac502259ad0.png

这个就是线程的启动了,然后一个循环不停的合并

5aa79dc0-d963-11ed-bfe3-dac502259ad0.png

也可以加一个日志的功能,直接写到最上面就行

现在的程序一点也不装逼,如果可以加一些文字什么的,就更好啦!

5ac2e396-d963-11ed-bfe3-dac502259ad0.png

要把视频流封装成一个类,然后里面也是多线程处理

5adea2d4-d963-11ed-bfe3-dac502259ad0.png

在下面调用的时候,就是实例化代码

5b012ef8-d963-11ed-bfe3-dac502259ad0.png

这里就显示一个左眼的FPS信息叠加

代码中,putText函数用于将帧率信息添加到视频帧的左上角。其中,cv2.FONT_HERSHEY_SIMPLEX指定了字体类型,1指定了字体大小,(255, 255, 255)指定了字体颜色,2指定了字体线宽。

一方面显示是可视化,另一方面我们需要保存具体的眼动数据来后处理。可以在程序中添加一个函数来提取圆形框的坐标信息,并将它们保存到一个文件中。

5b18fa6a-d963-11ed-bfe3-dac502259ad0.png

这个是简单版本

eye_data 是一个包含眼动信息的列表,每个元素都是一个二元组,表示眼睛的坐标。在循环中,将每个元素写入文件中,每个坐标之间用逗号分隔,每行结束后添加一个换行符。

假设圆形框的半径为 r,圆心坐标为 (x, y),那么可以使用 OpenCV 中的 circle 函数来绘制圆形框。在绘制圆形框时,同时将圆心坐标和半径信息保存到一个列表中:

5b31a920-d963-11ed-bfe3-dac502259ad0.png

在每次绘制圆形框时,将圆心坐标和半径信息添加到 eye_data 列表中。最后,可以将 eye_data 中的信息保存到一个文本文件中:

5b40db84-d963-11ed-bfe3-dac502259ad0.png

现在就是一个较为完善的函数了

再让我封装一下:

5b576458-d963-11ed-bfe3-dac502259ad0.png

在视频帧上绘制眼球圆形框,并返回圆形框的坐标信息

5b6abdd2-d963-11ed-bfe3-dac502259ad0.png

这个是信息保存的函数

目前实现的功能挺多的了,现在来写一个GUI吧!

5b8db4fe-d963-11ed-bfe3-dac502259ad0.png

就两个线程就行

5ba04790-d963-11ed-bfe3-dac502259ad0.png

初始化是捕获线程,在run函数里面进行了颜色的转换

5bc205e2-d963-11ed-bfe3-dac502259ad0.png

使用定时器来更新帧率信息

5bd2321e-d963-11ed-bfe3-dac502259ad0.png

这些都简单

5bf83856-d963-11ed-bfe3-dac502259ad0.png

都比较简单吧?

完整代码我放在Github上面了。

我们拿到了保存的数据,想重新把他们展示出来。假设眼动数据文件是一个文本文件,每行包含两个数字,分别代表左右眼的坐标。

5c145126-d963-11ed-bfe3-dac502259ad0.png

使用matplotlib库中的plot函数来绘制左右眼的坐标。下面是一个简单的示例代码,绘制左眼的x坐标和y坐标:

5c2bdc7e-d963-11ed-bfe3-dac502259ad0.png

来封装一下

5c465176-d963-11ed-bfe3-dac502259ad0.png

好啦!

再实现一个功能吧!

在播放的时候点按鼠标就可以捕捉当前播放的数据而且在图片上面标注时间戳。

程序应该这样写:

1.读取眼动数据文本文件,将数据存储到一个列表中。2打开视频文件,并读取第一帧。3.在窗口上显示第一帧图像。4.进入循环,依次读取眼动数据列表中的每个数据。5.当用户按下鼠标时,记录当前的时间戳,并在图像上绘制一个圆形或者其他标记,标记当前时间戳。6.在窗口上显示标记后的图像。

5c63ce40-d963-11ed-bfe3-dac502259ad0.png

读取

后面的功能分开写不好,这里合在一起写。

5c7599ae-d963-11ed-bfe3-dac502259ad0.png

先读取视频帧,然后就是获取帧率,创建一个窗口

5c8c334e-d963-11ed-bfe3-dac502259ad0.png

能看懂吧?

5ca62a2e-d963-11ed-bfe3-dac502259ad0.png

这个就是绘制标记

5cb734c2-d963-11ed-bfe3-dac502259ad0.png

许久不用Python,然后坏了,各种运行出错,VSCode都扑街了,哭死,不知道咋办了。

5cd84432-d963-11ed-bfe3-dac502259ad0.png

解决不了

5ce7df46-d963-11ed-bfe3-dac502259ad0.png

重新安装就好啦!

5cf8b35c-d963-11ed-bfe3-dac502259ad0.jpg

嘤嘤嘤,没看上

c:/Users/yunswj/AppData/Local/Programs/Python/Python310/python.exe -m 
pip install ipykernel -U --user --force-reinstall
pip install opencv-python
https://cmake.org/download/
import cv2
import threading




class VideoStream:
    def __init__(self, src=0, width=640, height=480, fps=30):
        self.stream = cv2.VideoCapture(src)
        self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, width)
        self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
        self.stream.set(cv2.CAP_PROP_FPS, fps)
        self.width = int(self.stream.get(cv2.CAP_PROP_FRAME_WIDTH))
        self.height = int(self.stream.get(cv2.CAP_PROP_FRAME_HEIGHT))
        self.fps = int(self.stream.get(cv2.CAP_PROP_FPS))
        self.status = False
        self.frame = None


    def start(self):
        if self.status:
            return None
        self.status = True
        threading.Thread(target=self.update, args=()).start()


    def update(self):
        while self.status:
            _, self.frame = self.stream.read()


    def read(self):
        return self.frame


    def stop(self):
        self.status = False




def main():
    # 创建两个VideoStream对象,用于捕获左右眼视频流
    left_cam = VideoStream(0)
    right_cam = VideoStream(1)


    # 开始捕获视频流
    left_cam.start()
    right_cam.start()


    # 创建OpenCV窗口用于显示视频流
    cv2.namedWindow("Video Stream", cv2.WINDOW_NORMAL)


    while True:
        # 读取左右眼视频流
        left_frame = left_cam.read()
        right_frame = right_cam.read()


        # 在视频流上添加帧率信息
        left_fps_text = f"FPS: {left_cam.fps}"
        right_fps_text = f"FPS: {right_cam.fps}"
        cv2.putText(
            left_frame,
            left_fps_text,
            (10, 30),
            cv2.FONT_HERSHEY_SIMPLEX,
            1,
            (255, 255, 255),
            2,
        )
        cv2.putText(
            right_frame,
            right_fps_text,
            (10, 30),
            cv2.FONT_HERSHEY_SIMPLEX,
            1,
            (255, 255, 255),
            2,
        )


        # 合并左右眼视频流并显示
        merged_frame = cv2.hconcat([left_frame, right_frame])
        cv2.imshow("Video Stream", merged_frame)


        # 按'q'键退出
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break


    # 停止视频流捕获
    left_cam.stop()
    right_cam.stop()


    # 关闭OpenCV窗口
    cv2.destroyAllWindows()




if __name__ == "__main__":
    main()


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2550

    文章

    51046

    浏览量

    753161
  • 检测器
    +关注

    关注

    1

    文章

    863

    浏览量

    47680
  • 机器学习
    +关注

    关注

    66

    文章

    8408

    浏览量

    132580
  • 眼动追踪
    +关注

    关注

    0

    文章

    18

    浏览量

    6744

原文标题:开发一个完整的眼动追踪应用-Python版

文章出处:【微信号:TT1827652464,微信公众号:云深之无迹】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    追踪能提供全新人机互动体验

    强大的电脑芯片、高效的红外LED以及新型的摄像传感器,让先前复杂的追踪系统如今能够适应消费类电子应用的各种需要。借助这些系统,电子设备可以检测用户的眼球运动,从而识别用户的下步意
    发表于 05-18 08:30

    什么是追踪追踪如何运作?

    什么是追踪追踪如何运作?
    发表于 06-17 06:11

    荣耀magic或出集成追踪功能

    华为日前发布了集成追踪功能的全新荣耀Magic智能手机。荣耀Magic是Tobii技术的首款智能手机集成,使用了基于用户临在感和注意力的功能,是Tobii完整
    发表于 12-19 10:57 994次阅读

    微软Windows 10将内置追踪技术 到底什么是追踪技术?

    据外媒报道,微软将为Windows 10预置追踪功能——Eye Control,这个功能可以让用户使用眼睛就可以完成电脑操作。
    发表于 08-02 16:05 2776次阅读

    高通与Tobii合作研究追踪技术

    通骁龙移动VR平台创建完整的参考设计和开发套件,该平台集成了Tobii的EyeCore跟踪硬件和算法。 眼球追踪可以通过多种方式使VR和
    发表于 04-10 14:01 941次阅读

    追踪读取用户微表情,用于新的交互方式

    作为大家都知道它在悄悄研发AR头显的公司,苹果的头显计划中当然也少不了追踪方案,最近,苹果的
    的头像 发表于 05-03 17:06 4976次阅读

    Oculus获新专利 能实现更精确的追踪功能

    Oculus公司获得了追踪技术新专利,他们或将在头显上安装光场摄像头,从而实现更精确的
    发表于 11-12 11:18 1586次阅读

    追踪头戴设备将可以帮助残疾人

    据外媒报道,对于无法说话、无法移动手臂,手部或甚至头部的残疾人士来说,计算机连接的追踪系统允许通过眼球运动进行通信。然而,这种系统具有些缺点,而全新实验性
    发表于 02-10 11:40 1306次阅读

    追踪将是下代VR头显非常重要的项技术

    追踪是许多人认为下代VR头显必备的重要技术,近日Lemnis Technologies最新的变焦原型旨在为头显制造商提供软件和硬件,了解
    发表于 12-28 11:03 1393次阅读

    追踪集成的眼镜,可将数据带入任何场景

    BIOPAC Systems, Inc.宣布了项适用于研究人员的追踪集成新方案,让这些研究人员能从不同位置的移动参与者进行实验。ETVision (EYE-ETV)
    发表于 07-16 11:22 1564次阅读

    追踪技术初显潜力 落地还需硬件推广

    CES2020上,Nreal宣布与七鑫易维合作,为旗下MR眼镜开发应用场景。追踪技术直在多个方面有着广泛的应用,随着AR元年的到来,其
    的头像 发表于 10-14 16:34 2376次阅读

    追踪头戴设备可以更好的帮助残疾人

    据外媒报道,对于无法说话、无法移动手臂,手部或甚至头部的残疾人士来说,计算机连接的追踪系统允许通过眼球运动进行通信。然而,这种系统具有些缺点,而全新实验性
    的头像 发表于 12-25 22:01 1107次阅读

    追踪中的坐标+追踪原理

    所有注视数据都映射到与活动显示区域对齐的 2D 坐标系中。将仪与监视器起使用时,活动显示区域是不包括监视器框架的显示区域。对于在没有显示器的情况下使用的
    的头像 发表于 09-26 11:17 1711次阅读

    网络摄像头式追踪则的优势

    . 首先, 网络摄像头式追踪基本上意味着从"般" 相机获取
    的头像 发表于 11-03 12:03 1076次阅读

    苹果将推出追踪辅助功能

    苹果近日宣布,将在今年晚些时候为iPad和iPhone用户推出项革命性的辅助功能——追踪。这功能旨在帮助身体残疾的用户通过眼睛轻松控
    的头像 发表于 05-17 10:04 538次阅读