利用Kinect實現用指尖隔空控制滑鼠 原始碼放出

2022-05-13 10:45:23 字數 1995 閱讀 7866

# 簡介

此程式為利用kinect實現用手指隔空控制滑鼠,是我另乙個專案的一部分,因為在另外那個專案中滑鼠的click是通過一種特殊的方式實現的,因此這個程式**只實現了用手控制滑鼠的移動,並沒有點選的功能**。相比leapmotion,利用kinect來控制滑鼠可以大幅增加操控範圍,使用者可以隨意走動,而不是被固定在桌面前。

好像很多人需要這個,但是網上為數不多的**都是kinect v1的,所以放出我的**來供大家討論。

首先需要讓kinect識別出你,建議距離0.5m以上4m以內並且正對攝像頭,如果位置合適的話瞬間就能識別出,如果幾秒鐘都沒有識別出來就請調節位置。然後將手放入操作視窗就可以控制滑鼠了,綠色的點代表指尖。

程式的核心在於指尖識別,我發現網上關於指尖識別的資料不多,所以自己想了個很簡單的辦法,不過效果還不錯。首先應該知道三點:

1.  kinect可以分辨出畫面中哪一部分是人體

2. kinect帶有深度攝像頭,可以獲取物體到攝像頭的距離

3. kinect可以獲取到人體的最多25個關節點的位置

為了尋找指尖,沒有必要在整副畫面中去搜尋,那樣會導致效率非常低。指尖肯定是在手部關節點(hand)附近的,因此只需要獲取到手部關節點的位置然後再拓展出一片區域,在這片區域裡進行搜尋就行了。之所以取hand而不是取handtip,是因為後者的穩定性非常差,即使在乙個合適的距離正對kinect也不一定能識別出來。

這時候就可以根據指尖的特徵來進行指尖識別了。不過實際上我識別出的不是指尖,而是指尖上方的一點。此點的特徵如下:

不屬於人體

或者屬於人體,但是和手部關節點不在同乙個平面上(允許有誤差)

到手部關節點的位置在某個合適的範圍內

下面連續n(這裡我取n為5)個畫素都屬於人體

首先,對於第一點很好理解,因為上面說了識別的不是指尖,而是指尖上方的一點。

第二點是用來處理手移動到身邊正前方的時候的情況,比如手在胸前,這時候指尖上方的點都是屬於人體的,不滿足第一點。這裡的誤差指的是手和小臂成90度時的深度差,一般15cm左右。

第三點是為了消除兩根手指根部之間的那個位置形成的誤判,同時也進一步減小了搜尋空間,正常情況下手指到手腕的距離都在10~25cm範圍內,這裡把拇指篩掉了,一般也不會用拇指去操作。如果要恢復拇指的話調整下引數就可以。

第四個條件篩選出了離手指尖最近的那個點。

為了便於操作和觀察,我設定了乙個操作視窗,位於肩部的左上方和右上方,根據操作手的左右而調整。這個視窗就代表著電腦的螢幕,手指在視窗裡的位置就是滑鼠在電腦螢幕上的位置。這裡視窗的大小是根據關節點headneck的距離作為單位長度算出來的,也就是說能根據人體到kinect的距離來調整操作視窗的大小。同時這個視窗是實時更新的,會根據人體的位置而進行調整。

這裡要說一下,如果操作的位置相對固定,那麼建議識別出視窗後就不要再更新,將操作視窗固定,因為這樣能夠大幅度提高滑鼠的穩定性,同時上傳了乙份以這種方式來做的**,不過這份**只實現了單手控制。

這是個不太好處理的問題,因為容易影響到正常操作。這裡我設定了乙個移動的閾值,如果和上乙個位置相比,滑鼠的位置改變很微小,那麼就保持上次的位置不變。還可以再加入乙個判斷位置突變的閾值,如果當前位置和上一次位置相距太遠,就可以判斷為非法而篩去。

黑色框為程式裡確定的操作視窗,大寫的x和y代表的是螢幕的寬和高,紅色框為電腦螢幕,假設人的手指在

的位置,如果想將滑鼠也對映到同樣的位置,那麼就有

的等比關係成立。電腦螢幕的寬和高,實際上是不需要考慮解析度的,因為在滑鼠的座標系下,電腦的寬和高都被分成了65535個單位,所以寬和高可以視為65535。根據這些,就可以算出

的值來。

利用redis實現使用者簽到

很多 都提供了簽到功能 這裡不考慮資料落地事宜 並且需要展示最近乙個月的簽到情況,如果使用bitmap我們怎麼做?一言不合亮 redis new redis redis connect 127.0.0.1 使用者uid uid 1 記錄有uid的key cachekey sprintf sign d...

利用 dev mem實現使用者空間驅動

dev mem是物理記憶體的全映像,可以用來訪問物理記憶體,一般用法是open dev mem o rdwr o sync 然後mmap,接著就可以用mmap的位址來訪問物理記憶體,這實際上就是實現使用者空間驅動的一種方法。它的好處參見博文 include include include inclu...

利用yarn多佇列實現hadoop資源隔離

大資料處理離不開hadoop集群的部署和管理,對於本來硬體資源就不多的創業團隊來說,做好資源的共享和隔離是很有必要的,畢竟不像bat那麼豪,那麼怎麼樣能把有限的節點同時分享給多組使用者使用而且互不影響呢,我們來研究一下yarn多佇列做資源隔離 capacityscheduler 使用過第一代hado...