实践一下使用aspose.ocr来识别车牌号

aspose.ocr
placeholder image
admin 发布于:2024-11-20 10:22:46
阅读:loading

OCR识别我一直认为是门好东西,但是aspose.ocr组件虽然支持中文,但是它的中文识别结果我觉得真的非常不理想,我想更可能的是我了解的不够深入吧。尽管对中文的识别结果不够理想,但我仍然不想就这么结束了,还得是再深入的摸索摸索,所以本期是使用aspose.ocr来识别图片中的车牌号。

1.23与24版本区别

起初实践的是aspose.ocr的23.10.0的版本,后来又尝试过24.1.0的版本,到现在(2024年11月)最新版本是24.10.0,始终对中文支持的都不是非常科学(肯定是我的掌握深度不够),粗浅的说下这些版本给我的区别:

(1)23及以前的版本整个jar包比较大,都是100多M,200多M的大小;

(2)24及以后的版本整个jar包比较小,精简了一些文件,把一些语言识别文件单独给拆出去了,需要放置在项目下的aspose_data文件夹下,参考该目录的存放结构如下图所示:

image.png

(3)23的版本支持中文的语言为Language.Chi,在24的版本标注为过期了,提供了更为全面的中文支持,包含了普通话、粤语等其他地区性质的语言,Language.Cmn为普通话;

2.车牌号识别

(1)咱们国家的车牌号的规则为中文、字母大写、数字的组合,分别尝试了上面的三个版本的车牌号识别效果,发现使用中文来识别的效果非常的不科学,使用英文的效果又只能识别出字母和数字。

(2)根据车牌号识别的API中提供的忽略字符函数,专门派出了小写字母和大写字母的O与I,因为它们与数字0和1比较相似,在实际车牌号码中并不存在。

(3)本次示例使用aspose.ocr内置的车牌号识别API,来验证从百度上搜索的含车辆车牌的一些图片。

2.1参考代码

@Test
public void test() throws Exception {
    registerOcr24100();
    //是否注册
    System.out.println("License.isValid() = " + License.isValid());
    //加载语言包
    Resources.FetchAll();
    //输出本地的语言包
    final List<String> list = Resources.ListLocal();
    System.out.println("list = " + list);

    AsposeOCR ocr = new AsposeOCR();

    OcrInput input = new OcrInput(InputType.SingleImage);
    input.add(URLDecoder.decode(getClass().getResource("/car/ddd111.jpg").getPath() , StandardCharsets.UTF_8.name()));
    input.add(URLDecoder.decode(getClass().getResource("/car/ddd222.jpg").getPath() , StandardCharsets.UTF_8.name()));
    input.add(URLDecoder.decode(getClass().getResource("/car/ddd333.jpeg").getPath() , StandardCharsets.UTF_8.name()));
    input.add(URLDecoder.decode(getClass().getResource("/car/ddd444.jpg").getPath() , StandardCharsets.UTF_8.name()));
    input.add(URLDecoder.decode(getClass().getResource("/car/ddd555.jpg").getPath() , StandardCharsets.UTF_8.name()));

    CarPlateRecognitionSettings carSettings = new CarPlateRecognitionSettings();
    carSettings.setLanguage(Language.Eng);
    carSettings.setAllowedCharacters(CharactersAllowedType.ALL);
    carSettings.setIgnoredCharacters("abcdefghijklmnopqrstuvwxyzOI");

    final ArrayList<RecognitionResult> results = ocr.RecognizeCarPlate(input, carSettings);

    for (int i = 0; i < results.size(); i++) {
        RecognitionResult result = results.get(i);
        System.out.println("第[" + (i + 1) + "]张图片识别结果:" + result.recognitionAreasText + "---" + result.recognitionText);
    }

}

2.2输出结果

License.isValid() = true
list = [aspose-ocr-advanced-recognition-v1, aspose-ocr-chinese-v1, aspose-ocr-chinese-v2, aspose-ocr-cyrillic-v1]
第[1]张图片识别结果:[BRSCHEGTO-YEU]---BRSCHE
GT
O-YEU

第[2]张图片识别结果:[A-88FC81]---



A-88FC8

1

第[3]张图片识别结果:[RSEMAXB-8LM39]---

RSEMAX


B-8LM39

第[4]张图片识别结果:[A-88FC8]---A-88FC8

第[5]张图片识别结果:[A-88FC8]---A-88FC8

2.3车辆图片素材

ddd111.jpg

(第一张)

ddd222.jpg

(第二张)

ddd333.jpeg

(第三张)

ddd444.jpg

(第四张)

ddd555.jpg

(第五张)

3.其它说明

(1)以上所有图片均来自百度搜索结果,如有异议联系删除;

(2)第一张图片识别的结果不理想,也许是因为它是车辆的车尾照;

(3)后面的几张图片识别结果中的字母和数字识别的还算不错,基本上正确;

(4)由于识别语言设置的为英文,所以只能够识别出字母与数字的结果;

(5)持续关注吧,看看从哪个版本后对中文支持的比较好;

4.20241129

这几天发现aspose.ocr又又又更新了,最新版本是24.11.1,看到语言包又增加了Language.Chinese(所有中文语言,还支持中英文混合语言文本),24版本的Language.Cmn对应的是普通话(中文),于是又把例子运行起来,发现这个版本较之于之前的老版本来说,简直是非常丝滑了,而且这个版本能够准确的识别中文了,所以除了上面的五张图外,又增加了几张包含车牌的车辆图片,参考示例图片和识别结果如下:

ddd666.jpg

(第六张)

ddd777.jpg

(第七张)

识别结果

第[1]张图片识别结果:[119H1E
 DYEL
]---119H1E

DYEL

第[2]张图片识别结果:[辽A-88FC8
 S
 爱一卡汽车
]---



辽A-88FC8
S
爱一卡汽车

第[3]张图片识别结果:[军急避险点元
 H
 川B-8LM39
]---

军急避险点元
H

川B-8LM39

第[4]张图片识别结果:[辽A-88FC8
]---辽A-88FC8

第[5]张图片识别结果:[辽A·88FC8
]---辽A·88FC8

第[6]张图片识别结果:[保足天地人合销售服务店
 中
 勇
 冀F·F01717
]---
保足天地人合销售服务店
中
勇
冀F·F01717

第[7]张图片识别结果:[918
 1888
 京Q·07ZX3
 一海英中
 口一
 AB
]---

918
1888
京Q·07ZX3
一海英中
口一
AB

结果说明

(1)上述示例的识别结果是基于最新版本24.11.1运行的;

(2)上述示例的运行代码设置的语言是Language.Chinese,设置成Cmn识别结果也可以,语言包支持的都是中文汉字、拼字字母、阿拉伯数字;

(3)上述示例的扫描识别结果还是非常好的,除了第一张图片未能识别正确外(可以视为第一张图片自身的素材问题),其他的都比较好;

(4)《aspose.orc识别车牌图片.zip》含代码与图片,不含科学使用方式;


 点赞


 发表评论

当前回复:作者

 评论列表


留言区