Android车牌识别,从图片识别到扫描识别

由于项目中用到了车牌识别的功能,就研究下了扫描的一些逻辑。
1. 图片识别
刚才的时候,我们识别车牌是用户拍一张带有车牌号的照片,然后我们传到服务端去,服务端去进行图片识别,然后把结果返回来。这样有一些明显的缺点,就是需要进行网络传输,会比较耗时。然后每次只传输一张图片,样本数量少,识别的错误会很大。
2. 扫描识别
然后参考了二维码扫描的逻辑,感觉它的效率很高,速度快,成功率又高。就朝这个方向进发了。这里写图片描述
首先就是把二维码扫描的页面搬过来了,看起来有点样子了,上面两个圈的是用来对焦的,有一个矩形框,可以让用户把车牌放到框里面。
既然要提高传输速率,就必须把图片识别的算法搬到客户端来,(这里非常感谢飞雪大神,提供了车牌识别的C++算法。)所以必须先搭建NDK环境,编译C++代码,生成so文件,再进过JNI调用。这样就可以在安卓手机本地去实现车牌的识别了。
第二步,获取图片,既然是扫描,那当然是没有拍照按钮的,预览页面显示的内容就是我所需要去识别的目标。幸运的是自定义相机提供了一个回调方法Camera.setPreviewCallback(byte[] data, Camera camera),只要一打开预览
,这个回调就会一直进行,所以必须每个一段时间去取样本,这里暂定200ms取一次预览。
第三步,拿着预览照片转成Bitmap类型,使用JNI调用C++算法,这样就会给我返回车牌号了。
第四步,到上面为止,已经可以拿到车牌号了,但是尽然是扫描,一次结果不足以让人信服,所以每个200ms返回的结果我们都进行保存,知道有一个结果重复3次,我们才认定为这个结果是可信的,这样就大大提高了准确性。
最后再讲讲做个车牌识别遇到的坑,以及一些优化
1. OOM
只要是涉及到图片有关功能的必须要解决的问题,我们每个200ms获取一张图片,那产生的图片数量是很大的,所以必须要优化好。这里做的就是,每次识别完一张图片就把bitmap回收掉。这样有时候还是会OOM,之后就尝试了降低预览图片的质量,因为我们只需要识别出车牌就好了,图片质量低,是没有影响的。这样一来大部分手机就可以正常识别了。
2. 提高识别速度
抠出车牌区域,因为C++算法里面,需要先确定车牌位置,我只把车牌号所在的区域传给C++算法,这样将会大大提高算法识别的效率,既可以提高速度,又提高正确率,因为去掉了大部分无关部分。
其实还有很大可以优化的地方,比如预览画面可能会扭曲,倾斜扫描效率不高等问题,这些都需要算法和调用方一起优化,车牌扫描识别还有很长的路要走。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值