Kinect(Light Coding)就是以紅外線發出人眼看不見的class1雷射光,透過鏡頭前的diffuser(光柵、擴散片)將雷射光均勻分佈投射在測量空間中,再透過紅外線攝影機記錄下空間中的每個散斑,擷取原始資料後,再透過晶片計算成具有3D深度的圖像。
工具:SDK+OpenCV+VS2017
kinect 2.0開發第一步,研究kinect2.0 API。
本文主要是翻譯官方文檔,另外加入自己的一點理解和實驗
文檔網址: https://msdn.microsoft.com/en-us/library/dn782033.aspx
1.API分類
主要分爲三類
1)Windows系統運行API(Windows Runtime APIs )。
2).NET API
3)原始API(native APIs)
Kinect v1,可以讀取投射的紅外線pattern,從pattern的變形獲取Depth的信息,搭載了「Light Coding」方式的Depth傳感器。Kinect v2預覽版,通過從投射的紅外線脈衝反射回來的時間來獲得Depth的信息,變更爲「Time of Flight(ToF)」方式的Depth傳感器。
Light Coding,顧名思義,就是用光源照明給需要測量的空間編上碼,屬於結構光技術的一種,只是深度計算方式不一樣。結構光(Structured Lighting)是將一維或二維的圖像投影至被測物上,根據圖像的形變情形,判斷被測物的表面形狀,可以非常快的速度進行掃描,相對於一次測量一點的探頭,此種方法可以一次測量多點或大片區域,故能用於動態測量。
與普通結構光法不同的是,Light Coding的光源稱爲“激光散斑”,是激光照射到粗糙物體或穿透毛玻璃後隨機形成的衍射斑點。這些散斑具有高度的隨機性,而且會隨着距離的不同而變換圖案。也就是說空間中任意兩處的散斑圖案都是不同的。只要在空間中打上這樣的結構光,整個空間就都被做了標記,把一個物體放進這個空間,只要看看物體上面的散斑圖案,就可以知道這個物體在什麼位置了。當然,在這之前要把整個空間的散斑圖案都記錄下來,所以要先做一次光源標定。
Time of Flight是一種主動式深度感應技術,其使用激光探測目標物。顧名思義,Time of Flight就是去計算光線飛行的時間。首先讓裝置發出脈衝光,並且在發射處接收目標物的反射光,藉由測量時間差算出目標物的距離;ZCam就是使用 TOF技術,使用紅外線以及Accelerometers加速度計感應器,感測立體空間的相對位置變化,建構灰階距離影像的深度感應器。3DV Systems公司研發該技術已經長達10年,並取得許多專利技術,微軟二代Kinect使用TOF也是情理之內的事。
除此以外,新一代Kinect還有許多新特點:彩色攝像頭達到了FullHD(1920 x 1080 @30fps);更大的視角,FOV 由 53×47 度變為 70×60 度;在 1 米左右距離即可偵測使用者;可以偵測6 位使用者(含骨架)、25 個關節點(關節點與上一代相比多5個,現在在手掌這部分現在有三個關節點,所以可以在一定程度上偵測手的開合狀態);可以根據臉部彩色影像的細微變化偵測心跳。
第二代Kinect已經發售,其性能發生了翻天覆地的進化。其中最大的改變是改爲採用TOF技術,號稱有三倍的精確度。其數據的穩定性相對較好、細節更多;被其他環境光源(紅外線)影響的概率也更低,甚至可以承受一定程度的日光。也由於深度感應改採用TOF技術,所以捕捉到的紅外線影像不會像 PrimeSense 的技術有散斑、畫面很乾淨。
讀取深度圖像步驟
- 獲取kinect傳感器
- 打開傳感器
- 獲取深度信息傳感器
- 打開深度幀讀取器
- 獲得最近的一幀
- 將深度信息轉換爲MAT格式
- 用opencv的imshow顯示
- 回收和釋放內存
讀取彩色圖像步驟
1.獲取kinect傳感器
2.打開傳感器
3.獲取彩色圖像信息傳感器
4. 打開彩色圖像幀讀取器
5.獲得最近的一幀
6. 將彩色圖像轉換按三通道保存爲MAT格式
7.用opencv的imshow顯示
8. 回收和釋放內存