[iOS] Object Capture 사용하기

2025. 12. 8. 14:44·Apple/iOS
728x90
반응형

안녕하세요! 피피아노입니다 🎵

 

WWDC23에서 공개된 iOS용 Object Capture를 이용해서 기존에 Mac에서만 사용할 수 있었던 Object Capture API를 이제 iOS에서도 경험할 수 있게 되었습니다.

 

Object Capture 주요 개선 사항

iOS용 Object Cature API를 살펴보기 전에 새롭게 추가되거나 개선된 부분을 살펴보면, iPhone이나 iPad에 있는 LiDAR 센서를 통해 더 많은 물체를 지원한다는 점입니다.

 

기존에는 충분한 텍스처 디테일이 있는 물체에 최적화되어 있었지만, LiDAR Scanner를 이용하여 의자나 가구처럼 텍스처 디테일이 부족한 물체의 재구성 품질을 향상시켰다고 합니다.

 

작동 원리는 RGB 이미지 외에 LiDAR는 물체의 3D 모양에 대한 포괄적인 재현을 가능하게 하는 포인트 클라우드 데이터를 수집합니다. 그리고 이 수집한 데이터를 RGB 이미지와 융합해서 최종 3D 모델을 생성한다고 합니다.

 

하지만 여전히 유리같이 빛을 반사하거나 투명한 물체, 그리고 아주 얇은 구조를 가진 물체는 사용하기 어렵다고 합니다.

 

그리고 Guided Capture가 추가되었습니다. Guided Capture는 사용자에게 실시간 피드백을 제공하며 데이터 캡처 과정을 단순화하고 자동화해줍니다.

 

Guided Capture의 주요 특징은 아래와 같습니다.

    • 자동 캡처: 사용자가 물체 주변을 천천히 돌면, 시스템이 자동으로 선명도, 노출 등이 좋은 이미지를 선별하고 캡처합니다.
    • 캡처 다이얼: 물체의 어떤 영역이 적절한 이미지를 보여주는지 시각적으로 알려주는 캡처 다이얼을 제공하여 모든 디테일을 놓치지 않도록 돕습니다.
    • 실시간 피드백:
      • 조명: 너무 어두울 경우 알림을 제공하고, 빛 반사를 최소화하기 위해 빛 분산 사용을 권장합니다.
      • 흔들림: 너무 빨리 움직이면 자동 캡처가 중단되고 속도를 늦추라고 알려줍니다.
      • 거리: 카메라와 물체 사이의 거리가 너무 멀거나 가까우면 텍스트 알림창이 나타납니다.
      • 프레임 유지: 물체가 시야 범위를 벗어나면 화살표 심벌로 방향 조절을 안내합니다.

 

그리고 이제 iOS 기기에서 이미지 캡처와 모델 재구성을 모두 수행할 수 있습니다.(iOS 17 이상, iPhone 12 Pro, iPad Pro 2021 이후 모델)

 

모바일 기기에서 최적화된 모델 생성을 위해 축소된 디테일 레벨(Reduced Detail Level)만 제공합니다. (Mac에서는 더 높은 디테일 레벨 선택 가능합니다.)

 

Object Capture API

Object Capture API가 어떤 과정으로 이루어지는지 살펴보겠습니다.

 

Object Capture에는 이미지 캡처와 모델 재구성 이렇게 2단계가 있습니다. 

 

이미지 캡처는 두 부분이 있는데 하나의 세션과 SwiftUI 뷰 입니다.

 세션은 이미지 캡처가 진행되는 동안 상태 기계의 흐름을 관찰하고 통제하게 합니다. 

SwiftUI 뷰는 카메라 피드를 보여주고 카메라 피드가 보여주는 UI 요소를 세션 상태를 기반으로 자동 적응시킵니다. 그리고 해당 뷰에 관련 UI 요소를 커스터마이징해서 사용자에게 제공할 수 있습니다.

 

 

Object Capture는 Initalizing, Ready, Detecting, Capturing, Finishing, Completed 단계로 진행됩니다.

 

Object Capture API 사용 방법

Object Capture를 앱에 통합하는 과정은 크게 이미지 캡처(Image Capture)와 모델 재구성(Model Reconstruction)의 두 부분으로 나뉩니다.

이미지 캡처 API 사용하기

Object Capture의 이미지 캡처는 ObjectCaptureSession과 ObjectCaptureView를 중심으로 진행됩니다.

 

세션 생성 및 시작

우선 가장 먼저 프로젝트 파일에 RealityKit과 SwiftUI를 임포트합니다.

 

그리고 ObjectCaptureSession 객체를 생성해줍니다. 해당 객체가 만들어지면 Initalizing 상태로 시작됩니다.

import SwiftUI
import RealityKit

var session: ObjectCaptureSession()

애플은 ObjectCaptureSession 인스턴스는 참조형이다보니 세션이 완료될 때까지 이 세션을 유지 상태의 지상 실측 데이터 모델 내부에 저장할 것을 권장한다고 합니다. 

var configuration = ObjectCaptureSession.Configuration()
configuration.checkpointDirectory = getDocumentsDir().appendingPathComponent("Snapshots/")

session.start(imagesDirectory: getDocumentsDir().appendingPathComponent("Images/"),
              configuration: configuration)

그리고 세션에게 캡처된 이미지를 어디에 저장할지 말해주는 디렉토리와 함께 start() 함수를 호출하여 계속 진행합니다.

