OpenCV下车牌定位算法实现

上传人:沈*** 文档编号:65930602 上传时间:2022-03-25 格式:DOC 页数:7 大小:235.50KB
收藏 版权申诉 举报 下载
OpenCV下车牌定位算法实现_第1页
第1页 / 共7页
OpenCV下车牌定位算法实现_第2页
第2页 / 共7页
OpenCV下车牌定位算法实现_第3页
第3页 / 共7页
资源描述:

《OpenCV下车牌定位算法实现》由会员分享,可在线阅读,更多相关《OpenCV下车牌定位算法实现(7页珍藏版)》请在装配图网上搜索。

1、Ope nCV下车牌定位算法实现代码(一)车牌定位算法在车牌识别技术中占有很重要地位,一个车牌识别系统的识别率往往取决于车牌定位的成功率及准确度。车牌定位有很多种算法,从最简单的来,车牌在图像中一般被认为是长方形,由于图像摄取角度不同也可 能是四边形。我们可 以使用 Ope nCV中的实例:C:ProgramFilesOpenCVsamplesc.squares.c这是一个搜索图片中矩形的一个算法。我们只要稍微修改 一下就可以实现定位车牌。在这个实例中使用了 canny算法进行边缘检测,然后二值化,接着用cvFindContours搜索轮廓,最后从找到的轮廓中根据角点的个数,角的度数和轮廓大小

2、确定, 矩形位置。以下是效果图:= - - 1 Gzp Pl Mtfc Lil这个算法可以找到一些车牌位置,但在复杂噪声背景下,或者车牌图像灰度与背景相差 不大就很难定位车牌。所以我们需要寻找更好的定位算法。下面是squares的代码:#ifdef _CH_#pragma package #en dif#ifndef _EiC#i nclude cv.h#i nclude highgui.h#i nclude #in clude #include #endifint thresh = 50;IplImage* img = 0;IplImage* img0 = 0;CvMemStorage* s

3、torage = 0;CvPoint pt4;const char* wndname = Square Detection Demo;/ helper function:/ finds a cosine of angle between vectors/ from pt0-pt1 and from pt0-pt2double angle( CvPoint* pt1, CvPoint* pt2, CvPoint* pt0 )double dx1 = pt1-x - pt0-x;double dy1 = pt1-y - pt0-y;double dx2 = pt2-x - pt0-x;double

