作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试制作 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。
最佳答案
感谢您联系我们并提供详细的代码分解。
错误在我们这边——库目前不支持 RGB 纹理输入。它假设所有输入图像都是 YUV。我已经开了一张票来跟踪这个错误,我们将在下一个版本中修复它,方法是允许 RGB 输入并为无效图像格式提供更好的返回值。
编辑:在我们这边发现了另一个错误。 API 声明 image_pose 应该是图像的姿势,但我们的实现实际上需要设备的姿势。我已经发现了一个错误,这将在下一个版本 (release-H) 中修复。
您现在可以通过传入设备姿势而不乘以设备到相机的外部校准来尝试解决这个问题,尽管这当然只是临时创可贴。
关于android - 如何使用Tango3DR_updateTexture?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43133242/
我是一名优秀的程序员,十分优秀!