환경 설정 안에 체크 포인트 디렉토리를 제공해 추후 재구성 과정 속도를 빠르게 할 때도 사용 가능하다고 합니다. 세션은 이 호출 이후 준비 상태로 이동합니다. 다음은 ObjectCaptureView로 이 세션을 사용하는 방식입니다.

ObjectCaptureView 통합

ObjectCaptureView는 카메라 피드를 보여주고 세션 상태에 따라 UI 요소를 자동으로 조정합니다. 

이건 다른 SwiftUI 뷰처럼 사용하면 됩니다. 다른 뷰의 body 안에 배치해서 우리가 방금 만든 세션에 보내고, ObjectCaptureView는 항상 세션의 현재 상태에 일치하는 UI를 보여줍니다.

세션에서는 현재 상태를 실시간으로 변화시켜주기 때문에 SwiftUI body에 현재 상태에 적절한 UI를 그려줘야 합니다.

여기서는 ObjectCaptureView 위에 'Continue' 버튼을 그려줬는데 , 버튼을 누르면 startDetecting() 함수를 호출해 바운딩 박스 감지 상태(Detecting)로 이동합니다.

Detecting 상태가 되면 인식할 수 있는 물체를 감지하고, 감지가 된 물체는 위 사진처럼 바운딩 박스를 보여줍니다.

필요할 경우 사용자가 바운딩 박스의 크기와 방향은 직접 조절할 수 있습니다.

물체 선정이 완료되었다면 Ready 상태에서 Detecting 모드로 넘어가게 했던 Continue 버튼처럼 캡처를 시작하라고 세션에 말해주는 버튼을 제공해주어야 합니다. 세션은 이 호출 이우 캡처 상태로 이동하고 세션은 캡처 상태에서 물체 주변을 천천히 돌 때 자동으로 이미지를 찍습니다.

ObjectCaptureView에서는 포인트 클라우드와 캡처 다이얼을 제공해주어서 사용자가 어디로 이동해서 물체에 대한 데이터를 더 수집해야 하는지를 알려줍니다. 

 

캡처 다이얼이 완성되면 세션은 userCompletedScanPass 프로퍼티를 true로 설정합니다. 여기서 세션을 끝낼지 아니면 더 많은 이미지를 계속 캡처할지 선택권을 줍니다.

 

물체를 더 다양하게 자세히 캡처하고 싶다면 beginNewScanPassAfterFlip()을 호출해서 물체를 뒤집어서 스캔하도록할 수 있습니다. 만약 물체를 뒤집어서 촬영할 필요가 없다면 beginNewScanPass()를 호출해서 다양한 높이에서 이미지를 더 찍게 할 수 있습니다.

모든 과정이 마무리가 되면 완료 버튼을 제공해줍니다. 이 버튼은 finish() 함수를 호출해주고 세션의 상태를 Finishing 상태로 변경해줍니다.

 

완료 상태에 있으면 세션은 모든 데이터가 저장되기를 기다립니다. 세션은 일단 완료되면 자동으로 완성 상태로 넘어가게됩니다.

그럼 이걸 해체하고 온디바이스 재구성을 시작할 수 있습니다.

 

이미지 디렉토리가 갑자기 이용 불가할 때처럼 복구 불가한 오류가 발생할 경우도 있습니다. 그럼 세션은 Failed 상태로 전환합니다.


감사합니다.

 

잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!

궁금하신 부분은 댓글로 질문 부탁드립니다!

728x90
반응형

'Apple > iOS' 카테고리의 다른 글

[iOS] TCA(The Composable Architecture) 입문기  (1) 2025.11.24
[iOS] Object Capture: 온디바이스 3D 모델 제작하기  (1) 2025.09.11
[iOS/CoreML] Core ML로 구현하는 온디바이스 AI  (2) 2025.05.11
[iOS] CocoaPods 알아보기  (8) 2024.08.13
[iOS] Live Activity 알아보기  (0) 2024.08.09
'Apple/iOS' 카테고리의 다른 글
  • [iOS] TCA(The Composable Architecture) 입문기
  • [iOS] Object Capture: 온디바이스 3D 모델 제작하기
  • [iOS/CoreML] Core ML로 구현하는 온디바이스 AI
  • [iOS] CocoaPods 알아보기
P_Piano
P_Piano
Apple 생태계 개발자가 되기 위한 학습과 경험의 기록
    반응형
    250x250
  • P_Piano
    피피아노의 개발 일지
    P_Piano
  • 전체
    오늘
    어제
    • 분류 전체보기 (220)
      • Apple (138)
        • iOS (25)
        • visionOS (5)
        • Swift (71)
        • UIKit (2)
        • SwiftUI (25)
        • RxSwift (2)
        • Xcode (5)
        • Metal (2)
      • C언어 (5)
      • C++ (8)
      • Dart (1)
      • Python (3)
      • JavaScript (17)
      • Git (1)
      • CS (39)
        • 디자인 패턴 (6)
        • 네트워크 (20)
        • 운영체제 (8)
        • Database (5)
        • 자료구조 (0)
      • IT 지식 (2)
      • IT 뉴스 (4)
      • 출처 표기 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크
    오블완
    변수
    자바스크립트
    SWIFT
    Vision Pro
    클래스
    제어문
    함수
    프로세스
    옵셔널
    Initializers
    운영체제
    연산자
    이니셜라이저
    Apple
    Xcode
    프로그래머스
    프로퍼티 래퍼
    swiftUI
    visionOS
    데이터베이스
    코딩테스트
    스위프트
    ios
    티스토리챌린지
    비동기
    UIKit
    디자인패턴
    배열
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
P_Piano
[iOS] Object Capture 사용하기
상단으로

티스토리툴바