基于javacv dnn加载tensorflow模型实现的java版本车牌识别项目dnn-lpr,这个不是最好的实现方式,但也不错,所以开源出来,供java社区的学习玩玩。
源码已经上传到: http://git.jimingyun.cn:88/open/dnn-lp 不需要注册直接当下代码
优点:快速,字符定位准确率高,在闸机口目前实现95%的精确度
缺点:需要大量的车牌字符标记,标记工作繁重,目前项目中仅仅采用了4000张车牌进行字符标记,如果能有更多的标记数据,识别精度可以做到更高
封装后使用非常简单,几行代码就完成识别:
//false:不开启日志输出 "":日志输出目录 1:最大支持并发数
LPR lpr = new LPR(fasle, "", 1);
//加载车牌图片,注意javacv不支持中文的路径
Mat src = imread("H:\\cars_test\\jin_JSS102.jpg");
//识别
List<CarId> ids = lpr.find(src);
//javacv 的Mat实际是在c内存空间里面的,所有操作都是通过jni去调用,所以需要手动回收内存,jvm是没办法去自动回收的
src.close();
//打印识别结果
for(CarId id:ids) {
if(id.getAvgVal() > 0.8) {
tx.append("车牌_id=" + id.getId() + "准确度_val=" + id.getAvgVal() + " ");
id.close();//id 释放资源
}
}
如何使用dnn-lpr?
参照项目里这个类
cn.jiming.dnn.lpr.test.LprTest
识别结果展示:
识别结果 id=浙F79W39 val=1.0
识别结果 id=桂M9G126 val=0.999750188418797
总结:在车牌清晰和角度较正的情况下识别效果比较好,要想解决大角度识别问题,必须引入unet网络对车牌进行定位并通过放射变换矫正车牌,这样就可以识别角度大的车牌了,本人已经有成熟的版本,但不能开源,不过好在可以提供一个公网的服务进行http调用,大家敬请期待吧!