新Tango 3D重建API

时间:2016-06-03 12:00:29

标签: google-project-tango

我使用新的3D重建API(MIRA版本)。调用Tango3DR_update函数时出现问题。当我设置与图像相机相关的参数时,它返回TANGO_3DR_INVALID代码(const Tango3DR_ImageBuffer * image * const Tango3DR_Pose image_pose,Tango3DR_CameraCalibration const * calibration)。我检查了我的参数,它们似乎是正确的。当我在没有图像参数的情况下调用此函数时,这可以正常工作......这是一个已知的错误吗?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:1)

TLDR; 支持库ImageBufferManager有一个步幅错误。在创建color_image.stride = image_buffer->width;时执行Tango3DR_ImageBuffer

我认为有两件事:

图片格式

首先,您必须确保使用TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP。您可以使用支持库中的ImageBufferManager来完成此操作。

ImageBufferManager并跨步

其次,如果您使用支持库ImageBufferManager,则会有一个问题。 TangoSupport_getLatestImageBuffer似乎无法初始化返回图像的步幅(我得到0和其他一些非常大的值),这是3DR库不喜欢的。来自TangoImageBuffer的原始OnColorAvailable具有stride = 1280(= image_width)并且在TangoImageBuffer上强制返回该值 从ImageBufferManager似乎解决了这个问题。我相信这是ImageBufferManager中的错误。

这意味着要做

  color_image.stride = image_buffer->width;

而不是

  color_image.stride = image_buffer->stride

创建Tango3DR_ImageBuffer时。

完整代码示例

我在Render方法中使用了以下代码:

  TangoImageBuffer* image_buffer;
  ret = TangoSupport_getLatestImageBuffer(
      image_buffer_manager_, &image_buffer);
  if (ret != TANGO_SUCCESS) {
    LOG(ERROR) << "Error in TangoSupport_getLatestImageBuffer";
  }

  ...

  Tango3DR_ImageBuffer color_image;
  color_image.width = image_buffer->width;
  color_image.height = image_buffer->height;
  // VERY Important - The support library ImageBufferManager seems to have
  // a bug where it will always put the stride of the returned buffer
  // at 0, which causes 3DR to fail
  color_image.stride = image_buffer->width;
  color_image.timestamp = image_buffer->timestamp;
  color_image.format = (Tango3DR_ImageFormatType)image_buffer->format;
  color_image.data = image_buffer->data;

  ret = Tango3DR_update(
    tango_3dr_context_,
    &cloud,
    &depth_pose_3dr,
    &color_image,
    &color_pose_3dr,
    &tango_3dr_calibration_,
    &updated_indices);

我正在使用支持库中的ImageManager。所以我的OnColorAvailable看起来像那样

void SynchronizationApplication::OnColorAvailable(
    const TangoImageBuffer* buffer) {
  if (tango_3dr_enabled_ && tango_3dr_use_color_) {
    TangoErrorType ret = TangoSupport_updateImageBuffer(
      image_buffer_manager_, buffer);
    if (ret != TANGO_SUCCESS) {
      LOG(ERROR) << "Error in TangoSupport_updatePointCloud";
    }
  }
}

image_buffer_manager_初始化如下(像素格式可能很重要)。

  TangoSupport_createImageBufferManager(
      TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP,
      image_width_,
      image_height_,
      &image_buffer_manager_
  );

我正在复制校准如下:

void CopyCalibrationTangoTo3DR(const TangoCameraIntrinsics& tango,
                               Tango3DR_CameraCalibration* out) {
  out->calibration_type =
    (Tango3DR_TangoCalibrationType)tango.calibration_type;
  out->cx = tango.cx;
  out->cy = tango.cy;
  memcpy(out->distortion, tango.distortion, sizeof(double) * 5);
  out->fx = tango.fx;
  out->fy = tango.fy;
  out->height = tango.height;
  out->width = tango.width;
}