Распознавание текста MLKit: текст не обнаружен - PullRequest
0 голосов
/ 02 ноября 2018

Я делаю 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, так что это не так. Вот скриншот с примером того, что я пытаюсь сканировать ...

example screenshot

MLKit должен быть в состоянии легко обнаружить этот текст. Но каждый раз, когда я пытаюсь, result?.text всегда печатается как nil. У меня нет идей. У кого-нибудь есть идеи как это исправить? Если так, большое спасибо!

...