我想利用Kinect 2.0 SDK的深度传感器,但不是从图像的格式中绘制或显示这些数据,而是整数或类似的东西。一个例子是如果我的手非常接近Kinect,我会得到一个整数值告诉我大约相机和障碍物之间的距离。 也许这样的事情。当障碍物移动时,Kinect会重新计算距离,并且可能每隔一秒或半秒更新一次。
The distance between the kinect and the obstacle is 20 cm
The distance between the kinect and the obstacle is 10 cm
The distance between the kinect and the obstacle is 100 cm
这可能吗? 我搜索了教程,但我能找到的是表示通常使用点云或黑白深度图像。
答案 0 :(得分:2)
Kinect确实使用点云。点云中的每个像素都有一个无符号的短整数值,表示距离Kinect的距离(mm)。从我可以看出,相机已经能够补偿或反射到其视图的侧面更远,然后在前面是什么,所以所有数据表示这些物体远离Kinects相机正在观看的平面的深度。 Kinect可以查看大约8米,但只有4-5米之间的可靠数据,并且看不到任何接近0.5米的数据。 由于它听起来像是将其用作障碍物检测系统,因此我建议监控点云中的所有数据点,并对与其他数据点分开的分组数据点进行平均,并将它们解释为具有近似距离的自己的对象。 Kinect还以每秒30帧的速度更新(假设您的硬件可以处理密集型数据流)。因此,您只需持续监控点云,即可改变距离。
如果您首先下载SDK和Kinect Studio,您可以使用深度/ IR编程示例和工作室来更好地理解数据的使用方式。
答案 1 :(得分:2)
尽管前一段时间已经提出过这个问题并且提问的人最有可能通过他自己解决这个问题,但我只是想给其他可能有相同问题/问题C ++代码的人解决这个问题。
注意:该解决方案基于Kinect 2.0 SDK,如果我没记错的话,我是从Kengct 2.0 SDK附带的SDK Browser 2.0中提供的一个示例中获得的。我删除了我已完成的所有特殊修改,只留下了最重要的方面(因此,您很可能必须修改void
并为其提供某种返回参数。)
m_pDepthFrameReader
已初始化为IDepthFrameReader*
void KinectFusionProcessor::getDistance() {
IDepthFrame* frame = NULL;
if (SUCCEEDED(m_pDepthFrameReader->AcquireLatestFrame(&frame))) {
int width = 512;
int height = 424;
unsigned int sz=(512*424);
unsigned short buf[525 * 424] = {0};
frame->CopyFrameDataToArray(sz,buf);
const unsigned short* curr = (const unsigned short*)buf;
const unsigned short* dataEnd = curr + (width*height);
while (curr < dataEnd) {
// Get depth in millimeters
unsigned short depth = (*curr++);
}
}
if (frame) frame->Release();
}
答案 2 :(得分:1)
这非常简单。我不知道C++
中的确切代码,但在C#中,一旦有了深度框架,就需要执行以下操作:
我假设您已经知道Y和X指向您要评估深度值的位置。
一旦你知道,你需要先将深度帧的每个字节转换成ushort。
之后,您需要计算与X和Y点对应的depthPixels内的索引。通常这是使用的等式:
// Get the depth for this pixel
ushort depth = frameData[y * depthFrameDescription.Height + x];
我希望这会有所帮助。