Kinect从任意角度获得深度像素?

时间:2013-07-08 08:59:23

标签: openframeworks ofxkinect

是否有可能以某种方式从不同角度的kinect获取深度像素?就像说kinect从上面录制我一样,我想从前面看到我的深度像素?

我已经看过人们使用点云的示例,并且可以从该数据中旋转创建的网格(从这些点),即使kinect是,例如,从上面记录下来的人仍可以使用这些点云旋转从前面或脚下看到的网状物(非常酷!)。

那么我也许可以从点云中创建自己的深度像素?任何指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

好吧,我以一种非常丑陋的方式解决了这个问题。至少这是我的想法。如果其他人有更好的主意,请发布!

所以我所做的是从点云创建网格(如在ofxKinect示例中所见)将其绘制到FBO并将其包裹在着色器上,该着色器为片段的深度值着色。这样我就可以得到[0-1]的彩色范围。

之后,回到CPU上,我能够使用readToPixels从FBO获取像素,并将这些像素绘制到ofImage。从图像中我可以为图像上的每个像素采样颜色(现在处于灰度级范围内)。

叹息,现在,循环遍历每个像素x&我检查每个像素的颜色并获取该值并进行一些计算以查看该彩色值位于0-255范围内的位置(如常规kinect.getDepthPixels(...)数据):

int size = sizeof(unsigned char) * ( ofGetHeight() * ofGetWidth() );
unsigned char* p = (unsigned char*)malloc(size);
for (int x = 0; x < ofGetWidth(); x++)
{
    for (int y = 0; y < ofGetHeight(); y++)
    {
        ofColor col = sampleImg.getColor(x, y);
        float d = 0.0f;

        if (col.a != 0)
        {
            d = (float)(col.r * 3) / 765.0f;
            d = d * 255.0f;
        }

        int id = (y*1) + x;
        p[id] = d;
    }
}

p 我得到一个unsigned char数组,其值为[0-255],类似于kinect.getDepthPixels()函数,但是基于深度纹理,我现在拥有来自的深度数据点云。

这尚未经过全面测试,但我认为这是朝着正确方向迈出的一步。而且我不太喜欢这个解决方案,但我希望它可以帮助别人,因为我一整天都在疯狂地搜索疯狂而没有多少帮助。我可能只是为我复杂的事情,但我们会看到。