swift - Apple Vision – 是否可以从静态图像获取相机位置?

标签 swift augmented-reality arkit coreml apple-vision

假设我有一张照片(使用 iOS 相机拍摄),其中包含位于平面上的已知图像目标(例如 5 厘米 x 5 厘米的方形 QR 码)。我可以使用Apple Vision框架来计算图像目标的6dof位姿吗?

我对这个框架不熟悉,但在我看来,这个问题类似于 AR 目标的跟踪,所以我希望那里有一个解决方案!

事实上,我真正想做的是检测静态图像中的形状(使用现有的云托管开放式CV应用程序)并使用ARKit在AR中显示这些形状。我希望静态图像和 AR 视频源中能够呈现相同的图像目标。

最佳答案

获取ARCamera位置

在ARKit中,您可以通过ARFrame的点表示法获取ARCamera的位置。每个 ARFrame(每秒 60 帧)包含 4x4 相机矩阵。要更新 ARCamera 的位置,请使用名为 renderer(_:didUpdate: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)

        // ...
     }
}


获取 anchor 坐标和图像大小

当您同时使用 Vision 和 ARKit 时,在 ARKit 中获取跟踪图像坐标的最简单方法是使用 ARImageAnchortransform 实例属性,表示为SIMD 4x4 矩阵。

var transform: simd_float4x4 { get }

This matrix encoding the position, orientation, and scale of the anchor relative to the world coordinate space of the AR session the anchor is placed in.


您的代码可能如下所示:

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 矩阵是什么,请阅读 this post .


此外,要获取跟踪照片的物理尺寸(以米为单位),请使用此属性:

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

要计算初始大小和估计物理大小之间的系数,请使用以下属性:

imageAnchor.estimatedScaleFactor


更新 anchor 坐标和图像大小

要不断更新 ARImageAnchor 的坐标和图像大小,请使用来自 ARSCNViewDelegate 的第二种方法:

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

要在 Vision 中获取照片的边界框(CGRect 类型),请使用以下实例属性:

VNDetectedObjectObservation().boundingBox

关于swift - Apple Vision – 是否可以从静态图像获取相机位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62630540/

相关文章:

objective-c - 在 objective-C++ 中调用 swift(.mm 文件)

JavaScript 增强现实

ios - ARKit图像识别——图像跟踪

ios - ARKit - 如何获取场景 View 中的特定节点?

scenekit - 如何从 ZIP 文件再次生成 USDZ 文件?

ios - "override func scrollViewDidScroll"多次调用。我只想打电话一次

ios - 如何在 swift 中解析整个 rss feed xml 数据

ios - 使用核心数据重新排列 TableView 单元格的顺序

flutter - 如何使用增强现实在 flutter 中创建人脸应用程序

augmented-reality - 横向模式下的旋转矩阵改变了吗? iPhone 上的增强现实