Фреймворки Vision и ARKit в проекте Xcode
Я хочу создать приложение ARKit, используя Xcode. Я хочу, чтобы он распознавал общий прямоугольник без нажатия кнопки и чтобы впоследствии прямоугольник выполнял определенную функцию.
Как это сделать?
2 ответа
Вы не должны ARKit
распознавать только прямоугольники Vision
,
Для распознавания общих прямоугольников используйте VNDetectRectanglesRequest
,
Как вы правильно написали, вам нужно использовать Vision
или же CoreML
фреймворки в вашем проекте вместе с ARKit. Также вы должны создать предварительно обученную модель машинного обучения (.mlmodel
файл), чтобы классифицировать входные данные, чтобы распознать ваш общий прямоугольник.
Для создания модели обучения используйте один из следующих ресурсов: TensorFlow, Turi, Caffe или Keras.
С помощью .mlmodel
с тегами классификации внутри него, запросы Vision возвращают результаты как VNRecognizedObjectObservation
объекты, которые идентифицируют объекты, найденные в захваченной сцене. Таким образом, если соответствующий тег изображения доступен через процесс распознавания в ARSKView, тогда ARAnchor
будет создан (и SK
/SCN
объект может быть размещен на этом ARAnchor
).
Вот фрагмент кода на тему "как это работает":
import UIKit
import ARKit
import Vision
import SpriteKit
.................................................................
// file – ARBridge.swift
class ARBridge {
static let shared = ARBridge()
var anchorsToIdentifiers = [ARAnchor : String]()
}
.................................................................
// file – Scene.swift
DispatchQueue.global(qos: .background).async {
do {
let model = try VNCoreMLModel(for: Inceptionv3().model)
let request = VNCoreMLRequest(model: model, completionHandler: { (request, error) in
DispatchQueue.main.async {
guard let results = request.results as? [VNClassificationObservation], let result = results.first else {
print ("No results.")
return
}
var translation = matrix_identity_float4x4
translation.columns.3.z = -0.75
let transform = simd_mul(currentFrame.camera.transform, translation)
let anchor = ARAnchor(transform: transform)
ARBridge.shared.anchorsToIdentifiers[anchor] = result.identifier
sceneView.session.add(anchor: anchor)
}
}
let handler = VNImageRequestHandler(cvPixelBuffer: currentFrame.capturedImage, options: [:])
try handler.perform([request])
} catch {
print(error)
}
}
.................................................................
// file – ViewController.swift
func view(_ view: ARSKView, nodeFor anchor: ARAnchor) -> SKNode? {
guard let identifier = ARBridge.shared.anchorsToIdentifiers[anchor] else {
return nil
}
let labelNode = SKLabelNode(text: identifier)
labelNode.horizontalAlignmentMode = .center
labelNode.verticalAlignmentMode = .center
labelNode.fontName = UIFont.boldSystemFont(ofSize: 24).fontName
return labelNode
}
И вы можете скачать два проекта Apple (пример кода), написанных инженерами Vision:
Распознавание объектов в живом захвате
Классификация изображений с помощью Vision и Core ML
Надеюсь это поможет.