Swift 是否可以使用ARKit'检测同一图像两次或两次以上;s图像识别?

Swift 是否可以使用ARKit'检测同一图像两次或两次以上;s图像识别?,swift,arkit,Swift,Arkit,我正在尝试构建一个应用程序,它可以检测相同的图像两次或两次以上,并将这些检测到的图像添加到一个数组中,以便以后对其进行处理 我将图像和大小添加到Assets.xassets中的AR Resources文件夹中。图像得到识别,效果良好。但当我想扫描同一张图像两次时,它只识别一张图像 我没有在互联网上找到关于这个问题的任何具体文档。我还怀疑ARKit是不可能的,我可能需要使用机器学习模型 如果有人遇到这个问题,并且有一个没有CoreML和Vision的解决方案,我们将不胜感激。否则,我将尝试使用vi

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

我将图像和大小添加到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将在下次检测图像时添加新定位点

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

 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
    }
这应该行得通