Apple Vision –静止画像からカメラの位置を取得することは可能ですか?

2020-06-29 machine-learning arkit apple-vision

既知の画像ターゲット(たとえば、5cm x 5cmの正方形のQRコード)を含む1枚の写真(iOSカメラで撮影)が平面上にあるとします。 Apple Visionフレームワークを使用して画像ターゲットの6dofポーズを計算できますか?

私はフレームワークに不慣れですが、この問題はARターゲットの追跡に似ているように思われるので、どこかに解決策があることを期待しています!

実際、私が実際にやりたいのは、静的な画像で形状を検出し(既存のクラウドホスト型のオープンcvアプリを使用)、ARKitを使用してそれらの形状をARで表示することです。静止画像とARビデオフィードの両方に同じ画像ターゲットが存在することを望んでいました。

Answers

ARCameraの位置を取得する

ARKitでは、ARFrameのドット表記を介してARCameraの位置を取得できます。各ARFrame(毎秒60フレームのうち)には、4x4のカメラマトリックスが含まれています。 ARCameraの位置を更新するには、 renderer(_:didUpdate:for:)というインスタンスメソッドを使用します。

renderer(_:didAdd:for:)と呼ばれる「初期」メソッドはrenderer(_:didAdd:for:)

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, 
                 didAdd node: SCNNode, 
                  for anchor: ARAnchor) {
    
        let frame = sceneView.session.currentFrame
    
        print(frame?.camera.transform.columns.3.x as Any)
        print(frame?.camera.transform.columns.3.y as Any)
        print(frame?.camera.transform.columns.3.z as Any)

        // ...
     }
}


アンカー座標と画像サイズの取得

VisionとARKitを一緒に使用する場合、ARKitで追跡された画像の座標を取得する最も簡単な方法は、SIMD 4x4マトリックスで表されるARImageAnchor transformインスタンスプロパティを使用するtransformです。

var transform: simd_float4x4 { get }

アンカーが配置されているARセッションの世界座標空間を基準にしたアンカーの位置、方向、およびスケールをエンコードするこのマトリックス。


コードは次のようになります。

extension ViewController: ARSCNViewDelegate {

    func renderer(_ renderer: SCNSceneRenderer, 
                 didAdd node: SCNNode, 
                  for anchor: ARAnchor) {
    
        guard let imageAnchor = anchor as? ARImageAnchor
        else { return }
    
        print(imageAnchor.transform.columns.3.x)
        print(imageAnchor.transform.columns.3.y)
        print(imageAnchor.transform.columns.3.z)

        // ...
     }
}

SIMD 4x4マトリックスとは何かを知りたい場合は、 この投稿をご覧ください。


また、追跡された写真のphysical size (メートル単位)を取得するには、このプロパティを使用します。

// set in Xcode's `AR Resources` Group
imageAnchor.referenceImage.physicalSize        

初期サイズと推定物理サイズの間の係数を計算するには、このプロパティを使用します。

imageAnchor.estimatedScaleFactor


アンカー座標と画像サイズの更新

ARImageAnchor座標と画像サイズを常に更新するには、 ARImageAnchor 2番目のメソッドを使用しARSCNViewDelegate

optional func renderer(_ renderer: SCNSceneRenderer, 
                   didUpdate node: SCNNode, 
                       for anchor: ARAnchor)

Visionで写真のバウンディングボックス( CGRectタイプ)を取得するには、次のインスタンスプロパティを使用します。

VNDetectedObjectObservation().boundingBox

Related