RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

開發(fā)一個完整的眼動追蹤應用-Python版

云深之無跡 ? 來源:云深之無跡 ? 2023-04-13 11:10 ? 次閱讀

目前有幾個方案,在下面:

1.電極式眼動追蹤:這種技術通過在眼球周圍放置電極來測量眼睛的運動。它可以提供非常高的準確性和分辨率,但需要接觸眼球,因此不太適合長時間使用或需要無接觸測量的應用場景。2.紅外線眼動追蹤:這種技術使用紅外線攝像機來觀察眼睛的位置和運動。由于它不需要接觸眼球,因此非常適合長時間使用和需要無接觸測量的應用場景。它的準確性和分辨率通常比電極式眼動追蹤低。3.磁共振眼動追蹤:這種技術使用磁共振成像來測量眼球的位置和運動。它可以提供非常高的空間分辨率,但時間分辨率較低,因此不太適合研究快速眼動的過程。4.可穿戴式眼動追蹤:這種技術使用小型傳感器或攝像頭,可以放置在眼鏡或頭盔上,可以隨身攜帶,適用于移動應用場景。但是由于可穿戴設備的尺寸和重量限制,其準確性和分辨率通常較低。5.視網(wǎng)膜追蹤:這種技術利用視網(wǎng)膜圖像來跟蹤眼球的位置和運動。它可以提供非常高的準確性和分辨率,但只能在特定的實驗條件下使用,例如黑暗環(huán)境下觀察單一的點光源。

以我目前念的這個書,我還是用視覺方案來實現(xiàn):

1.特征提?。哼x擇適當?shù)奶卣鱽砻枋鲅劬Φ男螤睢㈩伾?、紋理等信息。例如,可以使用Haar級聯(lián)檢測器來提取眼睛的輪廓特征,或者使用顏色分布模型來提取眼球的顏色特征。這步主要是傳統(tǒng)的2.目標檢測:使用機器學習計算機視覺技術來檢測眼睛的位置和方向。因為直接目標檢測是識別不準的,現(xiàn)實太復雜了。可以使用級聯(lián)分類器或支持向量機(SVM)來識別眼睛的位置和方向,或者使用卷積神經(jīng)網(wǎng)絡(CNN)來分類眼動類型。3.跟蹤和估計:根據(jù)檢測結果,使用跟蹤和估計算法來跟蹤眼睛的位置和運動軌跡。在捕捉的基礎上開始進行跟蹤,持續(xù)的來捕獲。使用卡爾曼濾波器或粒子濾波器來估計眼睛的位置和速度,或者使用光流算法來估計眼球的運動軌跡。4.數(shù)據(jù)分析:根據(jù)眼動追蹤的結果,進行數(shù)據(jù)分析和可視化??梢杂嬎阕⒁朁c的位置、持續(xù)時間和注視次數(shù)等統(tǒng)計信息,或者使用熱力圖和軌跡圖來可視化眼動數(shù)據(jù)。這個也是這次要寫的一個點。

我們在這里主要是直接給出ROI的區(qū)域減少算力。

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

在預處理步驟中,使用了高斯平滑和邊緣檢測來增強圖像特征

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

在特征提取步驟中,使用了霍夫圓變換來檢測圓形區(qū)域

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

參數(shù)

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

在目標檢測步驟中,找到最大的圓形區(qū)域作為眼球,并在圖像中標記出來

太簡單了家人們!

但是這個程序太簡單了,就是一個找特征啥的,有點傻。這次換個庫:

Dlib是一個C++編寫的機器學習庫,提供了用于人臉檢測、關鍵點檢測、姿態(tài)估計等任務的算法,其中也包括用于眼動追蹤的算法。Dlib同樣也提供了Python接口,可以在Python中使用Dlib的算法實現(xiàn)眼動追蹤。

dlib提供一個方法可將人臉圖片數(shù)據(jù)映射到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

簡單的轉(zhuǎn)下顏色,然后直接找

dlib 庫提供了兩個用于人臉檢測的功能。

第一個是HOG+線性SVM人臉檢測器,另一個是深度學習MMOD CNN人臉檢測器。

反正就是找一下面部的區(qū)域:

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

這些代碼是再找眼部的位置

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

在范圍之內(nèi)就可以了

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

有極值坐標嘎嘎算

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

接著進一步給出瞳孔的坐標

2.0~8.0mm之間瞳孔大小是指虹膜中央的一圓孔的直徑,受光線、年齡、人種、屈光狀態(tài)、目標遠近和情緒等因素影響,正常范圍在2.0~8.0mm之間。瞳孔在強光下縮小,在黑暗下擴大,這是人體的正常生理反應。瞳孔大小不一致或?qū)夥磻惓?赡苁悄X部或眼部疾病的征兆。

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

我考你,你遇到這種情況怎么寫?

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

先給外圈的大圓套上

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

再處理瞳孔

多數(shù)情況下,我們是要實時的檢測的:

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

來一段從攝像頭捕獲的代碼

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

祖?zhèn)鞔a不能丟

