Целью прототипа является сканирование различных продуктов, расположенных на разных стойках на полке (предположим, что любой продовольственный магазин где чипы расположены на большой полке и расположены в стойках внутри полки).
Мы разработали пакет .ml, который будет предоставлять прогнозы продуктов и связанные с ними координаты ограничивающего прямоугольника для данного входного изображения. . Мы использовали делегат ARSessionDelegate
Код: Выделить всё
func session(_ session: ARSession, didUpdate frame: ARFrame)Код: Выделить всё
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let pixelBuffer = frame.capturedImage as CVPixelBuffer? else { return }
DispatchQueue.global(qos: .userInitiated).async {
do {
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right, options: [:])
try handler.perform([self.visionRequest])
} catch {
print("error in classify fame error \(error)")
}
}
}
Код: Выделить всё
lazy var visionRequest: VNCoreMLRequest = {
let request = VNCoreMLRequest(model: mlModel, completionHandler: {
[weak self] request, error in
DispatchQueue.main.async {
self?.processPredictions(predictions: request.results as? [VNRecognizedObjectObservation] ?? [])
}
})
return request
}()
Код: Выделить всё
func processPredictions(predictions: [VNRecognizedObjectObservation]) {
print("count \(predictions.count)")
overlayLayer.sublayers?.forEach { $0.removeFromSuperlayer() }
for prediction in predictions {
let boundingBox = prediction.boundingBox
let centroid = CGPoint(
x: boundingBox.origin.x + boundingBox.width / 2,
y: boundingBox.origin.y + boundingBox.height / 2
)
if let worldTransform = convertToWorldPosition(from: centroid, frame: self.arView.session.currentFrame!) {
let anchor = ARAnchor(name: "Detected Object", transform: worldTransform)
arView.session.add(anchor: anchor)
lastAnchors[anchor.identifier] = worldTransform
}
}
}
private func convertToWorldPosition(from point: CGPoint, frame: ARFrame) -> simd_float4x4? {
let hitTestResults = frame.hitTest(point, types: [.featurePoint, .estimatedHorizontalPlane])
return hitTestResults.first?.worldTransform
}
- Привязки не помещаются в центр ограничивающего
блока. - Якоря продолжают плавать по экрану.
- Якорь не отображается точно заданный центроид местоположения.
Подробнее здесь: https://stackoverflow.com/questions/793 ... -visionkit
Мобильная версия