Kinect V2入门之数据获取步骤
在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 }