Возможность отслеживать несколько записей одного и того же ARReferenceImage на iOS 11.3 beta, xCode 9.3 beta, ARKit 1.5

В iOS SDK iOS 11.3 beta, xCode 9.3 beta, ARKit 1.5 дает нам возможность для отслеживания эталонных изображений через камеру так же, как мы это делали с ARToolKit или Vuforia.

Вопрос в том, могу ли я отслеживать количество записей одного и того же эталонного изображения и помещать какую-либо фигуру поверх каждого, как если бы они были отдельными элементами? В документации говорится:

Когда вы запускаете сеанс AR с отслеживанием мира и указываете объекты ARReferenceImage для свойства detectImages конфигурации сеанса, ARKit ищет эти изображения в реальной среде. Когда сеанс распознает изображение, он автоматически добавляет в свой список привязок объект ARImageAnchor для каждого обнаруженного изображения.

Мне удалось загрузить в свой ARWorldTrackingConfiguration три точно таких же изображения (но повернутых по-разному), но он обнаружил только первое изображение попадания (они напечатаны на листе бумаги в виде матрицы). Означает ли это, что я смогу отслеживать только первое обращение для каждого уникального эталонного изображения?

Если у нас есть список якорей, мы можем попытаться вычислить, если это не то же самое точное место, и, может быть, попытаться заставить его искать дальше?

Любая помощь будет оценена по достоинству.


person T. Pasichnyk    schedule 02.03.2018    source источник


Ответы (1)


Я почти уверен, что невозможно отследить несколько случаев появления одного и того же изображения прямо из коробки, так как при обнаружении изображения ему дается ARImageAnchor, и это происходит только один раз:

Если ваш опыт дополненной реальности добавляет к сцене виртуальный контент при обнаружении изображения, это действие по умолчанию выполняется только один раз. Чтобы пользователь мог снова увидеть этот контент без перезапуска приложения, вызовите метод remove (anchor :) сеанса, чтобы удалить соответствующий ARImageAnchor: после удаления привязки ARKit добавит новую привязку при следующем обнаружении изображения.

Сказав это, вы потенциально можете отслеживать количество раз, когда изображение отображается, вручную удаляя его ARImageAnchor через определенный период времени, используя эту встроенную функцию:

func remove(anchor: ARAnchor)

Однако я не думаю, что это сработало бы, если бы у вас было одно и то же изображение в морозе камеры в одно и то же время.

Помимо всего прочего, надеюсь, этот пример поможет вам на вашем пути ...

Создайте две переменные (одну для хранения счетчика обнаружения и одну для хранения привязок):

   var anchors = [ARImageAnchor]()
   var countOfDetectedImages = 0

Потом:

  func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

    //1. If Out Target Image Has Been Detected Than Get The Corresponding Anchor
    guard let currentImageAnchor = anchor as? ARImageAnchor else { return }

    //2. Store The ARImageAnchors
    anchors.append(currentImageAnchor)

    //3. Get The Targets Name
    let name = currentImageAnchor.referenceImage.name!

    print("Image Name = \(name)")

    //4. Increase The Count If The Reference Image Is Called Target
    if name == "target"{

        countOfDetectedImages += 1

        print("\(name) Has Been Detected \(countOfDetectedImages)")

            //6. Remove The Anchor
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                self.augmentedRealitySession.remove(anchor: anchor)
        }
    }

}

И для полного сброса переменных:

 /// Removes All The ARImageAnchors & The Detected Count
func removeAllAnchorsAndResetCount(){

    countOfDetectedImages = 0
    anchors.forEach{ augmentedRealitySession.remove(anchor: $0) }
    anchors.removeAll()
}

Возможный обходной путь:

К вашему сведению, в Apple Documentation есть некоторые примечания, в которых есть методы инициализации для:

init (CGImage, ориентация: CGImagePropertyOrientation, physicalWidth: CGFloat):

Создает новое эталонное изображение из объекта изображения Core Graphics.

init (CVPixelBuffer, ориентация: CGImagePropertyOrientation, PhysicalWidth: CGFloat)

Создает новое эталонное изображение из пиксельного буфера Core Video.

Итак, «возможно», и я не рассматривал это, возможно, вы сможете работать с ориентацией таким образом?

person BlackMirrorz    schedule 02.03.2018
comment
Спасибо за ваш ответ! Я обработаю предоставленную вами информацию. Нужно попробовать хотя бы несколько возможных решений и найти наиболее подходящее. А пока вы подтвердили мою мысль, что из коробки это будет невозможно :) Ура. - person T. Pasichnyk; 02.03.2018