見出し画像

iOS 17のObject Capture APIで、「空間」のキャプチャーは可能か?

AppleのObject Capture APIは、WWDC21でmacOS向けのフォトグラメトリAPIとして発表された。で、その撮影側のAPIがiOS 17で新規追加された。

「iOSではじめるフォトグラメトリ」より

この機能は明確に「オブジェクト」キャプチャーと謳ってはいるものの、「空間」のフォトグラメトリにもそこそこ使えることがわかった。

ただここで検証したのはあくまでReconstruction / フォトグラメトリ側のAPI。

上の検証では「iOS標準のカメラアプリで、iPhone手持ちで撮影した動画」からフォトグラメトリしてみる、ということをやったのだが、

昨日記事にも書いた通り「動画からのフォトグラメトリ」は解像度やカメラキャリブレーション等々で、フォトグラメトリ精度的には色々不足があることがわかってきた。

動画からフレーム画像を抽出する際に、追加処理としてEXIFに色々情報を詰め込む、ということも考えられるが、正直あまりカメラや光学系に詳しくないので間違った情報を入れてしまいそうな気もする。

そこで思い当たったのが、Object Capture APIのうち、「撮影側」は、実はいろんな情報をHEICフォーマット内に入れ込んでいる、という件。

AuxiliaryData =             (
                    {
        AuxiliaryDataType = kCGImageAuxiliaryDataTypeDepth;
        Height = 192;
        Width = 256;
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#DepthConfidenceMap";
        Height = 192;
        Width = 256;
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#CameraTrackingState";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#CameraCalibrationData";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#ObjectTransform";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#ObjectBoundingBox";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#RawFeaturePoints";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#PointCloudData";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#BundleVersion";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#SegmentID";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#Feedback";
    },
                    {
        AuxiliaryDataType = "tag:apple.com,2023:ObjectCapture#WideToDepthCameraTransform";
    }
);

"CameraCalibrationData" も入っているし、動画ではなく静止画として撮影するので解像度も高い(4032x3024)し、しかもこのObject Capture APIの撮影側(Image Capture API)で撮った画像をObject Capture APIのフォトグラメトリ側(Reconstruction API)に渡せば、追加実装なしでこれらをいい感じに使ってくれる。

つまり、空間のフォトグラメトリの素材として標準カメラアプリで動画を撮る代わりに、Object Capture APIの撮影側(Image Capture API)を使った撮影アプリをつくり、同じようにiPhone手持ちで歩きながら撮影すれば、撮影ハードルはそのままで、より高品質な空間のフォトグラメトリができるのではないか、という。

というわけでそういう実装はできそうか、検証してみたメモ。

こちらの記事も見返しつつ検討した:

ポイント

問題はここ。

ここでContinueを押すとバウンディングボックスが現れ、

ここでStart Captureボタンを押すとキャプチャーが開始する。

このバウンディングボックスを指定するステップをスキップできるのであれば、Object CaptureのAPIで空間フォトグラメトリ用の撮影が可能、ということになる。

空間をキャプチャーしたい場合はカメラのプレビュー内でバウンディングボックスの指定などできないからだ。

PhotogrammetrySession の場合

フォトグラメトリ側のAPIである PhotogrammetrySession は、PhotogrammetrySession.Request にバウンディングボックスを「オプショナルで」(デフォルトは nil)指定できる仕様なので、

撮影側も同様の思想であれば「空間」の撮影も可能なのではないか、と。

結論

バウンディングボックスの指定をスキップすることは残念ながらできない

ここから先は

1,360字 / 2画像

文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/