ARKit图像识别-根据另一个节点值添加新节点

时间:2018-09-06 11:04:21

标签: ios arkit

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

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

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

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

我要实现的目的是通过指定我已经知道他需要添加的所有锚点的Z位置(这是他在图像中识别的图像的Z位置)来在定位标签时以某种方式引导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)
    }

0 个答案:

没有答案