Hello I'm relatively new to Swift, still learning new things. I want a to build a text recognizer that filters all numbers out of an image and sort them. For example, when i have an creditCard with multiple numbers. How can i recognize the specific fields (IBAN, BIC etc.). Finally this fields in the user interface then should automatic been filled with the cards input image. My first approach was, to build the main text recognizer. That works ok. But i don't know, how to continue und sort all the data, that was captured for the image. Any tips? Thanks
struct ScanDocumentView: UIViewControllerRepresentable {
@Environment(\.presentationMode) var presentationMode
@Binding var recognizedText: String
@Binding var recognizedImage: Image
func makeCoordinator() -> Coordinator {
Coordinator(recognizedText: $recognizedText, recognizedImage: $recognizedImage, parent: self)
}
func makeUIViewController(context: Context) -> VNDocumentCameraViewController {
let documentViewController = VNDocumentCameraViewController()
documentViewController.delegate = context.coordinator
return documentViewController
}
func updateUIViewController(_ uiViewController: VNDocumentCameraViewController, context: Context) {
// nothing to do here
}
class Coordinator: NSObject, VNDocumentCameraViewControllerDelegate {
var recognizedText: Binding<String>
var recognizedImage: Binding<Image>
var parent: ScanDocumentView
init(recognizedText: Binding<String>, recognizedImage: Binding<Image>,parent: ScanDocumentView) {
self.recognizedText = recognizedText
self.recognizedImage = recognizedImage
self.parent = parent
}
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
let extractedImages = extractImages(from: scan)
let processedText = recognizeText(from: extractedImages)
recognizedText.wrappedValue = processedText
let originalImage = scan.imageOfPage(at: 0)
let newImage = compressedImage(originalImage)
processImage(newImage)
parent.presentationMode.wrappedValue.dismiss()
}
fileprivate func extractImages(from scan: VNDocumentCameraScan) -> [CGImage] {
var extractedImages = [CGImage]()
for index in 0..<scan.pageCount {
let extractedImage = scan.imageOfPage(at: index)
guard let cgImage = extractedImage.cgImage else { continue }
extractedImages.append(cgImage)
}
return extractedImages
}
private func processImage(_ uiImage: UIImage) {
recognizedImage.wrappedValue = Image(uiImage: uiImage)
}
func compressedImage(_ originalImage: UIImage) -> UIImage {
guard let imageData = originalImage.jpegData(compressionQuality: 1),
let reloadedImage = UIImage(data: imageData) else {
return originalImage
}
return reloadedImage
}
fileprivate func recognizeText(from images: [CGImage]) -> String {
var entireRecognizedText = ""
let recognizeTextRequest = VNRecognizeTextRequest { (request, error) in
guard error == nil else { return }
guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
let maximumRecognitionCandidates = 1
for observation in observations {
guard let candidate = observation.topCandidates(maximumRecognitionCandidates).first else { continue }
entireRecognizedText += "\(candidate.string)\n"
}
}
recognizeTextRequest.recognitionLevel = .accurate
for image in images {
let requestHandler = VNImageRequestHandler(cgImage: image, options: [:])
try? requestHandler.perform([recognizeTextRequest])
}
return entireRecognizedText