【问题标题】:How to delegate ARSession and AVCaptureSession at the same time?如何同时委托 ARSession 和 AVCaptureSession?
【发布时间】:2018-01-07 23:11:15
【问题描述】:

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

  1. 同时运行ARSCNViewDelegateARSessionDelegateAVCaptureMetadataOutputObjectsDelegate

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

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

  4. 启动ARSCNView 会话,因为官方示例在viewWillAppear() 中执行此操作,所以我做了同样的事情。

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

【问题讨论】:

  • 你知道他们用什么来渲染二维码的 3D 位置吗?
  • 如果您能够获取相机帧的元数据,您可以将 QRCode 的矩形转换为 3D 坐标并进行渲染。
  • 这正是我一周前想要做的,但我没有成功......我试图理解你可以将 QRCode 的矩形知道其在屏幕上的位置转移到 3D协调。你需要一个特定的框架来做到这一点吗?

标签: swift avfoundation ios11 arkit


【解决方案1】:

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

  1. 启动一个ARSession,实现ARSessionDelegate的函数session(_:didUpdate:)。每次您捕捉到ARFrame 时,都会在相框的图像中搜索二维码。 (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。 (不推荐)

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多