Android ndk 项目探戈点云奇怪的崩溃,和密集的深度图

Android ndk 项目探戈点云奇怪的崩溃,和密集的深度图,android-ndk,google-project-tango,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.projectionP

我正在尝试使用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;
        }
    }
但是,如果我使用int I=0;iXYZ_计数和&i<6500;我觉得一切都很好。我只是想知道使用C API的接入点云是否有一个上限,或者我做错了什么

宽度为320,高度为180,其他内部函数从TangoAPI加载

此外,谷歌提到使用最近邻过滤器来获取密集深度图,TangoAPI中是否有用于此的接口?或者有人会建议它的开源实现吗

我还想知道是否有任何方法可以在onXYZijAvailable中提取彩色图像1280x720,因为我需要一个密集的同步彩色点云。我是否需要应用外部矩阵来对齐两个坐标系,或者我只需要对彩色图像进行子采样,假设它们的坐标系相同


谢谢你的建议

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

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。它是一个二维阵列,因此您不必自己管理更高维度的步幅

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


SDK将只向您提供最新的彩色图像。如果您想要一个先前的图像,例如,具有接近深度样本的时间戳,您必须自己管理该图像。由于在两种模式下使用相同的摄影机时,无法获得与深度采样完全相同的时间戳的彩色图像,因此理论上应该应用外部姿势来对齐它们。实际上,如果在时间戳之间的0.5帧时间内运动很小,我想大多数人都会忽略它。

非常感谢。我试图通过预乘1,0,0使用Tangopa;0, 0, -1; 0,1,0表示旋转矩阵,旋转矩阵由四元数组成,tx,tz,-ty表示平移。然而,这种跟踪信息似乎与深度数据不一致。