OpenCV使用边缘提取、腐蚀、轮廓进行车牌定位

http://blog.csdn.net/superdont/article/details/24935383

OpenCV使用边缘提取、腐蚀、轮廓进行车牌定位

 分类:
 

采用OpenCV249利用边缘检测、轮廓检测、腐蚀实现的车牌定位,具体为:

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Mat srcImage=imread("image/000.jpg");  
  2.     //imshow("a",srcImage);  
  3.     int i,j;  
  4.     int cPointR,cPointG,cPointB,cPoint;//currentPoint;  
  5.     Mat resizeImage;  
  6.     resize(srcImage,resizeImage,Size(400,300));  
  7.     Mat grayImage;  
  8.     cvtColor(resizeImage,grayImage, CV_BGR2GRAY);  
  9.     Mat medianImage;  
  10.     medianBlur(grayImage,medianImage,3); //最后一个参数需要为奇数  
  11.     Mat sobelImage;  
  12.     //参数为:源图像,结果图像,图像深度,x方向阶数,y方向阶数,核的大小,尺度因子,增加的值    
  13.   
  14.     Sobel(medianImage,sobelImage,CV_8U,1,0,3,0.4,128);    
  15.     Mat normalizeImage;  
  16.     normalize(sobelImage,normalizeImage,255,0,CV_MINMAX);  
  17.     Mat binaryImage;  
  18.     threshold(normalizeImage,binaryImage, 100, 255, THRESH_BINARY_INV );    
  19.     Mat closeImage;  
  20.     //morphologyEx(binaryImage,closeImage,MORPH_CLOSE,Mat(3,1,CV_8U),Point(0,0),10);  //闭运算  
  21.     Mat openImage(closeImage.rows,closeImage.cols,CV_8UC1);  
  22.     //morphologyEx(closeImage,openImage,MORPH_OPEN,Mat(3,3,CV_8U),Point(0,0),1);   //开运算  
  23.     //  erode(openImage,openImage,Mat(3,3,CV_8U),Point(-1,-1),10);  
  24.     dilate(binaryImage,openImage,Mat(3,3,CV_8U),Point(-1,-1),6);  
  25.     /* 
  26.     Mat rgbImage; 
  27.     cvtColor(openImage,rgbImage, CV_GRAY2BGR); 
  28.     */  
  29.     //cvtColor(openImage,openImage, CV_BGR2GRAY);  
  30.     //vector<vector<Point> > contours;  
  31.     //vector<Vec4i> hierarchy;  
  32.     //openImage=imread("test.png");  
  33.     imshow("openImage",openImage);  
  34.     /// Detect edges using canny  
  35.     //  Canny( src_gray, canny_output, thresh, thresh*2, 3 );  
  36.     /// Find contours  
  37.     /*  Mat thresholdImage; 
  38.  
  39.     cvtColor(openImage,openImage, CV_BGR2GRAY); 
  40.     threshold( openImage,thresholdImage,127, 255, THRESH_BINARY ); 
  41.     openImage=thresholdImage;*/  
  42.   
  43.   
  44.     vector<vector<Point> > contours;  
  45.     vector<Vec4i> hierarchy;  
  46.     findContours(openImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );  
  47.     Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );  
  48.     for( int i = 0; i < contours.size(); i++ )  
  49.     {    
  50.         //使用边界框的方式    
  51.         CvRect aRect =  boundingRect(contours[i]);  
  52.         int tmparea=aRect.height*aRect.height;    
  53.         if (((double)aRect.width/(double)aRect.height>2)&& ((double)aRect.width/(double)aRect.height<6)&& tmparea>=200&&tmparea<=25000)    
  54.         {    
  55.             rectangle(resizeImage,cvPoint(aRect.x,aRect.y),cvPoint(aRect.x+aRect.width ,aRect.y+aRect.height),color,2);    
  56.             //cvDrawContours( dst, contours, color, color, -1, 1, 8 );    
  57.         }    
  58.     }   
  59.   
  60.     imshow("contour",resizeImage);    

效果一般,部分测试图像:

 

 

测试了很多图片,这几张基本有个样子,通过调整腐蚀的次数,可以针对不同的图像进行定位。

参考资料:

学习OpenCV——车牌检测(定位):http://blog.csdn.net/yangtrees/article/details/7444470

posted @ 2016-03-01 09:40  donaldlee  阅读(1015)  评论(0编辑  收藏  举报