Loading
BLOG 開発者ブログ

2025年2月3日

Apple Vision ProのEnterprise APIを利用してメインカメラ機能を使ってみた

はじめに

こんにちは。
クラウドソリューショングループのyamasaki.sです!

今回は、メインカメラで撮影している映像をWindowに表示できるように実装してみます。
基礎的なプロジェクト作成や実装については
Vision Proのシミュレーター起動方法と基礎実装をわかりやすく紹介!
Apple Vision ProでEnterprise APIを利用できるようにしてみた
で紹介しているため、今回の記事では省かせていただきます。

目次

フロントカメラ機能の実装

まず、メインカメラで撮影した情報をImageとして返すPixelBufferクラスを用意します。

extension CVPixelBuffer {
    var image: Image? {
        let ciImage = CIImage(cvPixelBuffer: self)
        let context = CIContext(options: nil)
        
        guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else {
            return nil
        }

        let uiImage = UIImage(cgImage: cgImage)

        return Image(uiImage: uiImage)
    }
}

カメラ機能がサポートされていない場合は、後続処理を実行させないように最初にguardで防いでおきます。

struct MainCameraView: View {
    var body: some View {
        
        ...

        image
        .resizable()
        .scaledToFit()
        .task {
            guard CameraFrameProvider.isSupported else {
                print("カメラはサポートされていません。")
                return
            }

        }
    }
}

最後に、メインカメラ機能の処理を実装します。

struct MainCameraView: View {
    @State private var arkitSession = ARKitSession()
	@State private var pixelBuffer: CVPixelBuffer?

    var body: some View {
        let image = pixelBuffer?.image ?? emptyImage
        ...

        image
        .resizable()
        .scaledToFit()
        .task {
            
            ...

            // メインカメラ機能へアクセス
            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 = sample.pixelBuffer
                }
            }
        }

    }
}

ビルド

必要な処理は実装できたので、実際にビルドして挙動を確認します。

生成AIとの組み合わせた活用

試しに、以前に実装した生成AIとの対話アプリにメインカメラの映像を解析して会話できるようにしてみました!
Apple Vision ProとGeminiを利用して会話アプリケーションを作ってみた

さいごに

今回は、Enterprise APIを利用してメインカメラ機能を実装する方法を紹介しました。
iOSでは標準機能として特に制約なく利用できますが、visionOSでは2025年1月27日時点ではまだ制限がある状態です。

メインカメラ機能が使えるだけでも、さまざまな活用方法が考えられるため、今後の展開に期待が膨らみますね!

yamasakiのブログ