更實用性的是兩個攝像頭來捕捉眼動:

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

這個寫的比較呆逼,不過我在后面會有進行封裝

現(xiàn)在是彈出兩個框來輸出圖像,趕緊不好看捏!我們來讓他并排排列!

使用OpenCV中的cv2.hconcat()函數(shù)將兩個視頻幀水平合并在一起,并使用cv2.imshow()函數(shù)將合并后的視頻幀顯示出來。

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

就很簡單,其實這里就變成一個合并橫向排列的視頻組,但是在處理流程上面有問題,應該先單一處理,最后合并結果。

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

封裝好啦?。ㄓ悬c傻逼哦~)

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

繼續(xù)封裝,注意視頻流

工程問題的話,上面的代碼還是太慢了,讓我來加一點多線程的魔法!

設計兩個線程分別處理左右眼視頻幀的讀取和合并:

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

隊列無疑是最合適的數(shù)據(jù)結構

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

合并函數(shù)也是如此,因為圖像這種處理的方式就適合隊列

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

這個是提前設置好的

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

標準的流程

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

這個就是線程的啟動了,然后一個循環(huán)不停的合并

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

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

現(xiàn)在的程序一點也不裝逼,如果可以加一些文字什么的,就更好啦!

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

要把視頻流封裝成一個類,然后里面也是多線程處理

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

在下面調(diào)用的時候,就是實例化代碼

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

這里就顯示一個左眼的FPS信息疊加

代碼中,putText函數(shù)用于將幀率信息添加到視頻幀的左上角。其中,cv2.FONT_HERSHEY_SIMPLEX指定了字體類型,1指定了字體大小,(255, 255, 255)指定了字體顏色,2指定了字體線寬。

一方面顯示是可視化,另一方面我們需要保存具體的眼動數(shù)據(jù)來后處理。可以在程序中添加一個函數(shù)來提取圓形框的坐標信息,并將它們保存到一個文件中。

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

這個是簡單版本

eye_data 是一個包含眼動信息的列表,每個元素都是一個二元組,表示眼睛的坐標。在循環(huán)中,將每個元素寫入文件中,每個坐標之間用逗號分隔,每行結束后添加一個換行符。

假設圓形框的半徑為 r,圓心坐標為 (x, y),那么可以使用 OpenCV 中的 circle 函數(shù)來繪制圓形框。在繪制圓形框時,同時將圓心坐標和半徑信息保存到一個列表中:

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

在每次繪制圓形框時,將圓心坐標和半徑信息添加到 eye_data 列表中。最后,可以將 eye_data 中的信息保存到一個文本文件中:

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

現(xiàn)在就是一個較為完善的函數(shù)了

再讓我封裝一下:

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

在視頻幀上繪制眼球圓形框,并返回圓形框的坐標信息

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

這個是信息保存的函數(shù)

目前實現(xiàn)的功能挺多的了,現(xiàn)在來寫一個GUI吧!

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

就兩個線程就行

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

初始化是捕獲線程,在run函數(shù)里面進行了顏色的轉(zhuǎn)換

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

使用定時器來更新幀率信息

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

這些都簡單

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

都比較簡單吧?

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

我們拿到了保存的數(shù)據(jù),想重新把他們展示出來。假設眼動數(shù)據(jù)文件是一個文本文件,每行包含兩個數(shù)字,分別代表左右眼的坐標。

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

使用matplotlib庫中的plot函數(shù)來繪制左右眼的坐標。下面是一個簡單的示例代碼,繪制左眼的x坐標和y坐標:

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

來封裝一下

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

好啦!

再實現(xiàn)一個功能吧!

在播放的時候點按鼠標就可以捕捉當前播放的數(shù)據(jù)而且在圖片上面標注時間戳。

程序應該這樣寫:

1.讀取眼動數(shù)據(jù)文本文件,將數(shù)據(jù)存儲到一個列表中。2打開視頻文件,并讀取第一幀。3.在窗口上顯示第一幀圖像。4.進入循環(huán),依次讀取眼動數(shù)據(jù)列表中的每個數(shù)據(jù)。5.當用戶按下鼠標時,記錄當前的時間戳,并在圖像上繪制一個圓形或者其他標記,標記當前時間戳。6.在窗口上顯示標記后的圖像。

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

讀取

后面的功能分開寫不好,這里合在一起寫。

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

先讀取視頻幀,然后就是獲取幀率,創(chuàng)建一個窗口

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():
    # 創(chuàng)建兩個VideoStream對象,用于捕獲左右眼視頻流
    left_cam = VideoStream(0)
    right_cam = VideoStream(1)


    # 開始捕獲視頻流
    left_cam.start()
    right_cam.start()


    # 創(chuàng)建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()


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2550

    文章

    51035

    瀏覽量

    753059
  • 檢測器
    +關注

    關注

    1

    文章

    863

    瀏覽量

    47676
  • 機器學習
    +關注

    關注

    66

    文章

    8406

    瀏覽量

    132558
  • 眼動追蹤
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6742

