Scannen von Dokumenten und Texterkennung mit VisionKit und Vision Framework unter iOS

Heute werden wir das Dokument scannen und den erkannten Text aus diesem Dokument anzeigen. Sie müssen hierfür keine zusätzlichen Bibliotheken installieren: VisionKit ist nützlich zum Scannen und Vision zur Texterkennung.



Stellen Sie zunächst sicher, dass Xcode 11 und iOS 13 installiert sind , und erstellen Sie dann ein neues Projekt mit Storyboard- Unterstützung .

Wir scannen mit einer Videokamera. Wir müssen also NSCameraUsageDescription zu Info.plist hinzufügen , ohne diese Anwendung stürzt es ab.



Scannen


Zum Scannen von Dokumenten verwenden wir das VisionKit Framework . Um den Bildschirm zum Scannen zu öffnen, müssen Sie ein neues Beispiel aus VNDocumentCameraViewController erstellen und Folgendes ausgeben:

let scanner = VNDocumentCameraViewController()
scanner.delegate = self
present(scanner, animated: true)

Fügen Sie VNDocumentCameraViewControllerDelegate zu ViewController hinzu :

class ViewController: UIViewController, VNDocumentCameraViewControllerDelegate {
...

Schließen Sie den geöffneten Bildschirm, nachdem Sie auf "Abbrechen" oder einen Fehler geklickt haben:

func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
  controller.dismiss(animated: true)
}

func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
  controller.dismiss(animated: true)
}

Nach dem Scannen und Klicken auf "Speichern" funktioniert Folgendes:

func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
  for i in 0 ..< scan.pageCount {
    let img = scan.imageOfPage(at: i)
    // recognizeText(inImage: img)
  }
  controller.dismiss(animated: true)
}

Jede Seite kann einzeln bearbeitet werden.

Texterkennung


Wir haben das Scannen herausgefunden und extrahieren jetzt den Text.

Damit alles reibungslos verläuft, werden wir im Hintergrund eine Erkennung durchführen. Erstellen Sie dazu eine DispatchQueue :

lazy var workQueue = {
  return DispatchQueue(label: "workQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)
}()

Für die Erkennung benötigen wir einen VNImageRequestHandler mit einem Bild und VNRecognizeTextRequest mit den Optionen RecognitionLevel , CustomWords , RecognitionLanguages sowie einen Completion-Handler, der das Ergebnis in Textform liefert . Nach Abschluss sammeln wir die besten Textoptionen und zeigen Folgendes an:

lazy var textRecognitionRequest: VNRecognizeTextRequest = {
    let req = VNRecognizeTextRequest { (request, error) in
        guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
        
        var resultText = ""
        for observation in observations {
            guard let topCandidate = observation.topCandidates(1).first else { return }
            resultText += topCandidate.string
            resultText += "\n"
        }
        
        DispatchQueue.main.async {
            self.txt.text = resultText
        }
    }
    return req
}()

VNImageRequestHandler :

func recognizeText(inImage: UIImage) {
    guard let cgImage = inImage.cgImage else { return }
    
    workQueue.async {
        let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
        do {
            try requestHandler.perform([self.textRecognitionRequest])
        } catch {
            print(error)
        }
    }
}

Neuester ViewController


import UIKit
import Vision
import VisionKit

class ViewController: UIViewController, VNDocumentCameraViewControllerDelegate {
    @IBOutlet weak var txt: UITextView!
    
    lazy var workQueue = {
        return DispatchQueue(label: "workQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem)
    }()
    
    lazy var textRecognitionRequest: VNRecognizeTextRequest = {
        let req = VNRecognizeTextRequest { (request, error) in
            guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
            
            var resultText = ""
            for observation in observations {
                guard let topCandidate = observation.topCandidates(1).first else { return }
                resultText += topCandidate.string
                resultText += "\n"
            }
            
            DispatchQueue.main.async {
                self.txt.text = self.txt.text + "\n" + resultText
            }
        }
        return req
    }()

    @IBAction func startScan(_ sender: Any) {
        txt.text = ""
        
        let scanner = VNDocumentCameraViewController()
        scanner.delegate = self
        present(scanner, animated: true)
    }
    
    func recognizeText(inImage: UIImage) {
        guard let cgImage = inImage.cgImage else { return }
        
        workQueue.async {
            let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:])
            do {
                try requestHandler.perform([self.textRecognitionRequest])
            } catch {
                print(error)
            }
        }
    }
    
    // MARK: - Document Camera VC Delegate
    
    func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
        for i in 0 ..< scan.pageCount {
            let img = scan.imageOfPage(at: i)
            recognizeText(inImage: img)
        }
        
        controller.dismiss(animated: true)
    }
    
    func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
        controller.dismiss(animated: true)
    }
    
    func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
        print(error)
        controller.dismiss(animated: true)
    }
    
}




Was weiter?


Dokumentation:
developer.apple.com/documentation/vision
developer.apple.com/documentation/visionkit

WWDC-Sprachframework-Video:
developer.apple.com/videos/all-videos/?q=Vision

GitHub-Projekt:
github.com/usenbekov / Vision-Demo

Source: https://habr.com/ru/post/undefined/


All Articles