Apple Vision - Ist es möglich, die Kameraposition aus einem statischen Bild zu ermitteln? - machine-learning - Program QA

Apple Vision - Ist es möglich, die Kameraposition aus einem statischen Bild zu ermitteln?

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

Angenommen, ich habe ein einzelnes Foto (aufgenommen mit einer iOS-Kamera), das ein bekanntes Bildziel (z. B. einen quadratischen QR-Code von 5 cm x 5 cm) enthält, das auf einer flachen Ebene liegt. Kann ich das Apple Vision Framework verwenden, um die 6dof-Pose des Bildziels zu berechnen?

Ich bin mit dem Framework nicht vertraut, aber es scheint mir, dass dieses Problem der Verfolgung von AR-Zielen ähnelt, und ich hoffe, dass es irgendwo eine Lösung gibt!

Eigentlich möchte ich Formen im statischen Bild erkennen (mithilfe einer vorhandenen Cloud-gehosteten Open-CV-App) und diese Formen mit ARKit in AR anzeigen. Ich hatte gehofft, dass sowohl in den statischen Bildern als auch im AR-Video-Feed dieselben Bildziele vorhanden sein könnten.

Answers

ARCamera-Position ermitteln

In ARKit können Sie die Position von ARCamera über die Punktnotation von ARFrame erfassen. Jeder ARFrame (von 60 Bildern pro Sekunde) enthält eine 4x4-Kameramatrix. Verwenden Sie zum Aktualisieren der Position von ARCamera eine Instanzmethode namens renderer(_:didUpdate:for:) .

Hier ist die "anfängliche" Methode namens 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)

        // ...
     }
}


Ankerkoordinaten und Bildgröße ermitteln

Wenn Sie Vision und ARKit zusammen verwenden, können Sie die Koordinaten eines verfolgten Bildes in ARKit am einfachsten ermitteln, indem Sie eine transform von ARImageAnchor die in der SIMD 4x4-Matrix ausgedrückt wird.

var transform: simd_float4x4 { get }

Diese Matrix codiert die Position, Ausrichtung und Skalierung des Ankers relativ zum Weltkoordinatenraum der AR-Sitzung, in der der Anker platziert ist.


So könnte Ihr Code aussehen:

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)

        // ...
     }
}

Wenn Sie wissen möchten, was eine SIMD 4x4-Matrix ist, lesen Sie diesen Beitrag .


Verwenden Sie diese Eigenschaft, um eine physical size (in Metern) eines verfolgten Fotos zu erhalten:

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

Verwenden Sie diese Eigenschaft, um einen Faktor zwischen der Anfangsgröße und der geschätzten physischen Größe zu berechnen:

imageAnchor.estimatedScaleFactor


Aktualisieren der Ankerkoordinaten und der Bildgröße

Um die Koordinaten von ARImageAnchor und die Bildgröße ständig zu aktualisieren, verwenden Sie die zweite Methode von ARSCNViewDelegate :

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

Verwenden Sie diese Instanzeigenschaft, um einen Begrenzungsrahmen ( CGRect Typ) Ihres Fotos in Vision zu erhalten:

VNDetectedObjectObservation().boundingBox

Related