原文標題:開發(fā)一個完整的眼動追蹤應用-Python版

文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    追蹤能提供全新人機互動體驗

    強大的電腦芯片、高效的紅外LED以及新型的攝像傳感器,讓先前復雜的追蹤系統(tǒng)如今能夠適應消費類電子應用的各種需要。借助這些系統(tǒng),電子設備可以檢測用戶的眼球運動,從而識別用戶的下步意
    發(fā)表于 05-18 08:30

    什么是追蹤?追蹤如何運作?

    什么是追蹤?追蹤如何運作?
    發(fā)表于 06-17 06:11

    榮耀magic或出集成追蹤功能

    華為日前發(fā)布了集成追蹤功能的全新榮耀Magic智能手機。榮耀Magic是Tobii技術的首款智能手機集成,使用了基于用戶臨在感和注意力的功能,是Tobii完整
    發(fā)表于 12-19 10:57 ?993次閱讀

    微軟Windows 10將內(nèi)置追蹤技術 到底什么是追蹤技術?

    據(jù)外媒報道,微軟將為Windows 10預置追蹤功能——Eye Control,這個功能可以讓用戶使用眼睛就可以完成電腦操作。
    發(fā)表于 08-02 16:05 ?2775次閱讀

    高通與Tobii合作研究追蹤技術

    通驍龍移動VR平臺創(chuàng)建完整的參考設計和開發(fā)套件,該平臺集成了Tobii的EyeCore跟蹤硬件和算法。 眼球追蹤可以通過多種方式使VR和
    發(fā)表于 04-10 14:01 ?940次閱讀

    追蹤讀取用戶微表情,用于新的交互方式

    作為大家都知道它在悄悄研發(fā)AR頭顯的公司,蘋果的頭顯計劃中當然也少不了追蹤方案,最近,蘋果的
    的頭像 發(fā)表于 05-03 17:06 ?4973次閱讀

    Oculus獲新專利 能實現(xiàn)更精確的追蹤功能

    Oculus公司獲得了追蹤技術新專利,他們或?qū)⒃陬^顯上安裝光場攝像頭,從而實現(xiàn)更精確的
    發(fā)表于 11-12 11:18 ?1585次閱讀

    追蹤頭戴設備將可以幫助殘疾人

    據(jù)外媒報道,對于無法說話、無法移動手臂,手部或甚至頭部的殘疾人士來說,計算機連接的追蹤系統(tǒng)允許通過眼球運動進行通信。然而,這種系統(tǒng)具有些缺點,而全新實驗性
    發(fā)表于 02-10 11:40 ?1305次閱讀

    追蹤將是下代VR頭顯非常重要的項技術

    追蹤是許多人認為下代VR頭顯必備的重要技術,近日Lemnis Technologies最新的變焦原型旨在為頭顯制造商提供軟件和硬件,了解
    發(fā)表于 12-28 11:03 ?1389次閱讀

    追蹤集成的眼鏡,可將數(shù)據(jù)帶入任何場景

    BIOPAC Systems, Inc.宣布了項適用于研究人員的追蹤集成新方案,讓這些研究人員能從不同位置的移動參與者進行實驗。ETVision (EYE-ETV)
    發(fā)表于 07-16 11:22 ?1563次閱讀

    追蹤技術初顯潛力 落地還需硬件推廣

    CES2020上,Nreal宣布與七鑫易維合作,為旗下MR眼鏡開發(fā)應用場景。追蹤技術直在多個方面有著廣泛的應用,隨著AR元年的到來,其
    的頭像 發(fā)表于 10-14 16:34 ?2374次閱讀

    追蹤頭戴設備可以更好的幫助殘疾人

    據(jù)外媒報道,對于無法說話、無法移動手臂,手部或甚至頭部的殘疾人士來說,計算機連接的追蹤系統(tǒng)允許通過眼球運動進行通信。然而,這種系統(tǒng)具有些缺點,而全新實驗性
    的頭像 發(fā)表于 12-25 22:01 ?1103次閱讀

    追蹤中的坐標+追蹤原理

    所有注視數(shù)據(jù)都映射到與活動顯示區(qū)域?qū)R的 2D 坐標系中。將儀與監(jiān)視器起使用時,活動顯示區(qū)域是不包括監(jiān)視器框架的顯示區(qū)域。對于在沒有顯示器的情況下使用的
    的頭像 發(fā)表于 09-26 11:17 ?1706次閱讀

    網(wǎng)絡攝像頭式追蹤則的優(yōu)勢

    . 首先, 網(wǎng)絡攝像頭式追蹤基本上意味著從"般" 相機獲取
    的頭像 發(fā)表于 11-03 12:03 ?1069次閱讀

    蘋果將推出追蹤輔助功能

    蘋果近日宣布,將在今年晚些時候為iPad和iPhone用戶推出項革命性的輔助功能——追蹤。這功能旨在幫助身體殘疾的用戶通過眼睛輕松控
    的頭像 發(fā)表于 05-17 10:04 ?536次閱讀
    RM新时代网站-首页