介绍
这篇文章给大家介绍利用OpenCV怎么对车牌的字符进行分割,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
。
<>强检测轮廓进行分割强>
<强>边缘检测强>
对图像进行边缘检测,这里采用的是精明的边缘检测,处理后的结果如下:
可以看到每个字的边缘都被描绘出来了,接下来就将每个字的轮廓获取出来。
<>强检测轮廓强>
直接使用findContours()将所有轮廓提取出来,再将其在原图中画出来看看效果:
可以看到不仅仅是每个字被框出来了,还有内部以及图像中表现特殊部分的轮廓也有,接下来我们就根据每个字的大致大小筛选出我们想要的结果:
这样看起来是不是就成功了,然后根据轮廓位置将每个字提取出来就行了,不过在这里每个轮廓的前后顺序不一定是图像中的位置,这里我使用每个轮廓左上角横坐标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怎么对车牌的字符进行分割