如何同时委托ARSession和AVCaptureSession?

时间:2017-08-01 07:43:45

标签: swift avfoundation ios11 arkit

我看到有人ARKitARSCNView一起运行,他们可以在相机中获取所说的QRCode矩形,并在某个位置以某种方式渲染某些东西将QRCode放置在空间中。我认为他们通过委派AVCaptureMetadataOutputObjectsDelegate来做到这一点,所以我继续尝试实现以下逻辑:

1-同时运行ARSCNViewDelegateARSessionDelegateAVCaptureMetadataOutputObjectsDelegate

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

3-连接AVCaptureSession,委托给自己,然后开始会话。

4-开始ARSCNView会话,因为官方示例在viewWillAppear()中执行了此操作,我做了同样的事情。

应用程序确实运行没有任何错误,但是我只能从AVCaptureMetadataOutputObjectsDelegate获得一些回调,比如3到5,然后它再也不会被调用,就像ARSession的代表抓住它的权限一样,是我实施错误的方法,或者您只能同时委派ARSessionAVCaptureSession

1 个答案:

答案 0 :(得分:4)

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

  1. 启动ARSession,并实现ARSessionDelegate的函数会话(_:didUpdate :)。 每次在帧的图像中捕获ARFrame搜索QRCode时。

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

    }

  2. https://github.com/donMichaelL/qrCode-Arkit.git

    1. 启动AVCaptureSession,当您识别并解码您的QR码时,请停止它并启动ARSession。 (不推荐)