Project Tango:Depthmap从XYZij数据转换

时间:2016-01-20 13:18:04

标签: google-project-tango

我目前正在尝试使用OpenCV过滤深度信息。出于这个原因,我需要将Project Tango的深度信息XYZij转换为深度图等图像。 (就像Microsoft Kinect的输出一样)不幸的是官方API lacking the ij part of XYZij。这就是我试图使用相机内在投影wich is explained in the official C API Dokumentation投影XYZ部分的原因。我目前的方法如下:

    float fx = static_cast<float>(ccIntrinsics.fx);
    float fy = static_cast<float>(ccIntrinsics.fy);
    float cx = static_cast<float>(ccIntrinsics.cx);
    float cy = static_cast<float>(ccIntrinsics.cy);

    float k1 = static_cast<float>(ccIntrinsics.distortion[0]);
    float k2 = static_cast<float>(ccIntrinsics.distortion[1]);
    float k3 = static_cast<float>(ccIntrinsics.distortion[2]);

    for (int k = 0; k < xyz_ij->xyz_count; ++k) {

        float X = xyz_ij->xyz[k][0];
        float Y = xyz_ij->xyz[k][1];
        float Z = xyz_ij->xyz[k][2];

        float ru = sqrt((pow(X, 2) + pow(Y, 2)) / pow(Z, 2));
        float rd = ru + k1 * pow(ru, 3) + k2 * pow(ru, 5) + k3 * pow(ru, 7);

        int x = X / Z * fx * rd / ru + cx;
        int y = X / Z * fy * rd / ru + cy;

        // drawing into OpenCV Mat in red
        depth.at<cv::Vec3b>(x, y)[0] = 240;

    }

enter image description here

可以在右下角看到生成的深度图。但似乎这个计算结果是线性表示......有没有人已经做过类似的事情? XYZ点是否已正确定位此投影?

1 个答案:

答案 0 :(得分:0)

我实际上找到了一个解决方案......就像在rgb-depth-sync-example中一样跳过失真计算。我的代码现在看起来像这样:

    float fx = static_cast<float>(ccIntrinsics.fx);
    float fy = static_cast<float>(ccIntrinsics.fy);
    float cx = static_cast<float>(ccIntrinsics.cx);
    float cy = static_cast<float>(ccIntrinsics.cy);

    int width = static_cast<int>(ccIntrinsics.width);
    int height = static_cast<int>(ccIntrinsics.height);

    for (int k = 0; k < xyz_ij->xyz_count; ++k) {

        float X = xyz_ij->xyz[k * 3][0];
        float Y = xyz_ij->xyz[k * 3][1];
        float Z = xyz_ij->xyz[k * 3][2];

        int x = static_cast<int>(fx * (X / Z) + cx);
        int y = static_cast<int>(fy * (Y / Z) + cy);

        uint8_t depth_value = UCHAR_MAX - ((Z * 1000) * UCHAR_MAX / 4500);

        cv::Point point(y % height, x % width);
        line(depth, point, point, cv::Scalar(depth_value, depth_value, depth_value), 4.5);

    }

工作的OpenCV结果如下所示:

enter image description here