Created
May 26, 2021 04:42
-
-
Save anupamchugh/e605507e69099fc8e748ef91f8898b40 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import Vision | |
import VisionKit | |
class ViewController: UIViewController, VNDocumentCameraViewControllerDelegate { | |
@IBOutlet weak var imageView: UIImageView! | |
@IBOutlet weak var textView: UITextView! | |
var textRecognitionRequest = VNRecognizeTextRequest(completionHandler: nil) | |
private let textRecognitionWorkQueue = DispatchQueue(label: "MyVisionScannerQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .workItem) | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
textView.isEditable = false | |
setupVision() | |
} | |
@IBAction func btnTakePicture(_ sender: Any) { | |
let scannerViewController = VNDocumentCameraViewController() | |
scannerViewController.delegate = self | |
present(scannerViewController, animated: true) | |
} | |
private func setupVision() { | |
textRecognitionRequest = VNRecognizeTextRequest { (request, error) in | |
guard let observations = request.results as? [VNRecognizedTextObservation] else { return } | |
var detectedText = "" | |
for observation in observations { | |
guard let topCandidate = observation.topCandidates(1).first else { return } | |
print("text \(topCandidate.string) has confidence \(topCandidate.confidence)") | |
detectedText += topCandidate.string | |
detectedText += "\n" | |
} | |
DispatchQueue.main.async { | |
self.textView.text = detectedText | |
self.textView.flashScrollIndicators() | |
} | |
} | |
textRecognitionRequest.recognitionLevel = .accurate | |
} | |
private func processImage(_ image: UIImage) { | |
imageView.image = image | |
recognizeTextInImage(image) | |
} | |
private func recognizeTextInImage(_ image: UIImage) { | |
guard let cgImage = image.cgImage else { return } | |
textView.text = "" | |
textRecognitionWorkQueue.async { | |
let requestHandler = VNImageRequestHandler(cgImage: cgImage, options: [:]) | |
do { | |
try requestHandler.perform([self.textRecognitionRequest]) | |
} catch { | |
print(error) | |
} | |
} | |
} | |
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) { | |
guard scan.pageCount >= 1 else { | |
controller.dismiss(animated: true) | |
return | |
} | |
let originalImage = scan.imageOfPage(at: 0) | |
let newImage = compressedImage(originalImage) | |
controller.dismiss(animated: true) | |
processImage(newImage) | |
} | |
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) { | |
print(error) | |
controller.dismiss(animated: true) | |
} | |
func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) { | |
controller.dismiss(animated: true) | |
} | |
func compressedImage(_ originalImage: UIImage) -> UIImage { | |
guard let imageData = originalImage.jpegData(compressionQuality: 1), | |
let reloadedImage = UIImage(data: imageData) else { | |
return originalImage | |
} | |
return reloadedImage | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment