Я делаю iOS, где пользователь делает снимок, а затем я хочу использовать MLKit от Google для Firebase, чтобы обнаружить текст на картинке. Я настроил пользовательскую камеру UIViewController
, которую мы назовем CameraViewController
. Есть простая кнопка, которую пользователь нажимает, чтобы сделать снимок. Я следовал документации Firebase, здесь , но MLKit не работает для меня. Вот код, который у меня есть для вашей ссылки, и затем мы поговорим о том, в чем проблема.
1. Вот мой импорт, делегаты классов и торговые точки:
import UIKit
import AVFoundation
import Firebase
class CameraViewController: UIViewController, AVCapturePhotoCaptureDelegate {
var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
var capturePhotoOutput: AVCapturePhotoOutput?
@IBOutlet var previewView: UIView!
@IBOutlet var captureButton: UIButton!
}
2.В viewDidLoad я настроил «previewView», чтобы у пользователя был «видоискатель»:
override func viewDidLoad() {
super.viewDidLoad()
let captureDevice = AVCaptureDevice.default(for: .video)!
do {
let input = try AVCaptureDeviceInput(device: captureDevice)
captureSession = AVCaptureSession()
captureSession?.addInput(input)
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer?.frame = view.layer.bounds
previewView.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
capturePhotoOutput = AVCapturePhotoOutput()
capturePhotoOutput?.isHighResolutionCaptureEnabled = true
captureSession?.addOutput(capturePhotoOutput!)
} catch {
print(error)
}
}
3. Вот мое действие для кнопки, которая снимает изображение
@IBAction func captureButtonTapped(_ sender: Any) {
guard let capturePhotoOutput = self.capturePhotoOutput else { return }
let photoSettings = AVCapturePhotoSettings()
photoSettings.isAutoStillImageStabilizationEnabled = true
photoSettings.isHighResolutionPhotoEnabled = true
photoSettings.flashMode = .off
capturePhotoOutput.capturePhoto(with: photoSettings, delegate: self)
}
4. Именно здесь я получаю снимок, сделанный с использованием метода делегата didFinishProcessingPhoto
, и начинаю использовать MLKit
func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) {
guard error == nil,
let photoSampleBuffer = photoSampleBuffer else {
print("Error capturing photo: \(String(describing: error))")
return
}
guard let imageData =
AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer, previewPhotoSampleBuffer: previewPhotoSampleBuffer) else {
return
}
let capturedImage = UIImage.init(data: imageData , scale: 1.0)
captureNormal()
DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
self.captureSession?.stopRunning()
self.processText(with: capturedImage!)
// Here is where I call the function processText where MLKit is run
}
}
5.Наконец, вот моя функция processText(with:UIImage)
, которая использует MLKit
func processText(with image: UIImage) {
let vision = Vision.vision()
let textRecognizer = vision.onDeviceTextRecognizer()
let visionImage = VisionImage(image: image)
textRecognizer.process(visionImage) { result, error in
if error != nil {
print("MLKIT ERROR - \(error)")
} else {
let resultText = result?.text
print("MLKIT RESULT - \(resultText)")
}
}
}
Хорошо, это было много, спасибо, что прочитали все это. Хорошо, проблема в том, что это не работает. Я получаю правильный UIImage
на шаге 4, так что это не так. Вот скриншот с примером того, что я пытаюсь сканировать ...
MLKit должен быть в состоянии легко обнаружить этот текст. Но каждый раз, когда я пытаюсь, result?.text
всегда печатается как nil
. У меня нет идей. У кого-нибудь есть идеи как это исправить? Если так, большое спасибо!