如何同时委托ARSession和AVCaptureSession?

Cyt*_*ang 9 avfoundation swift ios11 arkit

我看到跑的人ARKitARSCNView,而且他们能够获取说,在相机QRCode的矩形,并呈现在某种程度上与QR码在空间居住的地方位置的东西.我认为他们是通过委托来完成的AVCaptureMetadataOutputObjectsDelegate,所以我继续尝试实现以下逻辑:

1-运行ARSCNViewDelegate,ARSessionDelegateAVCaptureMetadataOutputObjectsDelegate在同一时间.

2-连接ARSCNView,将视图及其会话委派给自己.

3-连接AVCaptureSession,委托自己,并开始会话.

4-开始ARSCNView会话,因为官方的例子就是这样viewWillAppear()做的,我做了同样的事情.

该应用程序并没有任何错误运行,但我只得到了一些回调的AVCaptureMetadataOutputObjectsDelegate,像3到5,然后它永远不会被再次调用像ARSession的代表查获其权威性,是我实施了错误的方法,或者你可以委托ARSessionAVCaptureSession同时?

小智 6

我完全按照您的描述做了并且遇到了同样的问题。ARKit 似乎依赖于AVCapture系统,并且不支持一次使用多个捕获设备。我找到了两个解决方案。

  1. 启动ARSession,并实现该功能session(_:didUpdate:)ARSessionDelegate。每次您ARFrame在框架图像中捕获对 QR 码的搜索。(代码

    func session(_ session: ARSession, didUpdate frame: ARFrame) {
        let image = CIImage(cvPixelBuffer: frame.capturedImage)
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: nil)
        let features = detector!.features(in: image)
    
        for feature in features as! [CIQRCodeFeature] {
            if !discoveredQRCodes.contains(feature.messageString!) {
                discoveredQRCodes.append(feature.messageString!)
                let url = URL(string: feature.messageString!)
                let position = SCNVector3(frame.camera.transform.columns.3.x,
                                          frame.camera.transform.columns.3.y,
                                          frame.camera.transform.columns.3.z)
            }
         }
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动一个AVCaptureSession,当您识别并解码您的二维码时,停止它并启动一个ARSession. (不建议)