0

我正在尝试使用 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 加载)

另外,谷歌在此页面底部提到使用最近邻过滤器获取密集深度图,Tango API 中是否有用于此的接口?或者有人会建议它的开源实现。

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

感谢您的任何建议!

4

1 回答 1

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

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

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

于 2015-05-11T15:24:20.683 回答