Swift MLVision不正确旋转

Swift MLVision不正确旋转,swift,firebase,mlvision,Swift,Firebase,Mlvision,尝试在纵向模式下使用MLVision,但在纵向模式下拍照后,由于旋转不正确,它将只输出两个字符。照片必须在风景中拍摄,否则无法识别文字。试着回顾一下Firebase提供的示例,当这种情况发生在横向和纵向中时,我遇到了完全相反的问题,但除了元数据之外,我无法找到确定图像方向的设置,我尝试更改元数据,但没有成功 var vision: Vision? override func viewDidLoad() { super.viewDidLoad() vision = Vision

尝试在纵向模式下使用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))

}

要引导识别器,您应该使用图像的

// 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
  }
}
这里有一个从你的图像中找到正确方向的方法

// 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
  }
}

终于有机会尝试了,效果很好!非常感谢你的回答!