精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

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

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

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

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

我們在這里主要是直接給出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之間。瞳孔在強光下縮小,在黑暗下擴大,這是人體的正常生理反應。瞳孔大小不一致或對光反應異??赡苁悄X部或眼部疾病的征兆。

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


審核編輯 :李倩


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

    關注

    2548

    文章

    50678

    瀏覽量

    752018
  • 檢測器
    +關注

    關注

    1

    文章

    860

    瀏覽量

    47651
  • 機器學習
    +關注

    關注

    66

    文章

    8377

    瀏覽量

    132410
  • 眼動追蹤
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6739

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

    榮耀magic或出集成追蹤功能

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

    微軟Windows 10將內置追蹤技術 到底什么是追蹤技術?

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

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

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

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

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

    Oculus獲新專利 能實現更精確的追蹤功能

    Oculus公司獲得了追蹤技術新專利,他們或將在頭顯上安裝光場攝像頭,從而實現更精確的
    發表于 11-12 11:18 ?1579次閱讀

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

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

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

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

    追蹤集成的眼鏡,可將數據帶入任何場景

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

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

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

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

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

    追蹤中的坐標+追蹤原理

    所有注視數據都映射到與活動顯示區域對齊的 2D 坐標系中。將儀與監視器起使用時,活動顯示區域是不包括監視器框架的顯示區域。對于在沒有顯示器的情況下使用的
    的頭像 發表于 09-26 11:17 ?1683次閱讀

    網絡攝像頭式追蹤則的優勢

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

    蘋果將推出追蹤輔助功能

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