ARKitのCapturedFrameをVisionなどで解析してARインタラクションを作る場合があるが、
この際ARKitSessionDelegateで取得できるフレームとディスプレイに表示されているフレームの領域が違うことがある。(キャプチャされた一部分を表示していることがある)
例えば、iPhone11ではディスプレイが 414x896 だが、キャプチャしたフレームサイズは 1440x1920 である。
ディスプレイ内にフレーム縦幅は全て収まっているが、横は中心部しか収まっていない。
ディスプレイに表示されている領域でフレームをクロップするコード。
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let pixelBuffer = frame.capturedImage
let ciImage = CIImage(cvPixelBuffer: pixelBuffer, options: [:]).oriented(.right)
let aspect = arView.bounds.width / arView.bounds.height
let widthForDisplayAspect = ciImage.extent.height * aspect
let cropped = ciImage.cropped(to: CGRect(x: ciImage.extent.width/2-widthForDisplayAspect/2, y: 0, width: widthForDisplayAspect, height: ciImage.extent.height))
}
これを解析すれば、ディスプレイ表示されたフレームを基準に解析できる。
🐣
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com
Core MLやARKitを使ったアプリを作っています。
機械学習/AR関連の情報を発信しています。