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%,看下单个车牌识别结果:




 

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

        实时的车牌识别如下图:

        车牌识别实现过程参考:Hyper-LPR

demo下载地址:https://download.csdn.net/download/u011686167/10899892

发布了63 篇原创文章 · 获赞 179 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/u011686167/article/details/79029765