Project Tango Point Cloud奇怪的崩溃,以及密集的深度图

时间:2015-05-11 12:01:01

标签: android-ndk google-project-tango

我正在尝试使用Project Tango C API,但如果点云的数量超过〜6.5k(经过一些测试)后,应用程序崩溃且没有错误,并带有以下代码

    int width = mImageSource->getDepthImageSize().x;
    int height = mImageSource->getDepthImageSize().y;
    double fx = mImageSource->calib.intrinsics_d.projectionParamsSimple.fx;
    double fy = mImageSource->calib.intrinsics_d.projectionParamsSimple.fy;
    double cx = mImageSource->calib.intrinsics_d.projectionParamsSimple.px;
    double cy = mImageSource->calib.intrinsics_d.projectionParamsSimple.py;

    memset(inputRawDepthImage->GetData(MEMORYDEVICE_CPU), -1, sizeof(short)*width*height);
    for (int i = 0; i < XYZ_ij->xyz_count; i++) {
        float X = XYZ_ij->xyz[i*3][0];
        float Y = XYZ_ij->xyz[i*3][1];
        float Z = XYZ_ij->xyz[i*3][2];
        if (Z < EPSILON || (X < EPSILON && -X < EPSILON) || (Y < EPSILON && -Y < EPSILON) || X != X || Y != Y || Z != Z)
            continue;
        int x_2d = (int)(fx*X/Z+cx);
        int y_2d = (int)(fy*Y/Z+cy);
        if (x_2d >=0 && x_2d < width && y_2d >= 0 && y_2d < height && (x_2d != 0 || x_2d != 0)) {
            inputRawDepthImage->GetData(MEMORYDEVICE_CPU)[x_2d + y_2d*width] = (short) (Z*1000);
        } else {
            continue;
        }
    }

但是,如果我使用for (int i = 0; i < XYZ_ij->xyz_count && i < 6500; i++),一切正常。我只是想知道是否存在使用C API的接入点云的上限,或者我做错了什么?

(宽度为320,高度为180,其他内在函数从Tango API加载)

此外,Google提到使用最近邻滤镜来获取bottom of this page中的密集深度贴图,Tango API中是否有这样的接口?或者有人会建议开源实现。

我也想知道是否还有&#34;拉&#34; onXYZijAvailable中的彩色图像(1280x720),因为我需要一个密集的同步彩色点云。我是否需要应用外部矩阵来对齐两个坐标系,或者我只需要对彩色图像进行二次采样(假设它们的坐标系是相同的)?

感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

在查找深度样本坐标的代码中......

for (int i = 0; i < XYZ_ij->xyz_count; i++) {
    float X = XYZ_ij->xyz[i*3][0];
    float Y = XYZ_ij->xyz[i*3][1];
    float Z = XYZ_ij->xyz[i*3][2];

...您应该使用i的索引,而不是i*3。它是一个2D阵列,因此您不必自己管理更高维度的步幅。

SDK不提供填充没有深度样本的位置的调用,可能是因为有许多方法具有不同的权衡。 nearest neighbor search上的维基百科页面是一个合理的起点。 FLANN中有一个OpenCV的界面。

SDK只会向您提供最新的彩色图像。如果您需要先前的图像(例如,时间戳接近您的深度样本),您将需要自己管理。因为你永远无法在与深度样本完全相同的时间戳上获得彩色图像(因为相同的相机在两种模式下都使用不同的模式),理论上你应该应用外在姿势来对齐它们。实际上,如果动作在时间戳之间的0.5帧或更短时间内很小,我想大多数人都会忽略它。