如何同时委托ARSession和AVCaptureSession?
How to delegate ARSession and AVCaptureSession at the same time?
我见过有人 运行使用 ARSCNView
使用 ARKit,他们能够在相机中获取所说的二维码矩形,并在与该地点相关的位置渲染某些东西QR 码驻留在 space。我以为他们是通过委托 AVCaptureMetadataOutputObjectsDelegate
来做到的,所以我继续尝试实现以下逻辑:
运行 ARSCNViewDelegate
, ARSessionDelegate
和 AVCaptureMetadataOutputObjectsDelegate
同时出现。
连接 ARSCNView
,将视图及其会话委托给自己。
连接一个 AVCaptureSession
,将其委托给自己,然后开始会话。
开始ARSCNView
会话,因为官方的例子在viewWillAppear()
中是这样做的,我也是这样做的
应用程序执行 运行 没有任何错误,但我只能从 AVCaptureMetadataOutputObjectsDelegate
获得一些回调,比如 3 到 5,然后它再也不会像 [= 的委托那样被调用=20=] 夺取了它的权限,是我实施了错误的方法还是你不能同时委托 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
。 (不推荐)
我见过有人 运行使用 ARSCNView
使用 ARKit,他们能够在相机中获取所说的二维码矩形,并在与该地点相关的位置渲染某些东西QR 码驻留在 space。我以为他们是通过委托 AVCaptureMetadataOutputObjectsDelegate
来做到的,所以我继续尝试实现以下逻辑:
运行
ARSCNViewDelegate
,ARSessionDelegate
和AVCaptureMetadataOutputObjectsDelegate
同时出现。连接
ARSCNView
,将视图及其会话委托给自己。连接一个
AVCaptureSession
,将其委托给自己,然后开始会话。开始
ARSCNView
会话,因为官方的例子在viewWillAppear()
中是这样做的,我也是这样做的
应用程序执行 运行 没有任何错误,但我只能从 AVCaptureMetadataOutputObjectsDelegate
获得一些回调,比如 3 到 5,然后它再也不会像 [= 的委托那样被调用=20=] 夺取了它的权限,是我实施了错误的方法还是你不能同时委托 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
。 (不推荐)