如何使用Tango3DR_updateTexture?

how to use Tango3DR_updateTexture?

我正在尝试制作 3DR 纹理,但它始终只使用纹理中的顶点颜色。

在每一帧上,我将帧存储为 PNG:

    RGBImage frame(t3dr_image, 4);
    std::ostringstream ss;
    ss << dataset_.c_str();
    ss << "/";
    ss << poses_.size();
    ss << ".png";
    frame.Write(ss.str().c_str());
    poses_.push_back(t3dr_image_pose);
    timestamps_.push_back(t3dr_image.timestamp);

在 Save 方法中,我正在尝试处理纹理:

1) 我从上下文中提取全网格

    Tango3DR_Mesh* mesh = 0;
    Tango3DR_Status ret;
    ret = Tango3DR_extractFullMesh(t3dr_context_, &mesh);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);

2) 使用提取的网格创建纹理上下文

    Tango3DR_ConfigH textureConfig;
    textureConfig = Tango3DR_Config_create(TANGO_3DR_CONFIG_TEXTURING);
    ret = Tango3DR_Config_setDouble(textureConfig, "min_resolution", 0.01);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);
    Tango3DR_TexturingContext context;
    context = Tango3DR_createTexturingContext(textureConfig, dataset.c_str(), mesh);
    if (context == nullptr)
        std::exit(EXIT_SUCCESS);
    Tango3DR_Config_destroy(textureConfig);

3) 使用我之前存储的数据调用 Tango3DR_updateTexture(这不起作用)

    for (unsigned int i = 0; i < poses_.size(); i++) {
        std::ostringstream ss;
        ss << dataset_.c_str();
        ss << "/";
        ss << i;
        ss << ".png";
        RGBImage frame(ss.str());
        Tango3DR_ImageBuffer image;
        image.width = frame.GetWidth();
        image.height = frame.GetHeight();
        image.stride = frame.GetWidth() * 3;
        image.timestamp = timestamps_[i];
        //data are for sure in this format
        image.format = TANGO_3DR_HAL_PIXEL_FORMAT_RGB_888;
        image.data = frame.GetData();
        ret = Tango3DR_updateTexture(context, &image, &poses_[i]);
        if (ret != TANGO_3DR_SUCCESS)
            std::exit(EXIT_SUCCESS);
    }

4) 纹理化网格

    ret = Tango3DR_Mesh_destroy(mesh);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);
    mesh = 0;
    ret = Tango3DR_getTexturedMesh(context, &mesh);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);

5) 保存为OBJ(结果贴图中只有顶点颜色的数据,为什么?)

    ret = Tango3DR_Mesh_saveToObj(mesh, filename.c_str());
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);
    ret = Tango3DR_destroyTexturingContext(context);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);
    ret = Tango3DR_Mesh_destroy(mesh);
    if (ret != TANGO_3DR_SUCCESS)
        std::exit(EXIT_SUCCESS);

所有方法返回TANGO_3DR_SUCCESS。

完整代码在这里:https://github.com/lvonasek/tango

感谢您联系我们并提供详细的代码分解。

错误在我们这边 - 该库当前不支持 RGB 纹理输入。它假设所有输入图像都是 YUV。我已经开了一张票来跟踪这个错误,我们将在下一个版本中修复它,方法是允许 RGB 输入并为无效图像格式提供更好的 return 值。

编辑:在我们这边发现了另一个错误。 API 状态 image_pose 应该是图像的姿态,但我们的实现实际上需要设备的姿态。我已经打开了一个错误,这将在下一个版本 (release-H) 中修复。

您现在可以尝试通过传递设备姿势而不乘以设备到相机的外部校准来解决这个问题,当然这只是临时创可贴。