我基本上遵循了 VNRecognizeTextRequest 上这个很棒的教程并修改了一些内容:
https://bendodson.com/weblog/2019/06/11/detecting-text-with-vnrecognizetextrequest-in-ios-13/
我正在尝试识别来自具有七段式显示器的设备的文本,这对于这个框架来说似乎有点棘手。通常它是有效的,但是带有逗号的数字很难,如果有空格也是如此。我想知道是否有可能“训练”这个识别引擎。另一种可能性可能是以某种方式告诉它专门寻找数字,也许这样它就可以将更多的处理能力集中在数字上,而不是一般地寻找文本?
我使用这个修改后的代码来请求:
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
该类中有3个与文本识别相关的全局变量:
private var ocrRequest = VNRecognizeTextRequest(completionHandler: nil)
private var bestConfidence: Float = 0
private var bestCandidate: Float?
提前感谢您的回答,尽管这与代码不直接相关,而是更多与概念相关(即“我做错了什么/我是否忽略了一个重要功能?”等)。
有效的示例图像:
一半有效的例子:
不起作用的示例:
我有类似的问题,但尝试读取水表。 将
VNRecognizeTextRequest.recognitionLevel
从 .accurate
更改为 .fast
帮助我解决了这个问题。