我正在玩 iOS 12 上的图像识别,特别是试图在识别的图像上显示等效的标签。
最初,我根据 ReferenceImage 的位置和大小通过各种计算创建了标签(悬停在识别图像上的 semi-transparent 小平面)。
这给了我很好的结果,但我认为我可以进一步提高准确性。

我认为为标签创建图像并让 ARKit 跟踪它们会带来更好的结果。
因此,我尝试裁剪主图像,为标签创建实际图像,并将其添加到 detectionImages 集中。
不幸的是,可能是因为要检测标签的图像非常小,所以为标签创建的平面并未位于主图像上,而是更靠近用户的 POV。

但是由于仍然可以正确跟踪主映像,所以我想知道是否有某种方法可以限制renderer(:didAdd:for:)方法来告诉 ARKit 它应使用主映像的位置来计算新节点的锚点。这可能吗?
谢谢

编辑
以下是标记功能的主要部分。
我正在创建两组,一组包含图像,另一组包含图像标签。
当检测到图像时,detectionSet 与另一个交换其设置,以便使用 showTags()方法识别标签图像并将其添加到场景中。

我要实现的目的是通过指定我已经知道他需要添加的所有锚点的 Z-position(这是他在上一步中识别出的图像的 Z-position)来在定位标签时以某种方式引导 ARkit。

func setupImageDetection() {
    let configuration = ARWorldTrackingConfiguration()
    let mainImageSet: Set = //
    let tagImageSet: Set = //
    configuration.planeDetection = [.horizontal, .vertical]
    configuration.detectionImages = hasRecognizedMainImage ? tagImageSet : mainImageSet
    sceneView.session.run(configuration, options: [])
}

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let imageAnchor = anchor as? ARImageAnchor,
        let name = imageAnchor.referenceImage.name else { return }

    guard hasRecognizedMainImage == false else {
        self.showTags(node: node, referenceImage: imageAnchor.referenceImage, name: name)
        return
    }
    let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
    let planeNode = SCNNode(geometry: plane)
    planeNode.eulerAngles.x = -.pi / 2
    planeNode.geometry?.firstMaterial?.transparency = 0.2
    node.addChildNode(planeNode)
    hasRecognizedMainImage = true
    setupImageDetection()
    }

func showTags(node: SCNNode, referenceImage: ARReferenceImage, name: String) {
    let tag = getTag(forName: name)
    let tagPlane = SCNPlane(width: referenceImage.physicalSize.width, height:referenceImage.physicalSize.height)
    let tagPlaneNode = SCNNode(geometry: tagPlane)
    tagPlaneNode.geometry?.firstMaterial?.transparent.contents = UIImage(named: "circle")
    tagPlaneNode.eulerAngles.x = -.pi / 2
    node.addChildNode(tagPlaneNode)
    }