在一个新项目中,我们计划创建以下AR展示:
我们想要一堵墙,上面有一些管道和电缆。它们将安装传感器来控制和监视管道/电缆系统。由于每个传感器将有相同的尺寸和外观,我们计划添加单个QR码到每个传感器。阅读ARWorldTrackingConfiguration和ARImageTrackingConfiguration的文档表明,ARKit能够识别已知的图像。但是,对图像的要求使我怀疑应用程序在使用几个QR代码时是否会像我们希望的那样工作:
.在博物馆里识别艺术或者在电影海报上添加动画元素。
来自苹果的主题演讲:
良好的图像跟踪:高纹理,高局部对比度,良好的直方图分布,无重复结构
由于QR代码不完全符合要求,我想知道是否有可能使用大约10个QR代码,并让ARKit识别每个QR码。特别是当3个代码在视图中时。是否有人有追踪多个QR代码的经验,甚至有类似的展示?
发布于 2018-10-26 08:28:42
识别(几个)QR码与ARKit无关,可以采用3种不同的方式(AVFramework、CIDetector、Vision),我认为后者更好,因为您可能还想使用它的目标跟踪功能(VNTrackObjectRequest)。而且,在我的经验中,它更有活力。
如果您需要使用QR代码的位置在ARKit场景中放置对象,则需要在ARFrame上执行hitTest来查找代码在世界上的三维位置(转换)。在该位置上,您需要放置一个自定义ARAnchor。使用锚点,您可以向场景添加一个自定义SceneKit节点。
UPDATE:因此建议的策略是: 1.查找QR代码及其2D位置,2.用ARFrame.hitTest()查找它们的3D位置(worldTransform),3.创建自定义(子类) ARAnchor并将其添加到会话中,4.在renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor)中为自定义ARAnchor添加一个自定义节点(例如带有广告牌约束的SCNText )。
如果您使用的是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)发布于 2018-10-29 06:25:27
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码可以看到在一个帧在同一时间。
https://stackoverflow.com/questions/53003940
复制相似问题