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

자체 앱에서 증강 이미지를 사용하는 방법을 알아보세요.

기본 요건

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

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

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

  • 빈 데이터베이스 만들기
ArAugmentedImageDatabase* ar_augmented_image_database = NULL;
ArAugmentedImageDatabase_create(ar_session, &ar_augmented_image_database);
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로 설정합니다. ArAugmentedImageTrackingMethod에서 FULL_TRACKING 추적된 이미지가 카메라 뷰 밖으로 움직이더라도 ARCore는 계속해서ArTrackingState ~TRACKING 하지만ArAugmentedImageTrackingMethod ~LAST_KNOWN_POSE 계속해서 이미지의 방향과 위치를 제공합니다.

앱에서 의도된 사용 사례에 따라 추적 상태와 추적 메서드를 다르게 사용해야 합니다.

  • 고정 이미지. 고정된(즉, 이동할 것으로 예상되지 않은) 이미지가 포함된 대부분의 사용 사례는 ArTrackingState를 사용하여 이미지가 감지되었는지 여부와 위치가 알려진지 여부를 확인할 수 있습니다. ArAugmentedImageTrackingMethod는 무시할 수 있습니다.

  • 이미지 이동 앱에서 움직이는 이미지를 추적해야 한다면 ArTrackingStateArAugmentedImageTrackingMethod를 모두 사용하여 이미지가 감지되었는지 여부와 위치가 알려져 있는지 확인합니다.

사용 사례 고정 이미지 이미지 이동
벽에 걸린 포스터 버스 측의 광고
포즈는
유효한 것으로 간주될 수 있습니다.
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING