Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

VNRecognizeTextRequest digital / seven-segment numbers

I basically followed this great tutorial on VNRecognizeTextRequest and modified some things:

https://bendodson.com/weblog/2019/06/11/detecting-text-with-vnrecognizetextrequest-in-ios-13/

I am trying to recognise text from devices with seven-segment-style displays which seems to get a bit tricky for this framework. Often it works, but numbers with comma are hard and if there's a a gap as well. I'm wondering whether there is the possibility to "train" this recognition engine. Another possibility might be to somehow tell it to specifically look for numbers, maybe then it can focus more processing power on that instead of generically looking for text?

I use this modified code for the request:

ocrRequest = VNRecognizeTextRequest { (request, error) in
    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }

    for observation in observations {
        guard let topCandidate = observation.topCandidates(1).first else { continue }
        let topCandidateText = topCandidate.string

        if let float = Float(topCandidateText), topCandidate.confidence > self.bestConfidence {
            self.bestCandidate = float
            self.bestConfidence = topCandidate.confidence
        }
    }

    if self.bestConfidence >= 0.5 {
        self.captureSession?.stopRunning()

        DispatchQueue.main.async {
            self.found(measurement: self.bestCandidate!)
        }
    }
}

ocrRequest.recognitionLevel = .accurate
ocrRequest.minimumTextHeight = 1/10
ocrRequest.recognitionLanguages = ["en-US", "en-GB"]
ocrRequest.usesLanguageCorrection = true

There are 3 global variables in this class regarding the text recognition:

private var ocrRequest = VNRecognizeTextRequest(completionHandler: nil)
private var bestConfidence: Float = 0
private var bestCandidate: Float?

Thanks in advance for your answers, even though this is not directly code-related, but more concept-related (i.e. "am I doing something wrong / did I overlook an important feature?" etc.).

Example image that work:

93

Example that half works:

5.8 (recognises 58)

Example that does not work:

91 (it has a very low confidence for "91" and often thinks it's just 9 or 9!)

like image 435
unixb0y Avatar asked Oct 11 '25 20:10

unixb0y


1 Answers

I have a similar problem but tried to read water meters. And changing VNRecognizeTextRequest.recognitionLevel from .accurate to .fast helped me to fix this problem.

like image 124
Ivan Androsenko Avatar answered Oct 16 '25 05:10

Ivan Androsenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!