Android NDK용 증강 이미지 개발자 가이드

자체 앱에서 증강 이미지를 사용하는 방법을 알아봅니다.

기본 요건

계속하기 전에 기본 AR 개념ARCore 세션을 구성하는 방법을 이해해야 합니다.

이미지 데이터베이스 만들기

참조 이미지를 저장할 ArAugmentedImageDatabase를 만듭니다. 방법은 다음의 두 가지입니다.

  • 빈 데이터베이스 만들기
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
  • 이미지 데이터베이스 파일에서 읽습니다. util::LoadFileFromAssetManager에 관한 자세한 내용은 [AugmentedImage C 샘플 앱] 을 참고하세요.
std::string database_buffer;
util::LoadFileFromAssetManager(asset_manager_, "sample_database.imgdb",
                               &database_buffer);
uint8_t* raw_buffer = reinterpret_cast<uint8_t*>(&database_buffer.front());

ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
const ArStatus status = ArAugmentedImageDatabase_deserialize(
    ar_session, raw_buffer, database_buffer.size(),
    &ar_augmented_image_database);

데이터베이스 파일은 이미지 도구를 사용하거나 ArAugmentedImageDatabase_serialize()를 호출하여 만들 수 있습니다.

데이터베이스에 이미지 추가

원하는 참조 이미지가 이미 데이터베이스 파일에서 로드된 경우에는 이 단계가 선택사항입니다. 런타임에 이미지를 추가하려면 아래와 같이 ArAugmentedImageDatabase_addImage()를 호출합니다. util 네임스페이스의 함수augmented_image_c 샘플 앱을 참고하세요.

int32_t width, height, stride, index;
uint8_t* image_pixel_buffer = nullptr;
constexpr const char kSampleImageName[] = "default.jpg";
bool load_image_result = util::LoadImageFromAssetManager(
    kSampleImageName, &width, &height, &stride, &image_pixel_buffer);

uint8_t* grayscale_buffer = nullptr;
util::ConvertRgbaToGrayscale(image_pixel_buffer, width, height, stride,
                             &grayscale_buffer);

int32_t grayscale_stride = stride / 4;
const ArStatus status = ArAugmentedImageDatabase_addImage(
    ar_session_, ar_augmented_image_database, kSampleImageName,
    grayscale_buffer, width, height, grayscale_stride, &index);

// If the physical size of the image is known, you can instead use
//     ArStatus ArAugmentedImageDatabase_addImageWithPhysicalSize
// This will improve the initial detection speed. ARCore will still actively
// estimate the physical size of the image as it is viewed from multiple
// viewpoints.

delete[] image_pixel_buffer;
delete[] grayscale_buffer;

indexname 값은 나중에 감지된 참조 이미지를 식별하는 데 사용됩니다.

이미지 추적 사용 설정

이미지 데이터베이스를 등록하여 이미지를 추적하도록 ARCore 세션을 구성합니다.

ArConfig_setAugmentedImageDatabase(ar_session_, ar_config,
                                   ar_augmented_image_database);
const ArStatus status = ArSession_configure(ar_session_, ar_config);

세션 중에 ARCore는 카메라 이미지의 지형지물 점을 사용하여 이미지 데이터베이스의 지형지물 점과 일치시킵니다.

AR 세션에서 증강 이미지 찾기

일치하는 이미지를 가져오려면 프레임 업데이트 루프에서 업데이트된 ArAugmentedImage를 폴링합니다.

// Update loop, in onDrawFrame
ArTrackableList* updated_image_list = nullptr;
ArTrackableList_create(ar_session_, &updated_image_list);
ArFrame_getUpdatedTrackables(
    ar_session_, ar_frame_, AR_TRACKABLE_AUGMENTED_IMAGE, updated_image_list);

int32_t image_list_size;
ArTrackableList_getSize(ar_session_, updated_image_list, &image_list_size);

for (int i = 0; i < image_list_size; ++i) {
  ArTrackable* ar_trackable = nullptr;
  ArTrackableList_acquireItem(ar_session_, updated_image_list, i,
                              &ar_trackable);
  ArAugmentedImage* image = ArAsAugmentedImage(ar_trackable);

  ArTrackingState tracking_state;
  ArTrackable_getTrackingState(ar_session_, ar_trackable, &tracking_state);

  int image_index;
  ArAugmentedImage_getIndex(ar_session_, image, &image_index);

  if (tracking_state == AR_TRACKING_STATE_TRACKING) {
    util::ScopedArPose scopedArPose(ar_session_);
    ArAugmentedImage_getCenterPose(ar_session_, image,
                                   scopedArPose.GetArPose());

    ArAnchor* image_anchor = nullptr;
    const ArStatus status = ArTrackable_acquireNewAnchor(
        ar_session_, ar_trackable, scopedArPose.GetArPose(), &image_anchor);

    // For example, you can now render content at the image anchor, choosing
    // content based on the image index (or name).
  }
}

다양한 사용 사례 지원

ARCore가 증강 이미지를 감지하면 해당 증강 이미지의 Trackable를 만들고 ArTrackingStateTRACKING로, ArAugmentedImageTrackingMethodFULL_TRACKING로 설정합니다. 추적된 이미지가 카메라 화면 밖으로 이동하면 ARCore는 계속해서 ArTrackingStateTRACKING로 설정하지만 ArAugmentedImageTrackingMethodLAST_KNOWN_POSE로 변경하면서 이미지의 방향과 위치를 계속 제공합니다.

앱은 의도한 사용 사례에 따라 추적 상태와 추적 방법을 다르게 사용해야 합니다.

  • 이미지가 수정되었습니다. 고정된 이미지(즉, 움직이지 않을 것으로 예상되는 이미지)와 관련된 대부분의 사용 사례에서는 ArTrackingState를 사용하여 이미지가 감지되었는지, 위치가 알려졌는지 간단히 확인할 수 있습니다. ArAugmentedImageTrackingMethod는 무시해도 됩니다.

  • 이미지 이동 앱에서 움직이는 이미지를 추적해야 하는 경우 ArTrackingStateArAugmentedImageTrackingMethod를 모두 사용하여 이미지가 감지되었는지, 위치가 알려졌는지 확인합니다.

사용 사례 고정된 이미지 이미지 이동 중
벽에 걸린 포스터 버스 측면에 게재된 광고
다음과 같은 경우 포즈가 유효한 것으로 간주될 수 있습니다.
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING