• EasyPR源码剖析(2):车牌定位


    上一篇主要介绍了车牌识别的整体框架和流程,车牌识别主要划分为了两个过程:即车牌检测和字符识别,而车牌识别的核心环节就是这一节主要介绍的车牌定位,即 Plate Locate。车牌定位主要是将图片中有可能是车牌的区域定位出来,方便后面进一步的处理。测试代码如下:
     1 int test_plate_locate() {
     2   cout << "test_plate_locate" << endl;
     3   const string file = "resources/image/plate_locate.jpg";
     4   cv::Mat src = imread(file);
     5   vector<cv::Mat> resultVec;
     6   CPlateLocate plate;
     7 
     8   int result = plate.plateLocate(src, resultVec);
     9   if (result == 0) {
    10     size_t num = resultVec.size();
    11     for (size_t j = 0; j < num; j++) {
    12       cv::Mat resultMat = resultVec[j];
    13       imshow("plate_locate", resultMat);
    14       waitKey(0);
    15     }
    16     destroyWindow("plate_locate");
    17   }
    18   return result;
    19 }
    View Code

    CPlateLocate 是实现车牌定位的主要功能类, 其构造函数比较简单,主函数是 plateLocate,用于定位车牌区域,具体代码如下:

     1 //主处理函数
     2 int CPlateLocate::plateLocate(Mat src, vector<Mat> &resultVec, int index) {
     3   vector<CPlate> all_result_Plates;
     4 
     5   plateColorLocate(src, all_result_Plates, index);
     6   plateSobelLocate(src, all_result_Plates, index);
     7   plateMserLocate(src, all_result_Plates, index);
     8 
     9   for (size_t i = 0; i < all_result_Plates.size(); i++) {
    10     CPlate plate = all_result_Plates[i];
    11     resultVec.push_back(plate.getPlateMat());
    12   }
    13 
    14   return 0;
    15 }
    View Code

    从代码中可以看到,CPlateLocate 此处主要使用了以下三种方法,三种方法混合使用,互为补充。

    1、颜色定位 plateColorLocate()

    2、sobel算子定位 plateSobelLocate()

    3、MSER方法,即最大极值稳定区域方法 plateMserLocate()

    为什么要设计三种方法对车牌进行定位,这里有其使用场景的特殊性。最开始的车牌识别系统都是用sobel算子查找垂直边缘的方法进行车牌识别,但是该方法最大的问题在于面对垂直边缘交错的情况下,无法准确地定位车牌。 如下图所示:

    但是颜色定位也并非万能的,例如在色彩充足,光照足够的情况下,颜色定位的效果很好,但是在面对光线不足的情况,或者蓝色车身的情况时,颜色定位的效果很糟糕。 如下图所示:

    所以新版本的EasyPR中使用了颜色定位与 Sobel 定位结合的方式。首先进行颜色定位,然后根据条件使用Sobel 进行再次定位,增加整个系统的适应能力。但是有没有可能出现颜色定位和Sobel定位都无法识别车牌的情况呢,当然这种情况是有的,比如对分辨率较大的图片处理仍然不好。再加上颜色定位在面对低光照,低对比度的图像时处理效果大幅度下降,颜色本身也是一个不稳定的特征。因此EasyPR的车牌定位的整体鲁棒性仍然不足。如下图所示:

    因此在前面两种方法的基础上又增加了MSER 最大极值稳定区方法。最大极值稳定区域是由Matas等人提出的一种仿射特征区域提取算法。其提取的区域内部灰度几乎不变但是和背景的对比十分强烈,并且该区域能够在多重阈值下保持形状不变。它是基于分水岭的概念。MSER的基本原理是对一幅灰度图像(灰度值为0~255)取阈值进行二值化处理,阈值从0到255依次递增。阈值的递增类似于分水岭算法中的水面的上升,随着水面的上升,有一些较矮的丘陵会被淹没,类似于二值图像。在得到的所有二值图像中,图像中的某些连通区域变化很小,甚至没有变化,则该区域就被称为最大稳定极值区域。MSER算法的具体描述和实现我们会在后面做详细的介绍。

    后续章节我们会分别对这三种车牌定位方法进行详细的介绍。

           

  • 相关阅读:
    冒泡排序
    linux常用命令
    Github上将公共仓库转为私有仓库or私有仓库转为共有仓库
    使用apt更新和升级系统软件
    Django用户认证模块中继承AbstractUser与AbstractBaseUser重写User表的区别
    详解django中的collectstatic命令以及STATIC_URL、STATIC_ROOT配置
    python入门指南
    python包装不上?国内网络问题,使用豆瓣源解决
    nginx入门
    Vue 实现页面刷新(provide 和 inject)
  • 原文地址:https://www.cnblogs.com/freedomker/p/7219939.html
Copyright © 2020-2023  润新知