iOS 17のObject Capture APIで、「空間」のキャプチャーは可能か?
AppleのObject Capture APIは、WWDC21でmacOS向けのフォトグラメトリAPIとして発表された。で、その撮影側のAPIがiOS 17で新規追加された。
この機能は明確に「オブジェクト」キャプチャーと謳ってはいるものの、「空間」のフォトグラメトリにもそこそこ使えることがわかった。
ただここで検証したのはあくまで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)指定できる仕様なので、
撮影側も同様の思想であれば「空間」の撮影も可能なのではないか、と。
結論
バウンディングボックスの指定をスキップすることは残念ながらできない。
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/