当前位置:首页 > 资讯 > 正文

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

书接上文:

本篇文章主要介绍如何对采集到的图像处理,进行车牌号的识别。

本车牌识别系统包括以下:图像采集→二值化灰度处理→识别车牌区域→字符分割→字符识别。

有图有真相

图片比任何语言都有说服力,话不多说直接上图。

图像采集已在上一篇文章讲过,有需要的可以取去看一下。

1、二值化:

        二值二值,字面意思就是转变成两个数值,就是将整个图像的每个像素都转变成0(黑)或255(白)这两个值,非黑即白,这样处理起来就很方便了。那么问题又来了,0~255之间应该如何转换?是随便转的吗?  

当然不是,简单的办法就是取一个合适的阈值,比如说127吧,小于127的转为0,大于127的转为1,因此找合适阈值就变得尤为重要,可以取其中值,也可以取各个像素的平均值。

2、识别车牌区域:

        如何在一张图片中精准的定位车牌所在的位置,这个就很有意思了!!!

上边界和下边界:在上一步二值化处理时,已经将整张图片转换成0(黑色)或者255(白色),车牌是蓝底白字,二值化后蓝色的低会变成黑色,上面的字依旧是白色,一行一行的看,  这一行中灰度值会多次发生跳变,也就是会有很多从0变成255,我们恰恰利用这一点,也就是统计跳变点的个数,当跳变点个数超过一定的阈值时,就认为该行是边界。

空说太无力了,还是举个例子:

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

 绿线代表一行,沿着这一行看,当到达白字时,其灰度数值会发生跳变从 0(黑色)跳变成255(白色),记为一个跳变点,这一行的跳变点还有很多,我们就根据跳变点的个数来判断上下边界。

左右边界:介于我们上下边界已经找好,所以我们可以在这两边界之间的区域找左右边界,从而缩小工作量,我们依旧可以按跳变点的算法来做,也可以用另一种方法,RGB转变成HSV,根据其色调、饱和度、明度来判断。

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

 也就是这样。

3、字符分割

        区域也定好,我们想要识别字母,首先得先提取出来啊,一一识别,因此就需要字符分割了。如何分割呢。

先上个图便于大家理解。

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

如图,红线代表着我们上方确定好的边界,我们可以看到两个字母之间二值化处理后全是黑色,唉~我们就可以根据这一特性看,竖着看如果某一列全为黑色也就是0,并且旁边也全都是黑色,就可以判断为空隙,这样就能截取到了各个字母,用蓝线表示字母的边界。

4、字符识别

经过前面的努力,我们已经提取到了各个字符,下面就进行识别呗。

为了增加识别的准确度呢,我们将提取到的字符进行放大,先横向放大然后纵向放大,以提高准确度。下图:

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

 怎么识别呢,我们通过取模软件,取到多个多个字模,比如说,粤、苏、辽、A~F、1~9,将其存放在数组中,然后让我们提取到的字符的数组去和他们一一比较。

比如说我们现在提取到“苏”,让它的数组去比较,肯定会找到一个标准数组和提取数组一样,但是呢,就像世界上没有两片相同的叶子一样,他们或多或少会有出处,因此我们设定当他们的相似度超过一定的阈值时,就认为二者相同。

最下方就是我们识别到的车牌号:

毕业设计——基于STM32+OV7670的图像采集车牌识别(终极篇:车牌识别)

 当然啦,用f103系列的单片机去做机器视觉,多少有点为难它了,毕竟它不是专门做这个的。所以有时会出现一些个别字符识别错误,尤其是“E”与“F”,这是正常现象。

 
 
 

大家如果想省事的话也可直接下载全部工程资料。

完整工程链接:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-24450682672.4.6c772c42AqQnna&id=677048652126

  欢迎大家指正交流,有空可以一起讨论代码啊。

制作不易,感谢大家支持,感谢!!!!!!

  --------------一个正在努力的人