利用OpenCV怎么对车牌的字符进行分割

  介绍

这篇文章给大家介绍利用OpenCV怎么对车牌的字符进行分割,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。


<>强检测轮廓进行分割

<强>边缘检测

对图像进行边缘检测,这里采用的是精明的边缘检测,处理后的结果如下:

利用OpenCV怎么对车牌的字符进行分割

可以看到每个字的边缘都被描绘出来了,接下来就将每个字的轮廓获取出来。

<>强检测轮廓

直接使用findContours()将所有轮廓提取出来,再将其在原图中画出来看看效果:

利用OpenCV怎么对车牌的字符进行分割

可以看到不仅仅是每个字被框出来了,还有内部以及图像中表现特殊部分的轮廓也有,接下来我们就根据每个字的大致大小筛选出我们想要的结果:

利用OpenCV怎么对车牌的字符进行分割

这样看起来是不是就成功了,然后根据轮廓位置将每个字提取出来就行了,不过在这里每个轮廓的前后顺序不一定是图像中的位置,这里我使用每个轮廓左上角横坐标x的大小来排序。

<强>完整代码:

# include  & lt; iostream>,   # include  & lt; opencv2/highgui/highgui.hpp>,   # include  & lt; opencv2/imgproc.hpp>   # include  & lt; opencv2/imgproc/types_c.h>   # include  & lt; map>      using  namespace 性传播疾病;   using  namespace 简历;      int  main (), {   ,Mat  img =, imread (“number.jpg");   ,Mat  gray_img;   ,//生成灰度图像   ,cvtColor (img, gray_img,, CV_BGR2GRAY);   ,//高斯模糊   ,Mat  img_gau;   ,高斯模糊(gray_img, img_gau,,(3), 3)大小,,0,0);   ,//阈值分割   ,Mat  img_seg;   ,阈值(img_gau, img_seg,, 0,, 255,, THRESH_BINARY  +, THRESH_OTSU);   ,//边缘检测,提取轮廓   ,Mat  img_canny;   ,精明的(img_seg, img_canny,, 200,, 100);   ,vector等级;   ,findContours (img_canny,轮廓,,层次结构,,CV_RETR_EXTERNAL,, CV_CHAIN_APPROX_NONE,,点());   ,int  size =, (int) (contours.size ());   ,//保存符号边框的序号   ,vector num_order;   ,map, num_map;   ,for  (int 小姐:=,0;,小姐:& lt;,大小;,我+ +),{   ,//获取边框数据   ,Rect  number_rect =, boundingRect(轮廓[我]);   ,int  width =, number_rect.width;   ,int  height =, number_rect.height;   ,//去除较小的干扰边框,筛选出合适的区域   ,if  (width 祝辞,img.cols/10,,,, height 祝辞,img.rows/2), {   ,矩形(img_seg, number_rect.tl (),, number_rect.br(),,标量(255,,255,,255),,1,,1,,0);   ,num_order.push_back (number_rect.x);   ,num_map [number_rect.x],=,我;   ,}   ,}   ,//按符号顺序提取   ,排序(num_order.begin (),, num_order.end ());   ,for  (int 小姐:=,0;,小姐:& lt;, num_order.size();,我+ +),{   ,Rect  number_rect =, boundingRect(轮廓(num_map.find (num_order[我])→第二]);   ,Rect  choose_rect (number_rect.x, 0, number_rect.width,, gray_img.rows);   ,Mat  number_img =, gray_img (choose_rect);   ,imshow (“number", +, to_string(我),number_img);   ,//imwrite (“number", +, to_string (i), +,“.jpg",, number_img);   ,}   ,imshow(“添加方框“,,gray_img);   ,waitKey (0);   ,return  0;   }

<>强像素值判断进行分割

分割方法:首先判断每一列的像素值大于0的像素个数超过5个时,认为此列是有数字的,记录每列像素是否大于5日,产生一个数组。

//,确认为,1,的像素   ,int  pixrow [1000];   ,for  (int 小姐:=,0;,小姐:& lt;, roi_col 作用;1;,我+ +),{   ,for  (int  j =, 0;, j  & lt;, roi_row 作用;1;,j + +), {=,,pix  img_threadhold.at (j,我);   ,pixrow[我],=,0;   ,if  (pix 祝辞,0),{   ,pixrow[我],=,1;   ,打破;   ,}   ,}   ,}   ,//对数组进行滤波,减少突变概率   ,for  (int 小姐:=,2,,小姐:& lt;, roi_col 作用;1,安康;2;,我+ +),{   ,if  ((pixrow[小姐:安康;1],+,pixrow(小姐;安康;2),+,pixrow(小姐:+,- 1),+,pixrow[小姐:+,2]),在=,3),{   ,pixrow[我],=,1;   ,}   ,else  if  ((pixrow[小姐:安康;1],+,pixrow(小姐;安康;2),+,pixrow(小姐:+,- 1),+,pixrow[小姐:+,2]),& lt;=, 1), {   ,pixrow[我],=,0;   ,}   以前,}

利用OpenCV怎么对车牌的字符进行分割