MLVision неправильное вращение
Попытка использовать MLVision в портретном режиме, однако после того, как я сделаю снимок в портретном режиме, он выведет только пару символов из-за неправильного поворота. Снимок должен быть сделан в ландшафтном режиме, иначе текст не распознается. Попытался перейти к примеру, предоставленному Firebase, где я столкнулся с совершенно противоположной проблемой, когда это происходит в альбомной ориентации и работает в портретной ориентации, однако не смог найти настройки, которая бы определяла ориентацию изображения помимо метаданных, которые я пытался изменить но безуспешно
var vision: Vision?
override func viewDidLoad() {
super.viewDidLoad()
vision = Vision.vision()
}
func recognize(Image: VisionImage){
let textRecognizer = vision?.onDeviceTextRecognizer()
textRecognizer?.process(Image) { result, error in
guard error == nil, let result = result else {
// ...
return
}
print(result.text)
// Recognized text
}
}
@IBAction func scanDocument(_ sender: Any) {
let vc = UIImagePickerController()
vc.sourceType = .camera
vc.allowsEditing = false
vc.delegate = self
present(vc, animated: true)
}
func imagePickerController(_ picker: UIImagePickerController,
didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
picker.dismiss(animated: true, completion: nil)
guard let selectedImage = info[.originalImage] as? UIImage else {
fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
}
recognize(Image: VisionImage(image: selectedImage))
}
1 ответ
Решение
Чтобы направлять распознаватель, вы должны указать ориентацию вашего изображения.
// Define the metadata for the image.
let imageMetadata = VisionImageMetadata()
imageMetadata.orientation = UIUtilities.visionImageOrientation(from: image.imageOrientation)
// Initialize a VisionImage object with the given UIImage.
let visionImage = VisionImage(image: image)
visionImage.metadata = imageMetadata
и вот вспомогательный метод, чтобы найти правильную ориентацию из вашего изображения
public static func imageOrientation(fromDevicePosition devicePosition: AVCaptureDevice.Position = .back
) -> UIImageOrientation {
var deviceOrientation = UIDevice.current.orientation
if deviceOrientation == .faceDown || deviceOrientation == .faceUp ||
deviceOrientation == .unknown {
deviceOrientation = currentUIOrientation()
}
switch deviceOrientation {
case .portrait:
return devicePosition == .front ? .leftMirrored : .right
case .landscapeLeft:
return devicePosition == .front ? .downMirrored : .up
case .portraitUpsideDown:
return devicePosition == .front ? .rightMirrored : .left
case .landscapeRight:
return devicePosition == .front ? .upMirrored : .down
case .faceDown, .faceUp, .unknown:
return .up
}
}