# 代碼示例:
#include <Kinect.h>
#include <iostream>
using namespace std;
int main(void)
{
IKinectSensor * mySensor = nullptr;
GetDefaultKinectSensor(&mySensor); //獲取感應器
mySensor->Open(); //打開感應器
IDepthFrameSource * mySource = nullptr; //取得深度數據
mySensor->get_DepthFrameSource(&mySource);
int height = 0, width = 0;
IFrameDescription * myDescription = nullptr; //取得深度數據的分辨率,等下用
mySource->get_FrameDescription(&myDescription);
myDescription->get_Height(&height);
myDescription->get_Width(&width);
myDescription->Release();
IDepthFrameReader * myReader = nullptr;
mySource->OpenReader(&myReader); //打開深度數據的Reader
int times = 100;
IDepthFrame * myFrame = nullptr;
while (times)
if (myReader->AcquireLatestFrame(&myFrame) == S_OK) //通過Reader嘗試獲取最新的一幀深度數據,放入深度幀中,並判斷是否成功獲取
{
UINT size = 0;
UINT16 * buffer = nullptr;
myFrame->AccessUnderlyingBuffer(&size,&buffer); //將深度數據輸入到數組里,里面的數字代表距離
cout << buffer[width * (height / 2) + width / 2] << endl; //將位於攝像頭最中央的物體的距離輸出
times--;
myFrame->Release();
}
myReader->Release(); //釋放不用的變量並且關閉感應器
mySource->Release();
mySensor->Close();
mySensor->Release();
return 0;
}
# 詳細解釋
1. **取得並開啟感應器(`IKinectSensor`)** 通過`GetDefaultKinectSensor()`將感應器賦給一個`IKinect`變量,然后這個變量就可以代表感應器了,再用它打開感應器。 2. **取得深度數據源(`IDepthFrameSource`)** 打開感應器后,用它里面的`get_DepthFrameSource()`這個成員函數來獲取深度數據源,有點奇怪的是,雖然現在獲取到了數據源,但是不能對數據進行操作,還需要下一步的Reader。 3. **取得深度數據Reader(`IDepthFrameReader`)** 要對數據進行操作,首先需要通過數據源將`Reader`打開 4. **通過Reader讀取數據幀(`IDepthFrame`)** 此步驟在`while`循環中進行,每次循環時,通過`Reader`的`AcquireLatestFrame()`的成員函數來獲取最新的一幀,並且將其裝入一個深度數據幀里。注意,這里的`AcquireLatestFrame()`這個函數一定要判斷是否返回一個成功值,因為這個函數獲取失敗的的幾率很高。 5. **操作數據幀** 在成功讀取到數據幀之后,我們通過數據幀里的`AccessUnderlyingBuffer()`這個函數將幀里的數據復制到一個數組里去,這個函數有兩個參數,第一個是個記錄大小的變量,第二個是個接受數據的數組指針,傳入后會分別返回數組的大小以及數據。它傳入數組的數據代表的是那一個像素點上的物體距離傳感器的位置。在上面的代碼里,用了一個`IFrameDescription`,顧名思義,它是用來描述深度數據幀的,通過它,可以獲取到深度數據幀的寬、高、每個像素多少個字節等等。記錄了寬和高之后,就可以計算出中間那一點在數組里的位置,訪問輸出就可以了。
為了簡潔此段代碼略掉了大部分錯誤檢測,嚴謹來說的話應該每次使用返回HRESULT的函數都應該檢測返回值。如果程序正常運行的話,應該會輸出100個數字,代表距離。最后當一個對象不用了之后,記得要釋放。