摘要:本文介绍基于机器视觉技术的车牌识别系统,涵盖车牌定位、字符分割与字符识别三大关键技术。文章首先概述车牌识别技术背景,随后给出系统开发思路,重点讲解基于边缘检测的车牌定位方法,并附上完整的 C++ 程序实现,包括图像二值化、车牌定位、字符分割与字符识别四个核心模块,适合学习 OpenCV 车牌识别的开发者参考。1.车牌识别技术概述近年来,随着社会经济的不断发展,汽车数量也呈逐年上升的态势并变得越来越普及。不难想象,迅猛增长的车辆数目必然导致急剧增大的道路交通流量,以及日益繁忙的道路交通运输状况。因此,我们经常看到公路上会出现交通堵塞的现象,交通事故也经常发生,交通环境有变差的趋势,交通运输问题正在变得越发明显和严重。日益严重的交通状况引起了管理部门的高度重视,修建更加长和宽的道路成为人们考虑得最多的解决该问题的主要措施和途径,但是这种方法的有效性也存在着很多不足,主要是受到了城市空间以及资金的限制。同时,科技在近些年也取得了日益明显的发展,自动化的信息处理水平以及信息处理能力在计算机网络技术、通信技术和计算机技术不断发展的同时,也在不断提高。2.车牌识别系统的开发思路原始车辆图像采集、汽车牌照区域定位、汽车牌照内字符的分割和汽车牌照内字符的识别,这四部分组成了基于机器视觉技术的车牌识别系统,这四部分的工作有一个先后次序的关系。原始车辆图像采集是第一步,汽车牌照内字符的识别是最后一步。基本开发思路如下:(1)采集原始车辆图像,主要是通过摄像设备(CCD工业相机,当然学习阶段不需要购买如此昂贵的设备,只需准备普通的USB电脑摄像头即可)。(2)计算机接收上一步采集所得车辆图像,并在基于机器视觉技术的车牌识别系统图像预处理模块中进行相应处理。(3)在基于机器视觉技术的车牌识别系统牌照定位模块中实现汽车牌照区域的定位。(4)在基于机器视觉技术的车牌识别系统牌照内字符分割模块中实现汽车牌照区域内字符的分割。(5)在基于机器视觉技术的车牌识别系统牌照内字符识别模块实现汽车牌照区域内字符的识别。(6)给出最终的汽车牌照识别结果。例如所属省份、号码、牌照底色等。3.车牌定位技术基于机器视觉技术的车牌识别系统的关键技术之一是车牌定位技术,其主要目的是从汽车图像中确定车牌的具体位置, 为之后的字符分割和字符识别做准备。也就是通过运行某个定位算法, 确定车牌子区域的对角坐标。 车牌的定位准确率直接影响字符识别的准确率。由此可见在汽车牌照识别系统中, 车牌定位所占的地位是至关重要的,后期汽车牌照字符分割和字符识别要想取得比较好的效果, 只有在车牌定位达到一定准确性的基础上才能实现。 近年来,如何对现有车牌定位算法进行改进,一直是研究的重点,造成这种现状的主要原因有:对复杂背景下车牌定位的需要越来越高,以及仍有很多相应的问题存在于现有的车牌定位算法中。 因此, 在对改进的汽车牌照定位技术进行研究之前,分析一下传统的车牌定位研究算法的相关内容就很有必要了。4.基于边缘检测的车牌定位方法在车辆图像中, 牌照区域内含有水平边缘、 斜向边缘和垂直边缘, 可见边缘信息相当丰富, 而这个特点在其他区域内都是不具备的。 因此, 可以通过查找含有丰富边缘信息区域的方法来实现汽车牌照的准确定位, 其核心主要是边缘检测技术的使用。比较了各种二值化算法和边缘检测算法, 首先将图像的灰度图进行二值化, 然后运用Robert算子进行边缘检测,最后使用基于形状特征的分割法将车牌分割出来。 基于车牌区域丰富的特征边缘,提出了一种改进的定位方法,首先增强原始图像, 并对原始图像和增强图像分别利用Sobel算子进行边缘提取; 然后基于车牌区域边缘均匀、 长短有限等特征, 滤除背景及噪声边缘点; 最后通过投影搜索出车牌区域。边缘检测的车牌定位方法的优点在于, 其不仅能够有效地实现噪声的消除, 还具有较短的反应时间以及较高的汽车牌照定位准确率; 同时, 该方法对于处理一幅图像中含有好几个汽车牌照的情况, 处理速度也是比较快的。 但是, 该方法也存在一定的缺点: 定位在褪色明显以及严重的情况下有时会失败, 主要原因是对于字符边缘的检测有时无法实现;有时还会得到比实际汽车牌照稍微大一些的汽车牌照区域, 主要原因是受到了外界干扰以及车牌倾斜的影响。5. 车牌识别程序5.1 图像二值化voidLPlateRecognitionApp::onBinImageBtnClicked(){QString sPath=ui.lineEdit-text();std::string strPath=sPath.toStdString();if(m_pSrcImg!=NULL){cvReleaseImage(m_pSrcImg);m_pSrcImg=NULL;}if(m_pImgCanny!=NULL){cvReleaseImage(m_pImgCanny);m_pImgCanny=NULL;}if(m_pImgResize!=NULL){cvReleaseImage(m_pImgResize);m_pImgResize=NULL;}Mat m;m=imread(strPath,IMREAD_COLOR);if(m.empty()){QMessageBox::information(this,"Note","图像读取失败,请检查图片路径!");return;}IplImage Iplimg=cvIplImage(m);m_pSrcImg=cvCloneImage(Iplimg);m_pImgCanny=cvCreateImage(cvSize(m_pSrcImg-width,m_pSrcImg-height),IPL_DEPTH_8U,1);cvCvtColor(m_pSrcImg,m_pImgCanny,CV_RGB2GRAY);cvSmooth(m_pImgCanny,m_pImgCanny,CV_GAUSSIAN,3,0,0);Threshold(m_pImgCanny,m_pImgCanny);QImage qImg=QImage((constunsignedchar*)(m_pImgCanny-imageData),m_pImgCanny-width,m_pImgCanny-height,m_pImgCanny-widthStep,QImage::Format_Indexed8).copy();QPixmap pixmap=QPixmap::fromImage(qImg);ui.label_3-setPixmap(pixmap);ui.label_3-setScaledContents(true);// 让图片自适应 QLabel 大小}voidLPlateRecognitionApp::Threshold(IplImage*Image,IplImage*Image_O){intthresMax=0,thresMin=255,i=0,j=0,t=0;for(j=0;jImage-height;j++)for(i=0;iImage-width;i++){if(CV_IMAGE_ELEM(Image,uchar,j,i)thresMax)thresMax=CV_IMAGE_ELEM(Image,uchar,j,i);elseif(CV_IMAGE_ELEM(Image,uchar,j,i)thresMin)thresMin=CV_IMAGE_ELEM(Image,uchar,j,i);}cvCanny(Image,Image_O,AdaptiveThreshold((thresMax+thresMin)*0.5,Image),thresMax*0.7,3);}5.2 定位车牌voidLPlateRecognitionApp::onLocateImgBtnClicked(){if(PlateAreaSearch(m_pImgCanny)==0){return;}QImage qImg=QImage((constunsignedchar*)(m_pImgResize-imageData),m_pImgResize-width,m_pImgResize-height,m_pImgResize-widthStep,QImage::Format_Indexed8).copy();QPixmap pixmap=QPixmap::fromImage(qImg);ui.label_4-setPixmap(pixmap);ui.label_4-setScaledContents(true);}// 定位车牌有效区域intLPlateRecognitionApp::PlateAreaSearch(IplImage*pImg){if(pImg==NULL){return0;}IplImage*imgTest=0;inti=0,j=0,k=0,m=0;boolflag=0;intplate_n=0,plate_s=0,plate_e=0,plate_w=0;int*num_h=newint[max(pImg-width,pImg-height)];if(num_h==NULL){QMessageBox::information(this,"Note","memory exhausted!");return0;}for(i=0;ipImg-width;i++){num_h[i]=0;}imgTest=cvCreateImage(cvSize(pImg-width,pImg-height),IPL_DEPTH_8U,1);cvCopy(pImg,imgTest);for(j=0;jimgTest-height;j++){for(i=0;iimgTest-width-1;i++
