我见过有人用 ARSCNView
运行 ARKit,他们能够在相机中获取所说的 QR 码矩形,并在与 QR 码所在位置相关的位置渲染一些东西空间。我认为他们是通过委托(delegate) AVCaptureMetadataOutputObjectsDelegate
来实现的,所以我继续尝试实现以下逻辑:
同时运行
ARSCNViewDelegate
、ARSessionDelegate
和AVCaptureMetadataOutputObjectsDelegate
。连接一个
ARSCNView
,将 View 及其 session 委托(delegate)给自己。连接一个
AVCaptureSession
,将其委托(delegate)给自己,然后启动 session 。启动
ARSCNView
session ,因为官方的例子在viewWillAppear()
中做了这个,所以我做了同样的事情。
应用程序确实运行没有任何错误,但我只能从 AVCaptureMetadataOutputObjectsDelegate
获得一些回调,比如 3 到 5,然后它再也不会像 ARSession 的委托(delegate)那样被调用
夺取了它的权限,是我实现了错误的方法还是你不能同时委托(delegate) ARSession
和 AVCaptureSession
?
最佳答案
我完全按照你的描述做了,也遇到了同样的问题。 ARKit 似乎依赖于 AVCapture
系统,并且不支持一次使用多个捕获设备。我找到了两个解决方案。
启动一个
ARSession
,实现ARSessionDelegate
的session(_: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) } } }
启动一个
AVCaptureSession
,当您识别并解码您的二维码时停止它并启动一个ARSession
。 (不推荐)
关于swift - 如何同时委托(delegate)ARSession和AVCaptureSession?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431817/