首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >新的Tango 3D重建API

新的Tango 3D重建API
EN

Stack Overflow用户
提问于 2016-06-03 20:00:29
回答 1查看 595关注 0票数 1

我使用新的3D重建API (MIRA版本)。我在调用Tango3DR_update函数时遇到了一个问题。当我设置与图像摄像机相关的参数(const Tango3DR_ImageBuffer * TANGO_3DR_INVALID * const Tango3DR_Pose image_pose,Tango3DR_CameraCalibration const *Tango3DR_CameraCalibration)时,它会返回校准代码。我已经检查了我的参数,它们似乎是正确的。当我在不带图像参数的情况下调用此函数时,它将正常工作...这是一个已知的bug吗?

提前感谢您的回答。

EN

回答 1

Stack Overflow用户

发布于 2016-06-22 19:07:19

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

我认为有两件事:

图像格式

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

ImageBufferManager和strides

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

这意味着要做

代码语言:javascript
复制
  color_image.stride = image_buffer->width;

而不是

代码语言:javascript
复制
  color_image.stride = image_buffer->stride

在创建Tango3DR_ImageBuffer时。

完整代码示例

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

代码语言:javascript
复制
  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看起来像这样

代码语言:javascript
复制
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_初始化如下(像素格式可能很重要)。

代码语言:javascript
复制
  TangoSupport_createImageBufferManager(
      TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP,
      image_width_,
      image_height_,
      &image_buffer_manager_
  );

我复制校准,如下所示:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37613844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档