首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >几种具有ARKit的QR码

几种具有ARKit的QR码
EN

Stack Overflow用户
提问于 2018-10-26 07:50:47
回答 2查看 2.1K关注 0票数 0

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

我们想要一堵墙,上面有一些管道和电缆。它们将安装传感器来控制和监视管道/电缆系统。由于每个传感器将有相同的尺寸和外观,我们计划添加单个QR码到每个传感器。阅读ARWorldTrackingConfigurationARImageTrackingConfiguration的文档表明,ARKit能够识别已知的图像。但是,对图像的要求使我怀疑应用程序在使用几个QR代码时是否会像我们希望的那样工作:

来自detectionImages

.在博物馆里识别艺术或者在电影海报上添加动画元素。

来自苹果的主题演讲:

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

由于QR代码不完全符合要求,我想知道是否有可能使用大约10个QR代码,并让ARKit识别每个QR码。特别是当3个代码在视图中时。是否有人有追踪多个QR代码的经验,甚至有类似的展示?

EN

回答 2

Stack Overflow用户

发布于 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很容易地传递到处理程序-

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-10-29 06:25:27

代码语言:javascript
复制
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码可以看到在一个帧在同一时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53003940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档