앱에서 증강 이미지를 사용하는 방법을 알아보세요.
기본 요건
계속 진행하기 전에 기본 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;
index
및 name
값은 나중에 감지된 참조 이미지를 식별하는 데 사용됩니다.
이미지 추적 사용 설정
이미지 데이터베이스를 등록하여 이미지를 추적하도록 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
로, ArAugmentedImageTrackingMethod
를 FULL_TRACKING
로 설정합니다. 추적된 이미지가 카메라 뷰에서 벗어나면 ARCore는 ArTrackingState
를 TRACKING
로 계속 설정하지만 이미지의 방향과 위치를 계속 제공하는 동시에 ArAugmentedImageTrackingMethod
를 LAST_KNOWN_POSE
로 변경합니다.
앱에서는 의도한 사용 사례에 따라 추적 상태와 추적 메서드를 다르게 사용해야 합니다.
고정 이미지. 제자리에 고정된(즉, 이동할 것으로 예상되지 않음) 이미지와 관련된 대부분의 사용 사례에서는
ArTrackingState
를 사용하여 이미지가 감지되었는지, 이미지의 위치가 알려져 있는지를 확인할 수 있습니다.ArAugmentedImageTrackingMethod
는 무시해도 됩니다.움직이는 이미지. 앱에서 움직이는 이미지를 추적해야 한다면
ArTrackingState
와ArAugmentedImageTrackingMethod
를 모두 사용하여 이미지가 감지되었는지, 이미지의 위치가 알려져 있는지를 확인합니다.
사용 사례 | 고정된 이미지 | 이미지 이동 중 |
---|---|---|
예 | 벽에 걸려 있는 포스터 | 버스 측면에 표시된 광고 |
포즈는 유효한 것으로 간주할 수 있습니다. |
ArTrackingState == TRACKING |
ArTrackingState == TRACKING
및 ArAugmentedImageTrackingMethod == FULL_TRACKING
|