在Kinect for windows SDK2.0中,獲取並處理數據源介面步驟如下: Sensor -> Source -> Reader -> Frame -> Data (一)SensorIKinectSensor *pSensor=nullptr; //定義類指針GetDefaultKine ...
在Kinect for windows SDK2.0中,獲取並處理數據源介面步驟如下:
Sensor -> Source -> Reader -> Frame -> Data
(一)Sensor
IKinectSensor *pSensor=nullptr; //定義類指針
GetDefaultKinectSensor(&pSensor); //捕獲感測器
pSensor->Open(); //調用類函數Open(),打開Kinect
(二)Source
IDepthFrameSource *pFrameSource=nullptr;
pSensor->get_DefrrmeSource(&pFrameSource); //get source 存放在pFrameSource中
(三)
IDepthFrameReader *pReader=nullptr ; //Source是Kinect端擁有的,需要創建電腦端的介面Reader讀取
pFrameSource->get_OpenReader(&pFrameSource); //將pFrameSource中的數據讀取到pReader中
(四)Frame
IDepthFrame *pFrame=nullptr ; //Frame是真正存儲數據的類,每一次都讓Reader把數據讀到Frame類中
pFrameSource->AcquireLatestFrame(&pFrame) ; //獲取最新的數據,並且裝入另一個數據幀里。但是這個函數必須要判斷是否返回一個成功值,因為獲取失敗的幾率非常高。
(五)處理數據
(如何從Frame類中獲得數據,請求Source和創建Reader對於每一個數據類型都是一模一樣的,但從Frame中提取信息則各有不同)
pFrame->AccessUnderlyingBuffer( &uBufferSize , &pBuffer)
//取到數據幀後,通過AccessUnderlyingBuffer()這個函數將數據複製到數組,這個函數有兩個參數,
第一個是個記錄大小的變數,第二個是個接受數據的數組指針,傳入後會分別返回數組的大小以及數據。
它傳入數組的數據代表的是那一個像素點上的物體距離感測器的位置。
讀取深度信息 示例代碼:
1 #include<iostream> 2 #include"Kinect.h" 3 using namespace std; 4 5 int main() 6 { 7 IKinectSensor *pSensor = nullptr; //1.get default Sensor 8 GetDefaultKinectSensor(&pSensor); 9 10 pSensor->Open(); //open sensor 11 12 IDepthFrameSource *pFrameSource = nullptr; //2.Get frame source 13 pSensor->get_DepthFrameSource(&pFrameSource); 14 15 IDepthFrameReader* pFrameReader = nullptr;//3.get frame reader 16 pFrameSource->OpenReader(&pFrameReader); 17 18 size_t uFrameCount = 0; 19 while (uFrameCount < 100) { // cirlce of 100 times 20 //4.get lastest frame 21 IDepthFrame *pFrame = nullptr; 22 23 if (pFrameReader->AcquireLatestFrame(&pFrame) == S_OK) { 24 25 int iWidth = 0, iHeight = 0; 26 IFrameDescription *pFrameDescription = nullptr; 27 pFrame->get_FrameDescription(&pFrameDescription); 28 pFrameDescription->get_Width(&iWidth); 29 pFrameDescription->get_Height(&iHeight); 30 pFrameDescription->Release(); 31 pFrameDescription = nullptr; 32 33 //get image buffer 34 UINT uBufferSize = 0; 35 UINT16* pBuffer = nullptr; 36 pFrame->AccessUnderlyingBuffer(&uBufferSize, &pBuffer); 37 38 //output depth value 39 int x = iWidth / 2, y = iHeight / 2; 40 size_t idx = x + iWidth * y; 41 cout << pBuffer[idx] << endl; 42 43 pFrame->Release(); 44 pFrame = nullptr; 45 46 ++uFrameCount; 47 48 } 49 } 50 51 pFrameReader->Release(); 52 pFrameReader = nullptr; 53 54 // 2b. release Frame source 55 pFrameSource->Release(); 56 pFrameSource = nullptr; 57 58 // 1c. Close Sensor 59 pSensor->Close(); 60 61 // 1d. Release Sensor 62 pSensor->Release(); 63 pSensor = nullptr; 64 65 return 0; 66 }