假设我有一张照片(使用 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 中获取跟踪图像坐标的最简单方法是使用 ARImageAnchor
的 transform
实例属性,表示为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/