Я пытаюсь сделать 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);
В методе Сохранить я пытаюсь обработать текстурирование:
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 и предоставив лучшие возвращаемые значения для недопустимых форматов изображений.
редактировать: Обнаружил еще одну ошибку с нашей стороны. Состояния API image_pose должны быть позой изображения, но наша реализация на самом деле ожидает позу устройства. Я открыл ошибку, и это будет исправлено в следующем выпуске (release-H).
Вы можете попытаться обойти это сейчас, передавая позу устройства, не умножая внешнюю калибровку от устройства к камере, хотя, конечно, это всего лишь временная полоса.
Других решений пока нет …