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

原创 云深之无迹 2023-04-12 23:24

今天写一个相对完善的眼动项目

基于磁场定位的眼动追踪技术

眼动追踪传感器选型

眼动追踪:梯度法精确定位眼中心(论文)

开源眼动-前导篇

开眼眼动-分析引擎

眼动追踪中的坐标+追踪原理

开源眼动追踪:GazeTracking(上:效果)

开源眼动追踪:GazeTracking(下:实现)

EyeLoop基于Python的眼动仪(超棒)

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

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

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

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

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

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

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

参数

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

太简单了家人们!

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

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

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

上次觉得CMake碍眼,卸载了

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

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

安装成功了

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

先找脸,再找眼,合理!

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

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

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

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

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

在范围之内就可以了

有极值坐标嘎嘎算

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

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

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

先给外圈的大圆套上

再处理瞳孔

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

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

祖传代码不能丢

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

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

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

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

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

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

继续封装,注意视频流

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

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

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

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

这个是提前设置好的

标准的流程

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

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

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

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

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

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

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

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

这个是简单版本

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

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

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

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

再让我封装一下:

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

这个是信息保存的函数

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

就两个线程就行

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

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

这些都简单

都比较简单吧?

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

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

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

来封装一下

好啦!

再实现一个功能吧!

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

程序应该这样写:

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

读取

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

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

能看懂吧?

这个就是绘制标记

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

解决不了

重新安装就好啦!

嘤嘤嘤,没看上

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 cv2import 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()

评论
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 115浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 78浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 87浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 46浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 81浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 114浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 88浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 74浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 81浏览
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 66浏览
我要评论
1
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