zoukankan      html  css  js  c++  java
  • 车牌识别--铆钉的去除

    车牌识别中,每一步的效果直接影响总体的识别率,对车牌识别产生干扰的。不仅是车牌的污渍,还有铆钉。

    一 、举例说明,铆钉干扰使得车牌识别错误

    1、车辆图片

    2、通过颜色HSV确认车牌大致位置


    3、截取车牌图像


    4、二值化后,水平投影,从图片中能够非常清楚看到铆钉

       


    5、字符切割后的车牌



    6、提取切割后的车牌字符



    7、错误的识别结果



    二、改善方法

    这里针对车牌识别的干扰去除方法加以改善。

    1、原先博文中车牌识别中去除铆钉的方法,仅仅是用投影的方法。

    粗略计算铆钉在车牌的上方,白点信息较少。通过水平投影计算每一行的白点数

    可是当铆钉嵌入字符中间时。仍然无法去除干扰。

    2、这里採用直接出去铆钉的方法,

    1)、首先尽量分离字符与铆钉的链接

    2)、计算每行的跳变次数。一边铆钉所在行。都是两次。不大于3次。超过7次的,就是字符区域所在行。

    这里使用的方法是在跳变次数小于5的行里面,全局搜索白点,然后计算它的宽度和高度。假设宽度大于15个像素,高度大于25个像素(这里车牌归一化后字符大小为20X40),那么他就不是铆钉,否则就当做铆钉删掉。

    全局遍历代码:

    	for(i = 0; i < img->height/3; i++)
    	{
    		if(PointChg[i] && PointChg[i] < 5)//每行跳变次数
    		{
    			for(j = 0; j < img->width; j++)
    			{
    				if(dst[i * img->width + j] >= 200 && flag1 == 0)//发现白点即遍历
    				{
    					x1 = x2 = j;
    					y1 = y2 = i;
    					delRivet(img, dst, &flag, j, i, &x1, &y1, &x2, &y2, 15, 25);
    					//display8(*img, dst, 0, 0);
    					flag1 = 1;
    				}
    				if(dst[i * img->width + j] == 0 && flag1 == 1)
    				{
    					flag1 = 0;
    				}
    			}
    			break;
    		}
    	}
    删除铆钉的函数

    img:用了记录车牌的宽度高度信息等

    dst:是二值化后的车牌信息。即要遍历查找铆钉的空间

    *flag:用来标志是不是铆钉

    *x1, *x2 用来计算铆钉宽度  *x2-*x1;

    *y1, *y2 同上

    xlength,ylength,设置铆钉宽度高度阈值。

    static int direction[4][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    int delRivet(Bmp1 *img, byte *dst, int *flag, int x, int y, int *x1, int *y1, int *x2, int *y2, int xlength, int ylength)
    {
    	int i;
    	int tmp;
    	int x0, y0;
    	
    	tmp = dst[y * img->width + x];
    
    
    	if((*x2 - *x1 > xlength) || (*y2 - *y1) > ylength)
    	{
    		*flag = 1;
    		return 0;
    	}
    	
    	dst[y * img->width + x] = 0;
    
    	for(i = 0; i < 4; i++)
    	{
    		x0 = x + direction[i][0];
    		y0 = y + direction[i][1];
    
    		if(x0 > 0 && x0 < img->width && y0 > 0 && y0 < img->height && dst[y0 * img->width + x0] && (*flag == 0))
    		{
    			if(*x1 > x0)
    				*x1 = x0;
    			else if(*x2 < x0)
    				*x2 = x0;
    
    			if(*y1 > y0)
    				*y1 = y0;
    			else if(*y2 < y0)
    				*y2 = y0;
    			delRivet(img, dst, flag, x0, y0, x1, y1, x2, y2, xlength, ylength);
    			//display8(*img, dst, 0, 0);
    		}
    
    	}
    
    	if(*flag)
    	{
    			dst[y * img->width + x] = tmp;
    	}
    	return 0;
    }

    3)、去除铆钉的车牌


    4)、正确切割


    5)、正确提取字符



    6)、正确识别结果




    源代码稍后,提供,车牌识别的代码,我将继续优化。提高识别率,尽早可以应用在arm平台上。


  • 相关阅读:
    ASP.NET Core 2.2 基础知识(七) 选项模式
    ASP.NET Core 2.2 基础知识(六) 配置(内含MySql+EF)
    ASP.NET Core 2.2 基础知识(五) 环境
    ASP.NET Core 2.2 基础知识(四) URL重写中间件
    shell 环境变量
    shell 数值运算
    shell IF分支判断语句
    WINDOWS 端口查看
    mybatis-ResultMappingResolver类信息
    shell 基本概述
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7168822.html
Copyright © 2011-2022 走看看