假设我有一张照片(用iOS相机拍摄),其中包含一个位于平面上的已知图像目标(例如,一个5 5cm x 5 5cm的方形二维码)。我可以使用Apple Vision框架来计算图像目标的6dof姿态吗?
我不熟悉这个框架,但在我看来,这个问题类似于AR目标的跟踪,所以我希望其中有一个解决方案!
事实上,我真正想做的是检测静态图像中的形状(使用现有的云托管的开放式cv应用程序),并使用ARKit在AR中显示这些形状。我希望我可以在静态图像和AR视频馈送中显示相同的图像目标。
发布于 2020-06-30 12:58:25
获取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)
// ...
}
}获取锚点坐标和图像大小
当您同时使用Vision和ARKit时,在ARKit中获取跟踪图像坐标的最简单方法是使用以SIMD4x4矩阵表示的ARImageAnchor的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)
// ...
}
}如果你想知道什么是SIMD4x4矩阵,请阅读this post。
此外,要获取跟踪照片的physical size (以米为单位),请使用此属性:
// set in Xcode's `AR Resources` Group
imageAnchor.referenceImage.physicalSize 要计算初始大小和估计物理大小之间的因子,请使用此属性:
imageAnchor.estimatedScaleFactor更新锚点坐标和图像大小
要不断更新ARImageAnchor的坐标和图像大小,请使用来自ARSCNViewDelegate的第二种方法:
optional func renderer(_ renderer: SCNSceneRenderer,
didUpdate node: SCNNode,
for anchor: ARAnchor)要在Vision中获取照片的边框(CGRect类型),请使用此实例属性:
VNDetectedObjectObservation().boundingBoxhttps://stackoverflow.com/questions/62630540
复制相似问题