Я играю с распознаванием изображений на iOS 12, в частности пытаюсь показать эквивалент тегов на распознанных изображениях.
Изначально я создал теги (маленькие полупрозрачные плоскости, которые парят над распознанным изображением) изразличные вычисления, основанные на расположении и размере ReferenceImage.
Это дало мне хорошие результаты, но я думал, что смогу повысить точность дальше.
Я думал, что создание изображений для тегов и отслеживание их ARKit приведет к лучшим результатам.
Поэтому я попытался обрезать основное изображение, создавая фактические изображения для тегов и добавляя их в набор DetectionImages.
К сожалению, возможно, из-за того, что изображения для обнаружения тегов очень малы, плоскости, созданные для тегов, не располагаются на основном изображении, а ближе к POV пользователя.
Но так как основноеизображение по-прежнему отслеживается правильно, мне было интересно, есть ли какой-нибудь способ ограничить метод renderer(:didAdd:for:)
, чтобы сообщить ARKit, что он должен использовать положение основного изображения для вычисления якорей для новых узлов.Возможно ли это?
Спасибо
РЕДАКТИРОВАТЬ
Вот основные части для функциональности тегов.
Я создаю два набора, один из которых содержит изображение, а другой содержит теги дляthe image.
Когда изображение обнаруживается, набор Detection меняет свой набор на другой, чтобы изображения тегов распознавались и добавлялись в сцену с помощью метода showTags ().
Что я пытаюсь достичь, так это каким-то образом направлять ARkit при позиционировании тегов, указывая, что я уже знаю Z-позицию для всех якорей, которые он должен добавить (которая является Z-позицией изображения, которое онраспознается на предыдущем шаге)
func setupImageDetection() {
let configuration = ARWorldTrackingConfiguration()
let mainImageSet: Set = //
let tagImageSet: Set = //
configuration.planeDetection = [.horizontal, .vertical]
configuration.detectionImages = hasRecognizedMainImage ? tagImageSet : mainImageSet
sceneView.session.run(configuration, options: [])
}
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let imageAnchor = anchor as? ARImageAnchor,
let name = imageAnchor.referenceImage.name else { return }
guard hasRecognizedMainImage == false else {
self.showTags(node: node, referenceImage: imageAnchor.referenceImage, name: name)
return
}
let plane = SCNPlane(width: imageAnchor.referenceImage.physicalSize.width, height: imageAnchor.referenceImage.physicalSize.height)
let planeNode = SCNNode(geometry: plane)
planeNode.eulerAngles.x = -.pi / 2
planeNode.geometry?.firstMaterial?.transparency = 0.2
node.addChildNode(planeNode)
hasRecognizedMainImage = true
setupImageDetection()
}
func showTags(node: SCNNode, referenceImage: ARReferenceImage, name: String) {
let tag = getTag(forName: name)
let tagPlane = SCNPlane(width: referenceImage.physicalSize.width, height:referenceImage.physicalSize.height)
let tagPlaneNode = SCNNode(geometry: tagPlane)
tagPlaneNode.geometry?.firstMaterial?.transparent.contents = UIImage(named: "circle")
tagPlaneNode.eulerAngles.x = -.pi / 2
node.addChildNode(tagPlaneNode)
}