【问题标题】:Is it possible to detect the same image twice or more with ARKit's image recognition?是否可以通过 ARKit 的图像识别来检测两次或多次相同的图像?
【发布时间】:2019-05-12 08:50:50
【问题描述】:

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

我将图像和大小添加到 Assets.xassets 中的 AR 资源文件夹中。图像被识别并且工作正常。但是当我想扫描同一张图像两次时,它只能识别一张图像。

我没有在 Internet 上找到任何有关此问题的特定文档。我还怀疑 ARKit 不可能,我可能需要使用机器学习模型。

如果有人遇到这个问题并且有没有 CoreML 和 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)\""
    }
}

【问题讨论】:

    标签: swift arkit


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

       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
          }
      

      这应该可行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-09
        • 2019-10-10
        • 2021-04-12
        • 2016-07-31
        • 2018-12-13
        • 2019-01-26
        • 2019-06-02
        • 2018-01-31
        相关资源
        最近更新 更多