在一个新项目中,我们计划创建以下AR展示柜:
我们想要一堵墙,上面有一些管道和电缆。这些将安装传感器以控制和监视管道/电缆系统。由于每个传感器具有相同的尺寸和外观,因此我们计划为每个传感器添加单独的QR码。阅读ARWorldTrackingConfiguration和ARImageTrackingConfiguration的文档表明,ARKit能够识别已知图像。但是对图像的要求让我想知道在使用多个QR码时,应用程序是否可以按我们希望的方式运行:
[...],标识博物馆中的艺术品或在电影海报中添加动画元素。
摘自Apples主题演讲:
要跟踪的图像好:高纹理,高局部对比度,直方图分布均匀,无重复结构
由于QR码不完全符合要求,我想知道是否有可能使用大约10个QR码并使ARKit分别可靠地识别它们。尤其是当视图中有3个代码。有没有人有追踪多个QR码甚至是类似展示柜的经验?
答案 0 :(得分:1)
识别(几个)QR码与ARKit无关,可以通过3种不同的方式(AVFramework,CIDetector
,Vision)完成,在我看来,后者是可取的,因为您可能还希望使用其对象跟踪功能(VNTrackObjectRequest)。根据我的经验,它也更可靠。
如果您需要使用QR代码的位置将对象放置在ARKit场景中,则需要在ARFrame上执行hitTest
来查找代码在世界上的3D位置(变换)。在该位置,您需要放置一个自定义ARAnchor。使用锚点,可以向场景添加自定义SceneKit节点。
更新:因此建议的策略是:1.使用Vision查找QR码及其2D位置,2.使用worldTransform
查找其3D位置(ARFrame.hitTest()
) ,3.创建自定义(子类化)ARAnchor
并将其添加到会话中,4.在renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)
中添加一个自定义节点(例如SCNText
,具有广告牌约束 )用于您的自定义ARAnchor
。
如果有机会使用RxSwift,它可以使用RxVision框架完成最简单的操作,因为它可以轻松地将相关的ARFrame传递到处理程序中-
var requests = [RxVNRequest<ARFrame>]()
let barcodesRequest: RxVNDetectBarcodesRequest<ARFrame> = VNDetectBarcodesRequest.rx.request(symbologies: [.QR])
self
.barcodesRequest
.observable
.observeOn(Scheduler.main)
.subscribe { [unowned self] (event) in
switch event {
case .next(let completion):
self.detectCodeHandler(value: completion.value, request: completion.request, error: completion.error) // define the method first
default:
break
}
}
.disposed(by: disposeBag)
答案 1 :(得分:1)
if let image = anchor as? ARImageAnchor{
guard let buffer: CVPixelBuffer = sceneView.session.currentFrame?.capturedImage else {
print("could not get a pixel buffer")
return
}
let image = CIImage(cvPixelBuffer: buffer)
var message = ""
let features = detector.features(in: image)
for feature in features as! [CIQRCodeFeature] {
message = feature.messageString
break
}
if image.referenceImage.name == "QR1"{
if message == "QR1"{
// add node 1
}else{
sceneView.session.remove(anchor: anchor)
}
} else if image.referenceImage.name == "QR2"{
if message == "QR2"{
// add node 2
}else{
sceneView.session.remove(anchor: anchor)
}
}
}
detector
是CIDetector
。
还需要检查renderer(_:didUpdate:for:)
。
我研究了4个QR码。
假设在同一帧中无法同时看到两个QR码,则可以正常工作。
答案 2 :(得分:-1)
您不需要ARKit即可扫描QR。
Here是有关如何实现QR扫描的不错的教程
在iOS 11中,本机相机应用程序包含的功能使您可以扫描QR码并访问URL之类的QR码内容,而无需下载第三方应用程序。
在线上还有几个QR生成器可以测试,例如this one或this one。
这是默认iOS相机应用程序的行为示例
对于输入“ 22”,服务将提供自定义QR:
扫描此QR时,这是iPhone的屏幕截图:
因此,您可以拥有具有不同信息的不同QR,然后对其进行扫描并获得信息的归属。
使用自定义实现,您可以具有相同的信息和类似的行为。 (请参阅提供的链接)
最重要的是,您可以根据想要实现的目的使用任何其他库。 (AR / Vision / AV / UIKit甚至:P)