是否可以使用ARKit的图像识别功能检测两次或更多次相同的图像?



我正在尝试构建一个应用程序,该应用程序检测同一图像两次或两次以上,并将这些检测到的图像添加到数组中,以便稍后对其进行处理。

我将我的图像和大小添加到Assets.xassets中的AR Resources文件夹中。图像会被识别,这很好。但当我想扫描同一张图像两次时,它只识别一张图像。

我在网上没有找到任何关于这个问题的具体文档。我还怀疑ARKit是不可能的,我可能需要使用机器学习模型。

如果有人遇到过这个问题,并且有一个没有CoreML和Vision的解决方案,我们将不胜感激。否则,我将尝试使用vision和CoreML。

下面是识别图像并在其上方广告一架透明飞机的代码。

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
let referenceImage = imageAnchor.referenceImage
let imageName = referenceImage.name ?? "no name"
print("Image Anchor: ", imageAnchor)
let plane = SCNPlane(width: referenceImage.physicalSize.width, height: referenceImage.physicalSize.height)
let planeNode = SCNNode(geometry: plane)
planeNode.opacity = 0.20
planeNode.eulerAngles.x = -.pi / 2
node.addChildNode(planeNode)
detectedImages.append(imageAnchor)
DispatchQueue.main.async {
self.label.text = "Image detected: "(imageName)""
}
}

您发布的代码无法识别任何内容,当ARKit已经为已识别的图像添加了锚的默认节点时,就会调用它,这种情况实际上只发生过一次。如果要规避此限制,请遵循手册-

考虑何时允许检测每个图像以触发(或重复(AR交互。ARKit为会话配置的detectionImages数组中的每个参考图像向会话添加一个图像锚点。如果您的AR体验在检测到图像时将虚拟内容添加到场景中,则默认情况下该操作只会发生一次。要允许用户在不重新启动应用程序的情况下再次体验该内容,请调用会话的remove(anchor:(方法来删除相应的ARImageAnchor。移除锚点后,ARKit将在下次检测到图像时添加新的锚点。

https://developer.apple.com/documentation/arkit/recognizing_images_in_an_ar_experience

是的,这是可能的。您需要添加一个额外的变量来存储以前检测到的图像,然后将其与当前图像进行比较。如果它们不匹配,它将用新图像替换先前检测到的图像上的信息。这样,如果你有多个图像,你可以一直看一个和另一个,内容总是显示出来。

last detected Image storage
var lastImageAnchor: ARAnchor!
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor else { return }
if self.lastImageAnchor != nil && self.lastImageAnchor != imageAnchor {
self.sceneView.session.remove(anchor: self.lastImageAnchor)
}
let referenceImage = imageAnchor.referenceImage
let imageName = referenceImage.name ?? "no name"
... (insert the rest of your code here)...
}
self.lastImageAnchor = imageAnchor
}

这应该行得通。

最新更新