TLDR; 지원 라이브러리 ImageBufferManager
에는 스트라이드가있는 버그가 있습니다. Tango3DR_ImageBuffer
을 만들 때 color_image.stride = image_buffer->width;
을 수행하십시오. 내가 생각
두 가지가 있습니다 :
이미지 포맷
첫째, TANGO_HAL_PIXEL_FORMAT_YCrCb_420_SP
사용할 수 있는지 확인해야합니다. 지원 라이브러리의 ImageBufferManager
을 사용하면됩니다. 당신이 비록 지원 라이브러리 ImageBufferManager
를 사용하는 경우
ImageBufferManager와 진보
둘째, 캐치가있다. TangoSupport_getLatestImageBuffer
3DR 라이브러리가 좋아하지 않는 반환 된 이미지의 보폭을 초기화하지 못하는 것처럼 보입니다 (저는 0과 다른 매우 큰 값을가집니다). 원래 TangoImageBuffer
에서 OnColorAvailable
은 stride = 1280 (= image_width)이며 ImageBufferManager에서 이 반환 된 TangoImageBuffer에 해당 값이 문제를 해결하는 것으로 보입니다. 나는 이것이 ImageBufferManager
의 버그라고 생각합니다.
이것은 Tango3DR_ImageBuffer
작성시
color_image.stride = image_buffer->width;
대신
color_image.stride = image_buffer->stride
의 일을 의미한다.
전체 코드 예제
나는 내 Render
방법에 다음 코드 작업을 가지고 : 나는 지원 라이브러리에서 ImageManager를 사용하고
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);
. 그래서 내 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;
}
는이 문제를 해결 적이 있습니까? nullptr 대신 이미지 버퍼를 추가하면 같은 오류가 발생합니다. – bashbug
안녕하세요, Alex 님, 여기에 logcat을 첨부 할 수 있습니까? 더 많은 정보를 찾으려면 파일을 살펴보십시오. –
다음과 같이 create 함수를 사용하려고했습니다. Tango3DR_ImageBuffer * color_image = Tango3DR_ImageBuffer_create (1280, 720, TANGO_3DR_HAL_PIXEL_FORMAT_YCrCb_420_SP); color_image-> stride = yuv_buffer _-> stride; color_image-> timestamp = yuv_buffer _-> timestamp; memcpy (color_image-> data, yuv_buffer _-> data, 720 * 3/2 * 1280); 이제 알겠습니다 : E/tango : image_buffer.cc:27 알 수없는 픽셀 형식입니다. 아마도 올바른 방향을 가리키고 있을까요? – bashbug