android端使用openCV与深度学习实现车牌识别

        车牌识别的应用场景随处可见:高速公路上超速抓拍、小区门口关卡、车库入口关卡,甚至出现在车载设备上。它的工作原理大致这样:使用摄像头充当“眼睛”,使用openCV与深度学习充当“大脑”。实时车牌识别工作步骤:摄像头抓拍—>openCV初步定位车牌位置—>二次确认车牌位置的左右上下边界—>车牌倾斜校正—>车牌字符切割—>车牌字符识别。其中,车牌检测是车牌识别的前提条件和重要基础。

        在上篇博客介绍过使用openCV实现车牌检测,大家感兴趣可以看下:android端使用openCV实现车牌检测

        关于openCV的初始化,与车牌检测一样(可以参考上篇博客)。调用车牌识别JNI接口时,首先进行初始化,加载caffe训练模型相关文件:

        plateRecognition = new PlateRecognition(this, mHandler);
        //init plate recognizer
        new Thread(new Runnable() {
            @Override
            public void run() {
                plateRecognition.initRecognizer("pr");
            }
        }).start();

        摄像头实时抓拍,回调每帧数据给车牌识别线程。需要注意的是,车牌识别中openCV操作对象是Mat,而不是Bitmap:

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        //每次进行车牌识别间隔3s
        long currentTime = System.currentTimeMillis();
        if((currentTime - lastRecognizeTime) > 3000){
            lastRecognizeTime = currentTime;
            //回调给车牌识别线程处理
            if(onNewFrameListener != null){
                onNewFrameListener.onNewFrame(inputFrame.rgba());
            }
        }
        return inputFrame.rgba();
    }
    public void onNewFrame(Mat newFrame) {
        if(dstMat == null){
            dstMat = new Mat(newFrame.rows(), newFrame.cols(), CvType.CV_8UC4);
        }
        //mat格式转换
        newFrame.copyTo(dstMat);
        //添加到车牌识别线程的队列中
        if(recognizeThread != null){
            recognizeThread.addMat(dstMat);
        }
    }

         其中,车牌识别线程调用native层执行,最终把识别结果返回给java层:

    public void run() {
        while (isRunning){
            Mat mat = null;
            synchronized (lock){
                //从队列取出mat对象
                if(matQueue != null && matQueue.size() > 0){
                    mat = matQueue.poll();
                }
            }
            //调用native层,执行车牌识别
            if(mat != null && plateRecognition != null){
                plateRecognition.doPlateRecognize(mat);
            }
        }
    }

        使用openCV的级联分类器CascadeClassifier去检测,得到车牌所在整个图像的矩形区域,然后二次确认车牌的左右、上下边界,判断车牌是否发生倾斜,如果有倾斜则进行校正。通过滑动窗口来切割车牌字符,使用CNN深度学习对每个字符进行识别。最终得到识别结果与识别置信度,如果置信度大于一定阈值,那么该轮识别结果可靠。这里涉及到的caffe深度学习训练框架,是贾扬清博士开源的一套框架,如果需要详细了解可访问官网:caffe深度学习框架

        整个识别过程,单个车牌耗时300ms左右,准确率达到95%,看下单个车牌识别结果:




 

        一张图像包含两个车牌的识别结果:

        实时的车牌识别如下图:

Android 项目是使用 Android 操作系统和相关开发工具开发的一款移动应用程序。Android 平台提供了丰富的功能和接口,开发人员可以使用 Java 或 Kotlin 等编程语言编写 Android 应用程序。Android 项目也可以是针对特定设备或特定需求进行自定义开发的软件解决方案。 以下是 Android 项目的一些主要特点和资料介绍: 1. 开放源代码:Android 是基于 Linux 内核的开源操作系统,开发人员可以自由获取、使用和修改源代码。 2. 多样化的硬件设备支持:Android 支持多种硬件设备和屏幕尺寸,可以运行于手机、平板电脑、电视、手表等多种设备上。 3. 灵活的用户界面:Android 提供了丰富的用户界面控件和布局方式,可以实现漂亮、个性化的用户界面。 4. 响应式设计:Android 应用程序可以根据设备类型、屏幕尺寸等因素调整布局和显示方式,以适应不同的设备和用户需求。 5. 多媒体支持:Android 支持常见的音频、视频、图像等多媒体格式,可以实现各种多媒体应用。 6. 数据存储:Android 提供了多种数据存储方式,包括 SQLite 数据库、文件存储、SharedPreferences 等。 7. 网络通信:Android 支持多种网络通信方式,包括 HTTP、TCP、UDP 等。 8. 社交媒体集成:Android 提供了集成社交媒体的功能,可以实现与 Facebook、Twitter、Google+ 等社交媒体的交互。 # 注意 1. 本资源仅用于开源学习和技术交流。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。 3. 不可商用,一切后果由使用者承担。
评论 183
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐福记456

您的鼓励和肯定是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值