swift - 是否可以通过 ARKit 的图像识别来检测两次或多次相同的图像?
问题描述
我正在尝试构建一个应用程序,该应用程序可以两次或多次检测到相同的图像,并将这些检测到的图像添加到一个数组中,以便稍后对其进行处理。
我将图像和大小添加到 Assets.xassets 中的 AR 资源文件夹中。图像被识别并且工作正常。但是当我想扫描同一张图像两次时,它只能识别一张图像。
我没有在互联网上找到任何关于这个问题的特定文档。我还怀疑 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)\""
}
}
解决方案
您发布的代码无法识别任何内容,当 ARKit 已经为已识别图像添加的锚点添加了默认节点时调用它,这确实只发生一次。如果要规避此限制,请遵循手册 -
考虑何时允许检测每个图像以触发(或重复)AR 交互。ARKit 为会话配置的 detectionImages 数组中的每个参考图像添加一个图像锚点到会话中。如果您的 AR 体验在检测到图像时将虚拟内容添加到场景中,则默认情况下该操作只会发生一次。要让用户在不重新启动应用的情况下再次体验该内容,请调用会话的 remove(anchor:) 方法来删除相应的 ARImageAnchor。移除锚点后,ARKit 会在下次检测到图像时添加新的锚点。
https://developer.apple.com/documentation/arkit/recognizing_images_in_an_ar_experience
推荐阅读
- html - 如何将 HTML DIV 自动调整到网页底部?
- sql - 从表中选择名称
- javascript - 在 vue.js 中创建一个 tcp 客户端
- flutter - 永远不会使用 StreamTransformer 调用 Flutter 密码验证器
- css - 如何使用 css 动画反弹和不透明度变化
- html - 如何在 Angular 中进行分页?
- java - “java.io.FileNotFoundException:在读取镶木地板文件页脚时,访问被拒绝错误
- yii2 - Yii2 菜单小部件 - 如何为 yii2 菜单小部件设置数据子菜单标题
- python - Python3.7 和计划任务的 Unicode 问题
- c# - 如何在 WPF 中初始化 WebView2?