2016-06-03 2 views
1

새로운 3D 재구성 API (MIRA 출시)를 사용합니다. Tango3DR_update 함수를 호출 할 때 문제가 있습니다. 이미지 카메라 (const Tango3DR_ImageBuffer * image * const Tango3DR_Pose image_pose, Tango3DR_CameraCalibration const * 보정)와 관련된 매개 변수를 설정하면 TANGO_3DR_INVALID 코드를 반환합니다. 내 매개 변수를 확인했는데 올바른 것으로 보입니다. 이미지 매개 변수없이이 함수를 호출하면 제대로 작동합니다 ... 알려진 버그입니까?New Tango 3D Reconstruction API

미리 답변 해 주셔서 감사합니다.

+0

는이 문제를 해결 적이 있습니까? nullptr 대신 이미지 버퍼를 추가하면 같은 오류가 발생합니다. – bashbug

+0

안녕하세요, Alex 님, 여기에 logcat을 첨부 할 수 있습니까? 더 많은 정보를 찾으려면 파일을 살펴보십시오. –

+0

다음과 같이 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

답변

1

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; 
} 
+0

또한 기본 OnFrameAvailable image_buffer를 사용하고 RGB로 변환하지 않았습니다. 포즈는 모두 유효합니다. 어쩌면 Tango3DR_CameraCalibration을 잘못 설정했을 수도 있습니다. 제발, 당신의 대답에 이것을 추가 할 수 있습니까? – bashbug

+0

좀 더 자세한 내용을 추가했습니다. 지원 라이브러리에서 ImageBufferManager를 실제로 사용하고 있는데 일부 이미지 형식 변환을 수행 할 수 있다고 생각합니다. 내가하는 일을 설명하기 위해 더 많은 코드를 추가했다. – Julien

+0

추가 정보를 제공해 주셔서 감사합니다. 스레드 안전을위한 지원 lib도 사용하고 있습니다. 카메라 보정 및 이미지 버퍼 구조가 비슷하게 설정됩니다. 나는 정말로 내가 무엇을 worng하고 있는지에 관해 모른다. Google 탱고는 API가 충분히 설명 할 수없는 한 예를 제공해야합니다. – bashbug