一. 原因:需要使用kinect2.0的摄像头数据作处理跟踪,所以需要研究一下。
二. kinect摄像头有两个,但深度摄像头兼具有深度摄像头功能和红外摄像头功能。
深度摄像头分辨率:512X424,稳定距离:500mm-4000mm。‘
红外摄像头分辨率:512X424,距离远了,不行,这个跟红外光强度有关。
彩色摄像头分辨率:1920X1080.
三. 三种摄像头调用结构很相似,可参考sample下的,DepthBasics-D2D,ColorBasics-D2D,InfraredBasics-D2D。归类总结如下:
1. 声明三个类: 深度摄像头:IDepthFrame,红外摄像头:IInfraredFrame,彩色摄像头:IColorFrame
2. 初始化kinet,三个摄像头一样,函数InitializeDefaultSensor(),改成对应的类就行。
3. 帧刷新均在Update中
AcquireLatestFrame()为获得最近刷新帧;
get_FrameDescription()为获得帧信息;
pFrameDescription->get_Width(&nWidth);获得帧宽度;
pFrameDescription->get_Height(&nHeight);获得帧高度;
pDepthFrame->get_DepthMinReliableDistance(&nDepthMinReliableDistance);获得稳定深度最小距离,深度摄像头独有。
pDepthFrame->get_DepthMaxReliableDistance(&nDepthMaxDistance);获得稳定深度最大距离,深度摄像头独有。
AccessUnderlyingBuffer(&nBufferSize, &pBuffer);获得数据到内存中。这里获得的数据可以被我们调用所处理。
ProcessDepth(nTime, pBuffer, nWidth, nHeight, nDepthMinReliableDistance, nDepthMaxDistance);深度摄像头处理函数
4.重点讲下深度摄像头的处理:
while (pBuffer < pBufferEnd)
{
++pBuffer;数据地址加
USHORT depth = *pBuffer;获得单个深度数据,注意mm为单位。
if((depth〉500)&&(depth<1000))
{
sprintf(str, "%d;%d;%ld \n", col, row, depth);
fputs(str, f);//可以通过距离过滤不需要的深度数据,这里将500mm-1000mm的数据存入文件
}
}
其它摄像头同理可通过pBuffer获得图像数据,结合opencv做处理。
5.三摄像头显示效果
深度和彩色。深度摄像头对反光的物体侦测不到
红外摄像头,对黑色物体显示不出来,因为黑色吸收红外,所以看到个盒子。
总结:接下来可以使用这么多图像性息,来做很多事情了。