swift - 如何同时委托(delegate)ARSession和AVCaptureSession?

标签 swift avfoundation ios11 arkit

我见过有人用 ARSCNView 运行 ARKit,他们能够在相机中获取所说的 QR 码矩形,并在与 QR 码所在位置相关的位置渲染一些东西空间。我认为他们是通过委托(delegate) AVCaptureMetadataOutputObjectsDelegate 来实现的,所以我继续尝试实现以下逻辑:

  1. 同时运行 ARSCNViewDelegateARSessionDelegateAVCaptureMetadataOutputObjectsDelegate

  2. 连接一个 ARSCNView,将 View 及其 session 委托(delegate)给自己。

  3. 连接一个 AVCaptureSession,将其委托(delegate)给自己,然后启动 session 。

  4. 启动ARSCNView session ,因为官方的例子在viewWillAppear()中做了这个,所以我做了同样的事情。

应用程序确实运行没有任何错误,但我只能从 AVCaptureMetadataOutputObjectsDelegate 获得一些回调,比如 3 到 5,然后它再也不会像 ARSession 的委托(delegate)那样被调用 夺取了它的权限,是我实现了错误的方法还是你不能同时委托(delegate) ARSessionAVCaptureSession

最佳答案

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

  1. 启动一个ARSession,实现ARSessionDelegatesession(_:didUpdate:)函数。每次捕获 ARFrame 时,在框架图像中搜索 QR 码。 ( code )

    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. 启动一个AVCaptureSession,当您识别并解码您的二维码时停止它并启动一个ARSession。 (不推荐)

关于swift - 如何同时委托(delegate)ARSession和AVCaptureSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431817/

相关文章:

ios - Swift 处理大量数据并使用队列正确显示

ios - 找不到接受提供的参数的 "init"的重载

ios - UITableView 尾部滑动短与长或长滑动后返回单元格

swift - iOS 11 simd 矩阵线性组合去哪儿了?

ios - 使用 RxSwift 的 combineLatest 中超过 8 个参数

ios - 将 FBSDKGraphRequest 的图片结果保存为 PFFile

ios - 使用 PHP 在 Objective-C 中上传录制的音频文件

ios - CMSampleBuffer 中有多少帧?

objective-c - AVPlayer 特殊注意事项是什么意思?

ios - 错误 ITMS-90725 : Please update Xcode and rebuild your app