🍎

メインカメラへのアクセス - Enterprise APIs for visionOS

2025/02/21に公開

Enterprise APIs for visionOS 解説シリーズ、今回は「メインカメラへのアクセス」です。

Apple Vision Pro の前面カメラを活用することで、業務アプリや産業用途での視覚データ取得が可能になります。例えば、現場作業員の支援や医療分野でのリモート診断といった用途が考えられます。

サンプルプロジェクトはこちら。
https://developer.apple.com/documentation/visionos/accessing-the-main-camera

サンプルの動作動画はこちら。

サンプルの実行手順

先ほどのドキュメントページよりサンプルプロジェクトをダウンロードします。

zipファイルを展開して「AccessingTheMainCamera.xcodeproj」を開きます。

Xcode でプロジェクトを開いたら「Enterprise.license」ファイルを差し替えます。
サンプルにはテキストファイルが入っているので、一度このファイルを削除して、取得した正規の「Enterprise.license」をプロジェクトにコピーします。

プロジェクト設定画面を開き、「General」タブで visionOS のバージョンを指定します。
Enterprise APIs for visionOSはvisonOS 2.0以上が対応するので「2.0」を指定します。

サンプルでは設定済みのためスキップしますが、「Capability」の追加として「Signing & Capabilities」より「+ Capability 」ボタンを押して「Main Camera Access」を選択します。

Capabilityまで設定したら、実機にビルドして転送します。

カメラ画像は Immersive Space のみ有効になるため、ボタンを押して切り替えると表示されます。

コードの簡単な解説

カメラ画像取得のコードは MainCameraView.swift にあり、MainCameraView は ContentView.swift内で呼ばれます。

MainCameraViewでは カメラのフレームデータをCVPixelBufferで取得し、image に設定しています。
画像処理などを行う場合は、CVPixelBufferで取得したデータを利用します。

MainCameraView.swift
import ARKit
import RealityKit
import SwiftUI

struct MainCameraView: View {
    @State private var arkitSession = ARKitSession()
    @State private var pixelBuffer: CVPixelBuffer?
    
    let emptyImage = Image(systemName: "camera")

    var body: some View {
        let image = pixelBuffer?.image ?? emptyImage
        
        image
        .resizable()
        .scaledToFit()
        .task {
            
            // カメラアクセスがサポートされているか確認します。サポートされていない場合は処理を中断します。
            guard CameraFrameProvider.isSupported else {
                print("CameraFrameProvider is not supported.")
                
                return
            }
            
            let cameraFrameProvider = CameraFrameProvider()

            try? await arkitSession.run([cameraFrameProvider])
            
            // 左側のメインカメラがサポートするビデオフォーマットを読み込みます。
            let formats = CameraVideoFormat.supportedVideoFormats(for: .main, cameraPositions: [.left])
        
            // 最も高解像度のフォーマットを見つけます。
            let highResolutionFormat = formats.max { $0.frameSize.height < $1.frameSize.height }

            // 非同期のカメラフレームシーケンスをリクエストします。
            guard let highResolutionFormat,
                  let cameraFrameUpdates = cameraFrameProvider.cameraFrameUpdates(for: highResolutionFormat) else {
                return
            }
            
            for await cameraFrame in cameraFrameUpdates {
                if let sample = cameraFrame.sample(for: .left) {
                    
                    // フレームの画像をレンダリングするために、`pixelBuffer` を更新します。
                    pixelBuffer = sample.pixelBuffer
                }
            }
        }
    }
}

まとめ

Apple Vision Pro の前面カメラの画像を取得できるようになりました。

取得した画像データを利用して、リアルタイムの物体検出、リモートアシスタント、ARコンテンツの強化など、画像処理や機械学習処理に利用ができます。

ホロラボのテックブログ

Discussion