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를 만듭니다. 증강 이미지 및 설정 ArTrackingState TRACKING~FULL_TRACKING에서 ArAugmentedImageTrackingMethod 추적된 이미지가 ARCore가 카메라 뷰에서 벗어나면 TRACKING까지 ArTrackingState, ArAugmentedImageTrackingMethod를 변경하여 클러스터의 방향과 위치를 계속 제공하면서 LAST_KNOWN_POSE에 이미지

앱에서는 사용 목적에 따라 추적 상태와 추적 방법을 다르게 사용해야 합니다. 있습니다.

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

  • 움직이는 이미지. 앱에서 움직이는 이미지를 추적해야 하는 경우 ArTrackingStateArAugmentedImageTrackingMethod는 이미지가 이미지 콘텐츠 감지되어 그 위치가 알려진지 여부를 알려줍니다.

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

ArAugmentedImageTrackingMethod == FULL_TRACKING