使用ARKit的几个QR码

时间:2018-10-26 07:50:48

标签: ios qr-code augmented-reality arkit

在一个新项目中,我们计划创建以下AR展示柜:

我们想要一堵墙,上面有一些管道和电缆。这些将安装传感器以控制和监视管道/电缆系统。由于每个传感器具有相同的尺寸和外观,因此我们计划为每个传感器添加单独的QR码。阅读ARWorldTrackingConfigurationARImageTrackingConfiguration的文档表明,ARKit能够识别已知图像。但是对图像的要求让我想知道在使用多个QR码时,应用程序是否可以按我们希望的方式运行:

来自detectionImages

  

[...],标识博物馆中的艺术品或在电影海报中添加动画元素。

摘自Apples主题演讲:

  

要跟踪的图像好:高纹理,高局部对比度,直方图分布均匀,无重复结构

由于QR码不完全符合要求,我想知道是否有可能使用大约10个QR码并使ARKit分别可靠地识别它们。尤其是当视图中有3个代码。有没有人有追踪多个QR码甚至是类似展示柜的经验?

3 个答案:

答案 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)
        }
    }
}

detectorCIDetector
还需要检查renderer(_:didUpdate:for:)
我研究了4个QR码。 假设在同一帧中无法同时看到两个QR码,则可以正常工作。

答案 2 :(得分:-1)

您不需要ARKit即可扫描QR。

Here是有关如何实现QR扫描的不错的教程

在iOS 11中,本机相机应用程序包含的功能使您可以扫描QR码并访问URL之类的QR码内容,而无需下载第三方应用程序。

在线上还有几个QR生成器可以测试,例如this onethis one


这是默认iOS相机应用程序的行为示例

对于输入“ 22”,服务将提供自定义QR:

enter image description here

扫描此QR时,这是iPhone的屏幕截图:

enter image description here

因此,您可以拥有具有不同信息的不同QR,然后对其进行扫描并获得信息的归属。

使用自定义实现,您可以具有相同的信息和类似的行为。 (请参阅提供的链接)

最重要的是,您可以根据想要实现的目的使用任何其他库。 (AR / Vision / AV / UIKit甚至:P)