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

Project Tango Point Cloud strange crash, and dense depth map

我正在尝试使用 Project Tango C API,但是如果使用以下代码

    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中是否有用于此的接口?或者有人会建议它的开源实现吗?

我也想知道 onXYZijAvailable 中是否有 "pull" 彩色图像 (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 不提供调用来填充没有深度样本的位置,这可能是因为有许多方法具有不同的权衡。 nearest neighbor search is a reasonable place to start. There is an interface to FLANN in OpenCV.

上的维基百科页面

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