这个车牌识别系统(opencv定位,切割+BP神经网络识别字符)我已经在本科毕业的时候顺利完成了,相关的文档可以给大家一个链接~祝顺。http://wenku.baidu.com/view/0d69765dbed5b9f3f90f1cd5.html
1.图像预处理
车牌识别系统的第一个步骤为图像预处理。简单的说,为了方便计算,减少计算量,我们通常将获取的图片灰度化。所谓灰度化就是让图片每个像素点在0-255之间。灰度化后图片可以方便我们操作而且不影响我们对车牌的操作。这里先说下,我们获取的照片因为光照的不同,或者车牌本身有污染等原因,会让我们的照片存在干扰信号。将图片傅里叶变换之后,这些干扰信后又通常为高频信号,所以我们需要做一个滤波器,将高频滤掉。对,就是一个低通。推荐使用均值滤波哈,方便我们后面的几个操作!
注意一下,这里的0代表的是强行将图片转化为灰度图,再读入内存。当然,你完全可以用另一个函数:
cvCvtColor( SRC_PICTURE , DES_PICTURE , CV_BGR2GRAY );
img0 = cvLoadImage( names2[i], 0 );
if( !img0 )
{
printf("Couldn't load %s/n", names[i] );
continue;
}
img=cvCreateImage(cvSize(400,300),8,1);
imgsource=cvCreateImage(cvSize(400,300),8,1);
/*目标图片img*/
cvResize(img0,img);
/*显示目标文件img*/
cvNamedWindow("input",1);
cvShowImage("input",img);
/*均值滤波*/
cvSmooth(img,img,CV_MEDIAN);
到此为止,我们就做好了图片预处理50%啦!接下来的一个操作是将图片进行sobel变换。简单的说,sobel变化是一种边缘检测,它可以帮我们检测出一张图片的边缘。而它到底又是怎么样的原理呢?我帮大家推荐一篇文章,应该可以解决大家大部分的疑惑!点击打开链接而sobel在opencv里面对应的函数为:void cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder, int aperture_size=3 );根据大量的实验,观察,我们发现车牌是纵向纹理的,所以我们可以通过sobel函数将车牌的纹理提取出来!下面附一张效果图