Несколько QR-кодов с ARKit - PullRequest
       20

Несколько QR-кодов с ARKit

0 голосов
/ 26 октября 2018

В новом проекте мы планируем создать следующую витрину AR:

Мы хотим иметь стену с трубами и кабелями. На них будут установлены датчики для контроля и мониторинга системы труб / кабелей. Поскольку каждый датчик будет иметь одинаковые размеры и внешний вид, мы планируем добавить отдельные QR-коды для каждого датчика. Прочтение документации ARWorldTrackingConfiguration и ARImageTrackingConfiguration показывает, что ARKit способен распознавать известные изображения. Но требования к изображениям заставляют задуматься, будет ли приложение работать так, как мы хотим, при использовании нескольких QR-кодов:

С обнаружение изображений :

[...], определение искусства в музее или добавление анимированных элементов на постер фильма.

От Apple Keynote:

Хорошие изображения для отслеживания: высокая текстура, высокий локальный контраст, хорошо распределенная гистограмма, без повторяющихся структур

Поскольку QR-коды не полностью соответствуют требованиям, мне интересно, можно ли использовать около 10 QR-кодов, и чтобы ARKit распознавал каждый из них индивидуально и надежно. Особенно, когда, например, 3 кода в поле зрения. У кого-нибудь есть опыт отслеживания нескольких QR-кодов или даже подобной витрины?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Распознавание (нескольких) QR-кодов не имеет ничего общего с ARKit и может быть выполнено тремя различными способами (AVFramework, CIDetector, Vision), из которых последний, на мой взгляд, предпочтительнее, поскольку вы также можете использоватьего возможности отслеживания объектов (VNTrackObjectRequest).Кроме того, в моем опыте это более надежно.

Если вам нужно поместить объекты в сцену ARKit, используя местоположения QR-кодов, вам нужно будет выполнить hitTest в ARFrame, чтобы найти 3D-местоположение кода (преобразование)в мире.В этом месте вам нужно будет разместить собственный ARAnchor.Используя привязку, вы можете добавить пользовательский узел SceneKit к сцене.

ОБНОВЛЕНИЕ : Таким образом, предлагаемая стратегия будет: 1. найти QR-коды и их 2D-местоположение с помощью Vision, 2.найдите их трехмерное местоположение (worldTransform) с помощью ARFrame.hitTest(), 3. создайте пользовательское (в подклассе) ARAnchor и добавьте его в сеанс, 4. в renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) добавьте пользовательский узел (например, SCNText с * 1014)* Ограничение рекламного щита ) для вашего пользовательского 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)
0 голосов
/ 29 октября 2018
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-кодов одновременно.

0 голосов
/ 26 октября 2018

Вам не нужен ARKit для сканирования QR-кодов.

Здесь - хороший учебник о том, как добиться сканирования QR

В iOS 11 встроенное приложение камеры включает функцию, которая позволяет сканировать QR-коды и получать доступ к содержимому QR-кода, например, к URL-адресам, без необходимости загружать стороннее приложение.

Есть также несколько QR-генераторов в сети, которые вы можете проверить это, например, этот или этот .


Вот пример того, как ведет себя приложение камеры iOS по умолчанию

Для ввода «22» служба доставляет пользовательский QR:

enter image description here

При сканировании этого QR вот скриншот iPhone:

enter image description here

Таким образом, вы можете иметь разные QR-коды с разной информацией, отсканировать их и получить информацию.

Вы можете иметь ту же информацию и похожее поведение с пользовательской реализацией. (см. ссылки)

Кроме того, вы можете использовать любую другую библиотеку в зависимости от того, чего вы хотите достичь. (AR / Vision / AV / UIKit даже: P)

...