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로, ArAugmentedImageTrackingMethodFULL_TRACKING로 설정합니다. 추적된 이미지가 카메라 뷰에서 벗어나면 ARCore는 ArTrackingStateTRACKING로 계속 설정하지만 이미지의 방향과 위치를 계속 제공하는 동시에 ArAugmentedImageTrackingMethodLAST_KNOWN_POSE로 변경합니다.

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

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

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

사용 사례 고정된 이미지 이미지 이동 중
벽에 걸려 있는 포스터 버스 측면에 표시된 광고
포즈는
유효한 것으로 간주할 수 있습니다.
ArTrackingState == TRACKING ArTrackingState == TRACKING

ArAugmentedImageTrackingMethod == FULL_TRACKING