日期
04/13
2015
咨询
  • QQ扫一扫

  • Vision小助手
    (CMVU)

车牌识别系统开发记录(二) 车牌定位
收藏
2015-04-13 15:05:36来源: 中国机器视觉网

  这里面我要具体介绍的检测车牌方法的步骤如下:
  首先利用Sobel滤波器对灰度图像进行滤波,突出图像中的垂直边缘信息
  利用数学形态学方法: Close(先膨胀再腐蚀,填充内部空隙)
  利用findContours函数寻找车牌的潜在轮廓
  结合车牌的长宽比例的先验知识剔除不符合的轮廓
  利用floodfill算法结合车牌的颜色信息提取可能的车牌区域
  再次结合车牌的长宽比例的先验知识剔除不符合的轮廓
  根据上面初步提取出可能的车牌区域,下一步利用SVM进行判断是否是车牌
  好了,下面一步步来分析:

  提取垂直边缘
  先看如何凸显垂直边缘信息。这个主要是利用Sobel算子对图像进行卷积,学过图像处理的同志们对这个肯定不陌生。这里面用的是OpenCV的Sobel函数。
  C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, intksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT )
  因为要提取垂直边缘信息,所以令dx=1,dy=0,如下所示:

在凸显完垂直边缘信息后,我们再次利用阈值化处理,将灰度图像变成二值图像,为下面的形态学处理做准备。

  形态学处理:CLOSE
  现在利用数学形态学处理中的闭运算(先膨胀再腐蚀),填充上面得到的二值图像的空隙,为下面寻找轮廓做准备。
  我们知道,结构元素各向同性的开运算用于消除图像中小于结构元素的细节部分——物体的局部形状保持不变。闭运算用来连接邻近的物体,填补小空洞,填平窄缝隙使得物体边缘变得平滑。
  对形态学不熟悉的同学,请击中这个链接(形态学运算)。
  在这里我们利用OpenCV中的morphologyEx来进行形态学处理。因为车牌是长方形的,所以我们更希望的是对横向连接,故而我们将结构元素element大小设为(17×3).

  提取轮廓
  在形态学处理之后,我们对得到的二值图像提取潜在的车牌轮廓。
  所谓的(简单的)轮廓提取算法就是:系统性地扫描图像直到遇到连通区域的一个点,以它为起始点,跟踪它的轮廓,标记边界上的像素。当轮廓完整闭合,扫描回到上一个位置,直到再次发现新的成分。
这里面我们利用OpenCV中的findContours函数:
  C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
  这个函数输入端是一幅二值图像,而输出的是轮廓的向量(轮廓本身是cv::Points的向量),另外还涉及了两个参数mode和method。其中mode=CV_RETR_EXTERNEL标记了仅返回外部轮廓,即物体的洞将会被忽视。第二个参数method=CV_CHAIN_APPROX_NONE要求给出更复杂的链式轮廓近似,以得到更紧密的表示方式。
  More Ref:
  [1] 边沿检测与提取,轮廓跟踪
  [2] OpenCV文档 findContours

  Flood Fill 算法
  Floodfill算法[1]即漫水填充法,是区域填充法的一种,其实质是种子填充法,这种方法适用于对内定义区域的填充。
  所谓内定义区域,是指区域内部所有像素具有同一颜色或亮度值,而区域外的所有像素具有另一种颜色或亮度值。Floodfill方法能将该区域中的全部像素都设置为新值,并通过一定的规则确定一组种子点(该种子点为区域内点),然后通过判断种子点的邻域像素是否和种子构成连通域,从而决定是否对其进行填充,直到找到区域内所有像素或达到轮廓线的边界。
  Floodfill算法涉及到三个参数:开始种子点、目标颜色判定规则和替换颜色。
  常用的实现方法有点点填充递归算法和扫描线填充递归算法。
  点点填充可以用广度优先搜索(BFS)或深度优先搜索(DFS)来完成,其主要思想是对种子点的四邻域(或八邻域)逐点进行判断,它的优点是程序简单直观,缺点是没有考虑像素相关性,每个像素都有可能多次入栈出栈,当图像填充面积很大时,需要的栈空间和运行时间急剧增加,容易导致程序爆炸。扫描线填充也是一种递归算法,但是它用线方式代替点方式,充分利用了像素的相关性,考虑到区域在扫描线上的连贯性和相邻扫描线之间的连贯性,进栈时仅选每一条连续未被填充的扫描线与多边形相交区间最左或右边的像素进栈,出栈时填充整个区段,这样栈空间和递归次数都大大减少了。

  利用SVM判断车牌
  关于SVM的相关内容,我以前写过几篇文章,大家可以参考:
  支持向量机学习笔记:数学过程及经典Tutorial
  支持向量机学习笔记:LIBSVM应用(人脸识别)

为你推荐