我看到有人ARKit
与ARSCNView
一起运行,他们可以在相机中获取所说的QRCode矩形,并在某个位置以某种方式渲染某些东西将QRCode放置在空间中。我认为他们通过委派AVCaptureMetadataOutputObjectsDelegate
来做到这一点,所以我继续尝试实现以下逻辑:
1-同时运行ARSCNViewDelegate
,ARSessionDelegate
和AVCaptureMetadataOutputObjectsDelegate
。
2-连接ARSCNView
,将视图及其会话委派给自己。
3-连接AVCaptureSession
,委托给自己,然后开始会话。
4-开始ARSCNView
会话,因为官方示例在viewWillAppear()
中执行了此操作,我做了同样的事情。
应用程序确实运行没有任何错误,但是我只能从AVCaptureMetadataOutputObjectsDelegate
获得一些回调,比如3到5,然后它再也不会被调用,就像ARSession的代表抓住它的权限一样,是我实施错误的方法,或者您只能同时委派ARSession
和AVCaptureSession
?
答案 0 :(得分:4)
我完全按照你的描述完成了同样的问题。似乎arkit依赖于AVCapture系统,并且不支持一次使用多个捕获设备。我找到了两个解决方案。
启动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)
}
}
}
(https://github.com/donMichaelL/qrCode-Arkit.git)