Kinect for Windows SDK v2.0 開發筆記 (四)玩家索引與綠屏技術

(轉載請註明出處)

使用SDK: Kinect for Windows SDK v2.0 public preview

CSND博客出現了已經發布了,修改了一個字就變成“待審覈”狀態導致慢更了,

不過反正幾乎沒人看也就影響爲0啦。

這次說的是Kinect的玩家索引(BodyIndex)。


Kinect用一個字節表示當前深度座標的玩家編號。目前最大支持6人,已經是非常不錯了,這個“6”是一個宏定義

#define BODY_COUNT 6
支持6人索引及6人骨骼跟蹤,1代支持6人索引但是隻支持2人骨骼跟蹤,可見USB3.0的功勞。

獲得的字節流中,0x00表示0號玩家,0x01表示1號,直到0x05這6名玩家索引,沒有玩家則是用 0xFF表示。請注意,

玩家索引是隨機分配的,不是隻有一位玩家就編號是0x00。不過經測試,貌似一位玩家用0x00表示的機率要大些。


這次可視化算法就簡單了,6名玩家使用3比特位即可表示,剛好RGB三種3顏色,所以就用下面代碼:


        for (UINT i = 0; i < nBufferSize; ++i){
            pBGRXBuffer[i].rgbBlue = pBuffer[i] & 0x01 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbGreen = pBuffer[i] & 0x02 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbRed = pBuffer[i] & 0x04 ? 0x00 : 0xFF;
            pBGRXBuffer[i].rgbReserved = 0xFF;
        }

這樣,0x00號就是白色,0xFF就是黑色,方便觀看。請注意,Kinect的核心算法基於深度圖像,

所以獲得的玩家索引的大小也是與深度圖像大小一致,同上節,方法名差不多,“DepthFame”改爲"BodyIndexFrame"就差不多了。

效果如下:


可以看到在近距離,深度圖像分辨率大於手指,沒準微軟在以後近景模式中會提供官方的十指跟蹤。

當然大家自己可以利用OpenCV基於深度圖像實現手指位置的跟蹤。


看一下這個圖像,如果與彩色圖像像相結合,就可以把人物將彩色圖像中“分離”出來,這個有點像電影電視

中的“色鍵”,在背景使用綠色或者藍色圖像,後期處理把這些背景色移除。在這就成爲綠屏技術吧。


算法大致如下:

這個點索引爲0xFF就把像素置爲空(0x00000000),否則置爲在這個點彩色幀相應位置。

那麼怎麼獲取“這個點彩色幀相應位置”呢?Kinect SDK提供了一個座標映射對象。是的,居然是對象,

而不是一個函數搞定的事發火

還有就是只要是關於深度數據的座標映射,是要提供源數據(即深度數據)的。

原來不是一個簡單的f(x)啊。

座標映射提供非常多的映射方法,像深度座標映射彩色座標,彩色座標映射深度座標,詳細的情查看官方文檔

還有一點需要注意,就是可能會出現座標映射改變的情況,比如彩色幀大小從1080P變成720P。

不過現在還不能,於是ICoordinateMappingChangedEventArgs裏邊也是幾乎啥也沒有。也就是目前還不用管


所現在我們需要同時開啓彩色數據流,深度數據流已經玩家索引數據流。同步這個流不是一個簡單的事。

畢竟我們不知道什麼流先到,什麼流後到。於SDK提供一個“復源幀”對象,將多個數據流封到一起,用起來非常方便。

使用IKinectSensor::OpenMultiSourceFrameReader(DWORD, IMultiSourceFrameReader **)打開復源幀,比如:

        hr = m_pKinect->OpenMultiSourceFrameReader(
            FrameSourceTypes::FrameSourceTypes_Color | 
            FrameSourceTypes::FrameSourceTypes_BodyIndex |
            FrameSourceTypes::FrameSourceTypes_Depth,
            &m_pMultiSourceFrameReader
            );
打開彩色數據流+深度數據流+玩家索引流,使用方法和單源幀差不多,不過使用時要獲取你需要的單源幀引用,

比如IMultiSourceFrame::get_ColorFrameReference,IMultiSourceFrame::get_DepthFrameReference等等。詳細的可以看範例。


效果如下:


哎,一個人截圖簡直不方便,就這樣變學姐了。大哭


還有就是提供的範例中,一個解決方案包含了這兩個工程,需要調試某工程需要右鍵工程--設置啓動項



範例下載地址:點擊這裏


發佈了35 篇原創文章 · 獲贊 18 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章