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