4、 dy2 = pt2-y - pt0-y;-10);return (dx1*dx2 + dy1*dy2)/sqrt(dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e / returns sequence of squares detected on the image./ the sequence is stored in the specified memory storageCvSeq* findSquares4( IplImage* img, CvMemStorage* storage )CvSeq* contours;int i, c, l, N

5、= 11;CvSize sz = cvSize( img-width & -2, img-height & -2 );IplImage* timg = cvCloneImage( img ); / make a copy of input imageIplImage* gray = cvCreateImage( sz, 8, 1 );IplImage* pyr = cvCreateImage( cvSize(sz.width/2, sz.height/2), 8, 3 ); IplImage* tgray;CvSeq* result;double s, t;/ create empty seq

6、uence that will contain points -/ 4 points per square (the squares vertices)CvSeq* squares = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvPoint), storage );/ select the maximum ROI in the image/ with the width and height divisible by 2 cvSetImageROI( timg, cvRect( 0, 0, sz.width, sz.height );/ down-scale

7、 and upscale the image to filter out the noise cvPyrDown( timg, pyr, 7 ); cvPyrUp( pyr, timg, 7 );tgray = cvCreateImage( sz, 8, 1 );/ find squares in every color plane of the imagefor( c = 0; c 3; c+ )/ extract the c-th color planecvSetImageCOI( timg, c+1 );cvCopy( timg, tgray, 0 );/ try several thr

8、eshold levelsfor( l = 0; l N; l+ )/ hack: use Canny instead of zero threshold level./ Canny helps to catch squares with gradient shadingif( l = 0 )/ apply Canny. Take the upper threshold from slider/ and set the lower to 0 (which forces edges merging)cvCanny( tgray, gray,60, 180, 3 );/ dilate canny

9、output to remove potential/ holes between edge segmentscvDilate( gray, gray, 0, 1 );else/ apply threshold if l!=0:/tgray(x,y) = gray(x,y) total = 4 & fabs(cvContourArea(result,CV_WHOLE_SEQ) 1000 & cvCheckContourConvexity(result) )s = 0;for( i = 0; i = 2 )t = fabs(angle(CvPoint*)cvGetSeqElem( result,

10、 i ), (CvPoint*)cvGetSeqElem( result, i-2 ), (CvPoint*)cvGetSeqElem( result, i-1 ); s = s t ? s : t;/ if cosines of all angles are small/ (all angles are 90 degree) then write quandrange/ vertices to resultant sequenceif( s 0.3 )for( i = 0; i h_next;/ release all the temporary images cvReleaseImage(

11、 &gray ); cvReleaseImage( &pyr );cvReleaseImage( &tgray ); cvReleaseImage( &timg );return squares;/ the function draws all the squares in the image void drawSquares( IplImage* img, CvSeq* squares )CvSeqReader reader;IplImage* cpy = cvCloneImage( img );int i;/ initialize reader of the sequence cvStar

12、tReadSeq( squares, &reader, 0 );/ read 4 sequence elements at a time (all vertices of a square) for( i = 0; i total; i += 4 )CvPoint* rect = pt; int count = 4;/ read 4 vertices memcpy( pt, reader.ptr, squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader );memcpy( pt + 1, reader.ptr , squ

13、ares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader );memcpy( pt + 2, reader.ptr , squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader );memcpy( pt + 3, reader.ptr , squares-elem_size ); CV_NEXT_SEQ_ELEM( squares-elem_size, reader );/ draw the square as a closed polyline cvPol

14、yLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 );/ show the resultant image cvShowImage( wndname, cpy );cvReleaseImage( &cpy );void on_trackbar( int a )if( img )drawSquares( img, findSquares4( img, storage ) );char* names = pic1.png, pic2.png, pic3.png,pic4.png, pic5.png, pic6.png, 0

15、;int main(int argc, char* argv)int i, c;/ create memory storage that will contain all the dynamic data storage = cvCreateMemStorage(0);for( i = 0; namesi != 0; i+ )/ load i-th imageimg0 = cvLoadImage( namesi, 1 );if( !img0 )printf(Couldnt load %sn, namesi );continue;img = cvCloneImage( img0 );/ crea

16、te window and a trackbar (slider) with parent image and set callback / (the slider regulates upper threshold, passed to Canny edge detector) cvNamedWindow( wndname,0 );cvCreateTrackbar( canny thresh, wndname, &thresh, 1000, on_trackbar );/ force the image processingon_trackbar(0);/ wait for key./ Al

17、so the function cvWaitKey takes care of event processingc = cvWaitKey(0);/ release both images cvReleaseImage( &img );cvReleaseImage( &img0 );/ clear memory storage - reset free space position cvClearMemStorage( storage );if( c = 27 )break;cvDestroyWindow( wndname );return 0;#ifdef _EiC main(1,squar

18、es.c);#endifOpenCV 下车牌定位算法实现代码 (二) 前面介绍了用 OpenCV 的 squares 实例定位车牌的算法,效果不是很理想。车牌定位的方法 有很多种, 这里我们从汽车图像的纹理特征入手, 找出车牌不同于背景的特征是车牌定位的 关键。 观察多幅汽车图片我们会发现车身和背景的纹理多为横向纹理,而车牌字符则为竖向纹理,基于这个纹理特征我们可以区别处车牌位置。 车牌的定位我们可以分为如下几个步骤: 1 预处理图像的预处理主要是为了后续处理的需要进行一些滤波和梯度增强的处理,以滤除噪声 和垂直方向上的增强。2 Sobel垂直方向边缘检测并 2值化一般的边缘检测的方法检测到的

19、边缘信息含有大量的无用信息,这里我们使用Sobel边缘检测算子对图像进行垂直边缘检测,由于车牌字符的竖向纹理特征我们可以检测到车牌字符, 对得到的边缘图像进行 2值化,排除一些噪声并增强字符边缘。3 形态学变换汽车图像还存在一些竖向的纹理 (如车身, 车灯等) 我们需要排除这些干扰信息, 并把临近 的字符边缘连通起来。 这一阶段主要利用对图像进行形态学操作, 即作闭合(先膨胀在腐蚀) 开启(先腐蚀再膨胀) 运算, 膨胀可以把临近边缘连接成一个整体, 腐蚀可以滤除一些细碎 的边缘(建议使用 3*1 的结构进行操作) 经过形态学变换可以滤除噪声边缘, 得到车牌区域。4 筛选 大多数图像经过形态学变化后都可以得到满意的效果, 但由于图像背景的一些特殊纹理, 可 能会留下一些没有滤除的边缘, 也有可能字符间空隙较大, 车牌区域出现分为几部分的状况, 还有可能车身的一些标语等被误认为是车牌图像等,我们还需要进行聚类和筛选。 选取一个标准来判断连通域(如竖直方向两区域重合大于 10 像素,水平方向两区域距离小 于 10 像素)在根据车牌的形状大小(宽,高)判断是否为车牌区。程序运行效果图如下:bda)原国 M Sogl检测2值化(J形态学变化 连通域检测A

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!