我写了一个代码来读取护照上的MRZ,使用谷歌文本Api从这个链接文本API代码实验室。
一切正常,但大多数情况下,它将护照上的 MRZ 读取
例如,OCR 假设读取
P<UTOERIKSSON<<ANNA<MARIA<<<<<<<<<<<<<<<<<<<
L898902C<3UTO6908061F9406236ZE184226B<<<<<14
,
但它输出类似这样的东西
PKUTOERIKSSON ANNA<MARIAK<<KK<<<<
L898902C<3UTO6908061F9406236ZE184226Bk<<<14
如何解决此问题?
我在示例项目中使用了同一库的迁移版本,但我从未遇到过问题。https://developers.google.com/ml-kit/vision/text-recognition/
它读取 mrz 文本的速度太快且太正确。在我尝试过基于 Google Tesseract 的 OCR 库之前,结果在我的入门级手机上并不好。然后我把OCR库换成了谷歌MLKit文本识别,它可以清晰快速地读取护照/身份证文本。我已经使用 MRZInfo 解析了读取文本并验证字段是否正确。
以下是我的实现示例:
https://github.com/alimertozdemir/EPassportNFCReader/blob/master/app/src/main/java/com/alimert/mlkit/text/TextRecognitionProcessor.java
private void filterScannedText(GraphicOverlay graphicOverlay, Text.Element element) {
GraphicOverlay.Graphic textGraphic = new TextGraphic(graphicOverlay, element, Color.GREEN);
scannedTextBuffer += element.getText();
String docPrefix;
if(scannedTextBuffer.contains(StringUtil.TYPE_PASSPORT) || scannedTextBuffer.contains(StringUtil.TYPE_ID_CARD)) {
graphicOverlay.add(textGraphic);
docPrefix = scannedTextBuffer.contains(StringUtil.TYPE_PASSPORT) ? StringUtil.TYPE_PASSPORT : StringUtil.TYPE_ID_CARD;
scannedTextBuffer = scannedTextBuffer.substring(scannedTextBuffer.indexOf(docPrefix));
finishScanning(scannedTextBuffer);
}
}