Я почти уверен, что невозможно отследить несколько случаев появления одного и того же изображения прямо из коробки, так как при обнаружении изображения ему дается 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