자체 앱에서 증강 이미지를 사용하는 방법을 알아봅니다.
기본 요건
계속하기 전에 기본 AR 개념과 ARCore 세션을 구성하는 방법을 이해해야 합니다.
이미지 데이터베이스 만들기
각 이미지 데이터베이스는 최대 1,000개의 이미지에 대한 정보를 저장할 수 있습니다.
AugmentedImageDatabase를 만드는 방법에는 두 가지가 있습니다.
- 저장된 이미지 데이터베이스 로드 그런 다음 원하는 경우 참조 이미지를 추가합니다.
- 새 빈 데이터베이스를 만듭니다. 그런 다음 참조 이미지를 한 번에 하나씩 추가합니다.
저장된 이미지 데이터베이스 로드
AugmentedImageDatabase.deserialize()를 사용하여 기존 이미지 데이터베이스를 로드합니다.
자바
AugmentedImageDatabase imageDatabase; try (InputStream inputStream = this.getAssets().open("example.imgdb")) { imageDatabase = AugmentedImageDatabase.deserialize(session, inputStream); } catch (IOException e) { // The Augmented Image database could not be deserialized; handle this error appropriately. }
Kotlin
val imageDatabase = this.assets.open("example.imgdb").use { AugmentedImageDatabase.deserialize(session, it) }
이미지 데이터베이스는 개발 중에 arcoreimg 명령줄 도구를 사용하거나 메모리에 로드된 이미지가 포함된 데이터베이스에서 AugmentedImageDatabase.serialize()를 호출하여 만들 수 있습니다.
새 빈 데이터베이스 만들기
런타임에 빈 이미지 데이터베이스를 만들려면 AugmentedImageDatabase 생성자를 사용합니다.
자바
AugmentedImageDatabase imageDatabase = new AugmentedImageDatabase(session);
Kotlin
val imageDatabase = AugmentedImageDatabase(session)
기존 데이터베이스에 이미지 추가
각 이미지에 대해 AugmentedImageDatabase.addImage()를 호출하여 이미지 데이터베이스에 이미지를 추가하고 선택사항인 widthInMeters를 지정합니다.
자바
Bitmap bitmap; try (InputStream bitmapString = getAssets().open("dog.jpg")) { bitmap = BitmapFactory.decodeStream(bitmapString); } catch (IOException e) { // The bitmap could not be found in assets; handle this error appropriately. throw new AssertionError("The bitmap could not be found in assets.", e); } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. float imageWidthInMeters = 0.10f; // 10 cm int dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters);
Kotlin
val bitmap = assets.open("dog.jpg").use { BitmapFactory.decodeStream(it) } // If the physical size of the image is not known, use addImage(String, Bitmap) instead, at the // expense of an increased image detection time. val imageWidthInMeters = 0.10f // 10 cm val dogIndex = imageDatabase.addImage("dog", bitmap, imageWidthInMeters)
반환된 색인은 나중에 감지된 참조 이미지를 식별하는 데 사용할 수 있습니다.
이미지 추적 사용 설정
세션 구성을 원하는 이미지 데이터베이스로 구성된 구성으로 설정하여 이미지 추적을 시작하도록 ARCore 세션을 구성합니다.
자바
Config config = new Config(session); config.setAugmentedImageDatabase(imageDatabase); session.configure(config);
Kotlin
val config = Config(session) config.augmentedImageDatabase = imageDatabase session.configure(config)
세션 중에 ARCore는 카메라 이미지의 특징점을 이미지 데이터베이스의 특징점과 일치시켜 이미지를 찾습니다.
일치하는 이미지를 가져오려면 프레임 업데이트 루프에서 업데이트된 AugmentedImage를 폴링합니다.
자바
Collection<AugmentedImage> updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage.class); for (AugmentedImage img : updatedAugmentedImages) { if (img.getTrackingState() == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. switch (img.getTrackingMethod()) { case LAST_KNOWN_POSE: // The planar target is currently being tracked based on its last // known pose. break; case FULL_TRACKING: // The planar target is being tracked using the current camera image. break; case NOT_TRACKING: // The planar target isn't been tracked. break; } // You can also check which image this is based on img.getName(). if (img.getIndex() == dogIndex) { // TODO: Render a 3D version of a dog in front of img.getCenterPose(). } else if (img.getIndex() == catIndex) { // TODO: Render a 3D version of a cat in front of img.getCenterPose(). } } }
Kotlin
val updatedAugmentedImages = frame.getUpdatedTrackables(AugmentedImage::class.java) for (img in updatedAugmentedImages) { if (img.trackingState == TrackingState.TRACKING) { // Use getTrackingMethod() to determine whether the image is currently // being tracked by the camera. when (img.trackingMethod) { AugmentedImage.TrackingMethod.LAST_KNOWN_POSE -> { // The planar target is currently being tracked based on its last known pose. } AugmentedImage.TrackingMethod.FULL_TRACKING -> { // The planar target is being tracked using the current camera image. } AugmentedImage.TrackingMethod.NOT_TRACKING -> { // The planar target isn't been tracked. } } // You can also check which image this is based on AugmentedImage.getName(). when (img.index) { dogIndex -> TODO("Render a 3D version of a dog at img.getCenterPose()") catIndex -> TODO("Render a 3D version of a cat at img.getCenterPose()") } } }
다양한 사용 사례 지원
ARCore가 증강 이미지를 감지하면 해당 증강 이미지의 Trackable를 만들고 TrackingState를 TRACKING로, TrackingMethod를 FULL_TRACKING로 설정합니다. 추적된 이미지가 카메라 화면 밖으로 이동하면 ARCore는 이미지의 방향과 위치를 계속 제공하면서 TrackingMethod를 LAST_KNOWN_POSE로 변경합니다.
앱은 의도한 사용 사례에 따라 이러한 열거형을 다르게 사용해야 합니다.
이미지가 수정되었습니다. 고정된 이미지(즉, 움직이지 않을 것으로 예상되는 이미지)와 관련된 대부분의 사용 사례에서는
TrackingState를 사용하여 이미지가 감지되었는지, 위치가 알려졌는지 간단히 확인할 수 있습니다.TrackingMethod는 무시해도 됩니다.이미지 이동 앱에서 움직이는 이미지를 추적해야 하는 경우
TrackingState및TrackingMethod를 모두 사용하여 이미지가 감지되었는지, 위치가 알려졌는지 확인합니다.
| 사용 사례 | 고정된 이미지 | 이미지 이동 중 |
|---|---|---|
| 예 | 벽에 걸린 포스터 | 버스 측면에 게재된 광고 |
| 다음과 같은 경우 포즈가 유효한 것으로 간주될 수 있습니다. |
TrackingState == TRACKING |
TrackingState == TRACKING
및 TrackingMethod == FULL_TRACKING
|
참고 항목
ARCore SDK의 증강 이미지 샘플 프로젝트