【问题标题】:Distinguish between multiple tracked images at the same time?同时区分多个跟踪图像?
【发布时间】:2020-06-28 17:04:20
【问题描述】:

目前,我的应用正在跟踪一组 5 张参考图片。但是,我希望它能够区分参考图像(即图像是图像 A、图像 B 还是图像 C。跟踪我打印在明信片上的真实照片)。

目前,我的代码能够检测到图像并在其上放置一个平面(即一个简单的矩形)。但是,我的问题是,是否可以区分应用程序是否检测到图片 A 和图片 B 的图片?如果有,怎么做?

我知道有一个使用 ML 的选项,但想看看 SceneKit/ARKit 中是否有我没有考虑过的更简单的选项;特别是因为我使用的是准确的图像,而不是试图让应用猜测对象。

class ViewController: UIViewController, ARSCNViewDelegate {
    
    @IBOutlet var sceneView: ARSCNView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
    }
    
//MARK-: WHERE I CONFIGURE MY APP TO DETECT AN IMAGE

    override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            
            let configuration = ARImageTrackingConfiguration()
            
            guard let trackedImages = ARReferenceImage.referenceImages(inGroupNamed: "Photos", bundle: Bundle.main) else {
                print("No images available")
                return
            }
            
            configuration.trackingImages = trackedImages
            configuration.maximumNumberOfTrackedImages = 7
            
            sceneView.session.run(configuration)
    }
    
//MARK-: WHERE I PLACE A PLANE OVER THE DETECTED IMAGE

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
            
            let node = SCNNode()
            
            if let imageAnchor = anchor as? ARImageAnchor {
                let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)

                plane.firstMaterial?.diffuse.contents = UIColor(white: 1, alpha: 0.8)

                let planeNode = SCNNode(geometry: plane)
                planeNode.eulerAngles.x = -.pi / 2

                node.addChildNode(planeNode)
            }
            return node
    }
    
}

【问题讨论】:

    标签: swift augmented-reality scenekit arkit scene


    【解决方案1】:

    您可以使用referenceImagename 等实例属性轻松完成此操作。

    // The detected image referenced by the image anchor.
    var referenceImage: ARReferenceImage { get }
    

    和:

    // A descriptive name for your reference image.
    var name: String? { get set }  
    

    这是它们在代码中的样子:

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        
        guard let imageAnchor = anchor as? ARImageAnchor,
              let _ = imageAnchor.referenceImage.name
        else { return }
        
        anchorsArray.append(imageAnchor)
    
        if imageAnchor.referenceImage.name == "apple" {
            print("Image with apple is successfully detected...")
        }
    }
    

    【讨论】:

      【解决方案2】:

      按照安迪的解决方案,我使用了下面的代码,并使用了变量imageName作为参考。

      
      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"
              
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2011-06-01
        • 2014-08-22
        • 1970-01-01
        • 2013-12-06
        相关资源
        最近更新 更多