如何得到车牌识别的字体?

赵磊 2009-04-06 08:55:31
车牌识别字体
文章来源:www.voicing.cn
作者:赵磊
时间:2009.04

车牌识别软件需要车牌的字体信息。 作者根据《GA36-2007中华人民共和国机动车号牌》 编写了车牌字体模块。
整个模块只有一个入口函数:
bool LPRFontGet(char character,int x,int y)
在本文稍后的代码中前半部分就是这个函数的实现。 后半部分是使用这个函数的一个例子。
LPRFontGet 的功能是取得字符character在(x,y)坐标的二值像素。
输入参数:
character
需要获取字体的字符。取值范围包括数字: 0,1,2,3,4,5,6,7,8,9 和英文字母:A,B,C,D,E,F,G, H,I,J,K,L,M,N, O,P,Q,R,S,T, U,V,W,X,Y,Z。 注意,character并不区分大小写。
x
需要获取字体的x坐标。 取值范围是0~(LPT_FONT_WIDTH-1)。 LPT_FONT_WIDTH 是宏定义,目前的值是16。
y
需要获取字体的y坐标。 取值范围是0~(LPT_FONT_HEIGHT-1)。 LPT_FONT_HEIGHT 是宏定义,目前的值是LPT_FONT_WIDTH的二倍,即32。
返回值:
当输入参数合法时, 如果点(x,y)是字符上的点,LPRFontGet返回true, 否则返回false。
当输入参数非法时,LPRFontGet返回false。
注意:
1、字符1比较特殊,目前的返回值全是true。 这里并没有计算其左右的空白。 因为识别字符时, 也需要去掉图片上字符的上下左右空白。
2、LPRFontGet 本身的实现是一个类似于二值位图的数据结构, 字体信息保存在mask中;所以不需要添加任何字体文件。 其中的mask是静态常量,效率高。
3、不可以使用普通的字体,作为车牌识别的字体。
代码:
#define LPT_FONT_WIDTH 16
#define LPT_FONT_HEIGHT (LPT_FONT_WIDTH*2)
bool LPRFontGet(char character,int x,int y)
{
static const int mask[][LPT_FONT_WIDTH*LPT_FONT_HEIGHT/(sizeof(int)*8)]=
{
{0x7ffe7ffe,0x7ffe7ffe,0x3e003c00,0x0f001f00,0x07800f80,0x03e003c0,0x0ff007f0,0x3e401fe0,
0x70007800,0x70007000,0xf000f000,0x700ff000,0x700e700f,0x7c3e781e,0x1ff83ffc,0x03800ff0},
{0x3c003c00,0x3e003c00,0x3f003e00,0x3f003f00,0x3f803f80,0x3fc03fc0,0x3de03de0,0x3cf03ce0,
0x3c783c70,0x3c383c78,0x3c1e3c1c,0xffff3c1e,0xffffffff,0x3c00ffff,0x3c003c00,0x3c003c00},
{0x7ffe7ffe,0x7ffe7ffe,0x001e001e,0x001e001e,0x001e001e,0x001e001e,0x1ffe07fe,0x3e7e3ffe,
0x7000781c,0x70007000,0xf000f000,0x700f7000,0x700e700f,0x7c3e781e,0x1ff83ffc,0x03800ff0},
{0x0e000000,0x0f001f00,0x07c00780,0x01e003e0,0x00f000f0,0x00780078,0x003c0038,0x0ffc07dc,
0x3ffe3ffe,0x781e7c3e,0x700f700f,0xf00ff00f,0x701e700f,0x7e7c781e,0x1ff83ffc,0x03c00ff0},
{0xffffffff,0xffffffff,0x7800f000,0x3c007800,0x3c003c00,0x1e001c00,0x1e001e00,0x0f000f00,
0x0f000f00,0x07000700,0x07800780,0x07800780,0x03800380,0x03800380,0x03800380,0x03800380},
{0x0fe00180,0x3ff81ff8,0x783c3e7c,0x701e701e,0x700e700e,0x781e701e,0x3e7c783c,0x1ff81ff8,
0x3ffc3ffc,0x781e7c3e,0xf00f700e,0xf00ff00f,0x701f700f,0x7c3e781e,0x1ffc3ffc,0x03c00ff8},
{0x07f00180,0x3ffc1ff8,0x7c1e3e7c,0x700e701e,0xf00f700f,0x700e700f,0x781e781e,0x7ffc7e7c,
0x7ff07ff8,0x3c003c80,0x1e003c00,0x0f001e00,0x07800f80,0x01e003c0,0x00f801f0,0x00200078},
{0x03c003c0,0x03c003c0,0x07e007e0,0x07e007e0,0x07e007e0,0x0ff00ff0,0x0e700ff0,0x1e780e70,
0x1e781e78,0x1c381e78,0x3c383c38,0x3ffc3c3c,0x7ffc3ffc,0x781e7ffe,0x701e781e,0x0003701e},
{0x07ff003f,0x3fff1fff,0x780f7fff,0x700f700f,0x700ff00f,0x780f700f,0x3fff7c0f,0x3fff1fff,
0x780f3e0f,0x700f700f,0x700f700f,0x700f700f,0x700f700f,0x7c0f780f,0x1fff3fff,0x00ff0fff},
{0x0ff00380,0x3ffc1ff8,0x781e7c7e,0x700f700f,0x000ff00f,0x000f000f,0x000f000f,0x000f000f,
0x000f000f,0x000f000f,0xf00f000f,0xf00ff00f,0x700e700f,0x7c3e701e,0x1ff83ffc,0x01800ff0},
{0x0fff03ff,0x3fff1fff,0x780f7c0f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,
0xf00ff00f,0x700ff00f,0x700f700f,0x700f700f,0x700f700f,0x7c0f780f,0x1fff3fff,0x01ff0fff},
{0x7fff7fff,0x7fff7fff,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x3fff3fff,
0x000f3fff,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0xffffffff,0xfffeffff},
{0x7fff7fff,0x7fff7fff,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x3fff3fff,
0x3fff3fff,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000e000f},
{0x0fe00000,0x3ffc1ff8,0x781e7e7c,0x700f700e,0x000f000f,0x000f000f,0xff8f000f,0xff8fff8f,
0xf00fff8f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ef00f,0x783e701e,0x3ff83ffc,0x01801ff0},
{0x700f700e,0x700f700f,0x700f700f,0x700f700f,0x700f700f,0x700f700f,0xf00f700f,0xffffffff,
0xffffffff,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0x700ff00f},
{0xffffffff,0xffffffff,0x0fe07ffe,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,
0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0x0fe00fe0,0xffffffff,0xffffffff},
{0xf0007000,0xf000f000,0xf000f000,0xf000f000,0xf000f000,0xf000f000,0xf000f000,0xf000f000,
0xf000f000,0xf000f000,0xf000f000,0xf000f000,0x700e700e,0x7c3c781e,0x3ff83ffc,0x01800ff0},
{0x700e000e,0x7c0e780e,0x1e0e3c0e,0x0f0e1e0e,0x078e0f0e,0x07ce078e,0x07ee07ce,0x0ffe0ffe,
0x0e7e0ffe,0x1e3e0e3e,0x1c1e1e1e,0x3c0e1c0e,0x380e3c0e,0x780e380e,0x700f700f,0x000e700f},
{0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,
0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0xffffffff,0xfffeffff},
{0xf01ff00e,0xf81ff81f,0xfc3ffc3f,0xfe7ffe7f,0xffefffff,0xf7cff7ef,0xf18ff3cf,0xf10ff18f,
0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ef00f},
{0xf00f700f,0xf01ff01f,0xf03ff03f,0xf07ff03f,0xf0fff07f,0xf0fff0ff,0xf1eff1ef,0xf3cff3cf,
0xf78ff3cf,0xff0ff78f,0xff0fff0f,0xfe0fff0f,0xfc0ffe0f,0xf80ffc0f,0xf80ff80f,0x6000f00f},
{0x0ff00180,0x3ffc1ff8,0x781e3e3e,0x700f700f,0x700f700f,0x700f700f,0x700f700f,0x700f700f,
0x700f700f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0x700ff00f,0x7c3e781e,0x1ff83ffc,0x01800ff0},
{0x0fff01ff,0x3fff1fff,0x780f7e0f,0x700f700f,0xf00f700f,0x700ff00f,0x780f700f,0x3fff7e0f,
0x07ff1fff,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f,0x000f000f},
{0x07f00180,0x3ffc1ff8,0x781e3e3e,0x700e780e,0x700f700f,0x700f700f,0x700f700f,0x700e700e,
0x700e700e,0x700e700e,0x73ce73ce,0xf78e738e,0x7f0ef70e,0x7e3e7e1e,0x3ff83ffc,0x01007ff0},
{0x07ff007c,0x3fff1fff,0x780f3e0f,0x700f780f,0xf00f700f,0x700ff00f,0x780f700f,0x3fff7e0f,
0x07ff1fff,0x0f0f078f,0x0e0f0f0f,0x1e0f0e0f,0x3c0f1e0f,0x380f3c0f,0x780f780f,0xf00f700f},
{0x07f00180,0x1ffc0ff8,0x3c1e3e7c,0x780e781e,0x000e700e,0x001e000e,0x007c001e,0x1ff807f8,
0x7c003fe0,0x70007800,0x70007000,0x7000f000,0x701e700f,0x3c3e781e,0x1ff83ffc,0x01800ff0},
{0xffff03ff,0xffffffff,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,
0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0,0x03c003c0},
{0xf00e7000,0xf00ef00e,0xf00ef00e,0xf00ef00e,0xf00ef00e,0xf00ef00e,0xf00ef00e,0xf00ef00e,
0xf00ef00e,0xf00ef00e,0xf00ef00e,0xf00ef00e,0x700ef00e,0x7c3c781e,0x3ff83ffc,0x03c01ff0},
{0xf00e000e,0x701e700e,0x781e701e,0x781c781e,0x3c3c383c,0x3c3c3c3c,0x1c381c38,0x1e781e78,
0x0e781e78,0x0ff00f70,0x0ff00ff0,0x07f007f0,0x07e007e0,0x03e007e0,0x03e003e0,0x01c003c0},
{0xf10ef00f,0xf10ef10e,0x718ef18e,0x739e718e,0x73de73de,0x77de73de,0x77fe77de,0x7ffe77fe,
0x7ffc7ffe,0x7efc7ffc,0x7efc7efc,0x7e7c7e7c,0x3c7c7e7c,0x3c3c3c7c,0x3c3c3c3c,0x383c383c},
{0x701ef00e,0x781c701e,0x3c3c383c,0x1e783c38,0x0ef01e78,0x0ff00ef0,0x07e00fe0,0x03c007c0,
0x03c003c0,0x07e007c0,0x0ff00fe0,0x1e700ef0,0x3c381e78,0x3c3c3c3c,0x781e781c,0xf00f701e},
{0x781ef00f,0x783c781e,0x3c783c3c,0x1ef81e78,0x0ff00ef0,0x07e00fe0,0x07c007c0,0x03800380,
0x03800380,0x03800380,0x03800380,0x03800380,0x03800380,0x03800380,0x03800380,0x03800380},
{0x7fff7fff,0x7fff7fff,0x38007800,0x1c003c00,0x0e001e00,0x0f000e00,0x07800700,0x03c00380,
0x01e001c0,0x00f001e0,0x007800f0,0x00380078,0x003c003c,0x001e001e,0x7ffe7ffe,0xfffefffe},
};
int character_index;
if(character>=0&&character<=9)
character_index=character-0;
else if(character>=a&&character<=z)
character_index=character-a+10;
else if(character>=A&&character<=Z)
character_index=character-A+10;
else
return false;
if(x<0)
return false;
if(x>=LPT_FONT_WIDTH)
return false;
if(y<0)
return false;
if(y>=LPT_FONT_HEIGHT)
return false;
int int_index;
int_index=y*LPT_FONT_WIDTH+x;
int bit_index;
bit_index=int_index%(sizeof(int)*8);
int_index/=(sizeof(int)*8);
if(mask[character_index][int_index]&(1<<bit_index))
return true;
else
return false;
}
读者如果正在研发车牌识别系统的话, 还可以参考一下绿睿车牌识别。 其识别率和识别速度还是不错的。 目前这款高性能软件市场参考价只有¥210。
...全文
586 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujk 2009-07-01
  • 打赏
  • 举报
回复
没研究过,不过应该不会太难,如果不同类型的车牌的字体不一样的话,应该这么解决,先从车牌的颜色判断出车牌对应的类型,然后将《GA36》上对应的字体类型提出来就行了吧。
magicwei007 2009-06-30
  • 打赏
  • 举报
回复
麻烦问一下这段代码是干什么用的啊?能显示出车牌上面的字体吗?
赵磊 2009-04-06
  • 打赏
  • 举报
回复
上面那个不全呀。
static const int mask[][LPT_FONT_WIDTH*LPT_FONT_HEIGHT/(sizeof(int)*8)]=
{
{0x0ff00180,0x3ffc1ff8,0x781e7e7e,0xf00f700f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,
0xf00ff00f,0xf00ff00f,0xf00ff00f,0xf00ff00f,0x700ff00f,0x7c3e781e,0x3ff83ffc,0x07c01ff0},
{0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,
0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff,0xffffffff},
{0x07e00100,0x3ff81ff0,0x783e7e7c,0xf00e701e,0xe000e008,0x70007000,0x3c007800,0x1e003c00,
0x0f000f00,0x03c00780,0x01e003e0,0x00f800f0,0x003c0078,0x001e003e,0x7fff7fff,0x7fff7fff},
{0x7ffe7ffe,0x7ffe7ffe,0x3e003c00,0x0f001f00,0x07800f80,0x03e003c0,0x0ff007f0,0x3e401fe0,
0x70007800,0x70007000,0xf000f000,0x700ff000,0x700e700f,0x7c3e781e,0x1ff83ffc,0x03800ff0},
{0x3c003c00,0x3e003c00,0x3f003e00,0x3f003f00,0x3f803f80,0x3fc03fc0,0x3de03de0,0x3cf03ce0,
0x3c783c70,0x3c383c78,0x3c1e3c1c,0xffff3c1e,0xffffffff,0x3c00ffff,0x3c003c00,0x3c003c00},
{0x7ffe7ffe,0x7ffe7ffe,0x001e001e,0x001e001e,0x001e001e,0x001e001e,0x1ffe07fe,0x3e7e3ffe,
0x7000781c,0x70007000,0xf000f000,0x700f7000,0x700e700f,0x7c3e781e,0x1ff83ffc,0x03800ff0},
{0x0e000000,0x0f001f00,0x07c00780,0x01e003e0,0x00f000f0,0x00780078,0x003c0038,0x0ffc07dc,
0x3ffe3ffe,0x781e7c3e,0x700f700f,0xf00ff00f,0x701e700f,0x7e7c781e,0x1ff83ffc,0x03c00ff0},
{0xffffffff,0xffffffff,0x7800f000,0x3c007800,0x3c003c00,0x1e001c00,0x1e001e00,0x0f000f00,
0x0f000f00,0x07000700,0x07800780,0x07800780,0x03800380,0x03800380,0x03800380,0x03800380},
{0x0fe00180,0x3ff81ff8,0x783c3e7c,0x701e701e,0x700e700e,0x781e701e,0x3e7c783c,0x1ff81ff8,
0x3ffc3ffc,0x781e7c3e,0xf00f700e,0xf00ff00f,0x701f700f,0x7c3e781e,0x1ffc3ffc,0x03c00ff8},
{0x07f00180,0x3ffc1ff8,0x7c1e3e7c,0x700e701e,0xf00f700f,0x700e700f,0x781e781e,0x7ffc7e7c,
主要模块如下:颜色信息提取、车牌区域定位、识别、提取、检测倾斜度、车牌校正、车牌区域2值化、擦除干扰区域、文字分割、模版匹配、结果输出。 颜色信息提取: 本系统针对家庭小型车蓝底白字车牌进行识别。根据彩色图像的RGB比例定位出近似蓝色的候选区域。但是由于RGB三原色空间中两点间的欧氏距离与颜色距离不成线性比例,在设定蓝色区域的定位范围时不能很好的控制。因此造成的定位出错是最主要的。这样在图片中出现较多的蓝色背景情况下识别率会下降,不能有效提取车牌区域。对此本文提出了自适应调节方案。对分割出来的区域进行识别调整。根据长宽比,蓝白色比对候选区域进行多次定位。最终找到车牌区域。 倾斜校正: 本文在针对倾斜角度的图片采取rando算法进行倾斜角度计算,并对倾斜图片进行修正。从而得到水平方向一致的图片。有利于后期的图片分割及图像识别。 字符分割: 将计算得到车牌区域的彩色分割后的图象,对白色进行水平垂直投影,计算水平垂直峰,检测合理的字符高宽比.可用与区域分割相同的方法进行峰值的删除和合并.但在字符切割时,往往由于阈值取得不好,导致字符切割不准确,针对这种情况,可以由车牌格式的先验知识,对切割出的字符宽度进行统计分析,用以指导切割,对因错误切割过宽的字符进行分裂处理。对‘桂’字经常出现的是把木字旁和右边的部首分割开。系统针对这种问题对分割出来的字体的宽度与整个车牌的宽度对比,对误操作字符进行合并。一个智能的识别系统应减少系统对阈值的过分依赖。 字体识别: 常用做法是采用神经网络模型对系统进行训练。但是这种做法增加了系统的复杂度,对实时性要求较高的场合不适应。这里采用简单模版匹配算法。由于在前期的有效处理使得分割后的字体清晰度完整度都能保持较高的水平。有利于提高模版匹配的成功率。经验证对非倾斜图片,识别率可达95%,对倾斜图片亦可以达到90%以上。D--0,6--8,2--Z,A—4是比较容易识别出错的字符。 语音播报: 对字符正确识别之后,用事先对对每一个字符的录音根据对应字符顺序播放。在对车牌区域识别出错、字体分割出错时程序暂停,并有语音提醒。 存储数据: 播放结束之后对相应的识别出来的字符存储到指定文件夹的EXCEL文件内。并同时存储对应时间
第1章 窗体与界面设计 1 1.1 菜单应用 2 实例001 在系统菜单中添加菜单项 2 实例002 带历史信息的菜单 3 实例003 菜单动态合并 4 实例004 像“开始”菜单一样漂亮的菜单 5 实例005 多彩的菜单 6 实例006 可以拉伸的菜单界面 8 1.2 工具栏设计 9 实例007 带背景的工具栏 9 实例008 浮动工具栏 10 1.3 状态栏设计 11 实例009 在状态栏中显示检查框 11 实例010 带进度条的状态栏 12 实例011 状态栏中加入图标 13 1.4 导航菜单界面 14 实例012 OutLook界面 14 实例013 带导航菜单的主界面 15 实例014 图形化的导航界面 16 1.5 特色程序界面 18 实例015 类QQ的程序界面 18 实例016 类似Windows XP的程序界面 20 实例017 以图形按钮显示的界面 21 实例018 以树型显示的程序界面 23 实例019 以XPManifest组件显示界面 24 实例020 动态按钮的窗体界面 25 1.6 特殊形状的窗体 26 实例021 非矩形窗体 26 实例022 建立字体形状窗体 28 1.7 多媒体光盘 29 实例023 自动启动的多媒体光盘程序 29 实例024 为触摸屏程序添加虚拟键盘 30 实例025 触摸屏系统 31 1.8 窗体效果 33 实例026 半透明渐显窗体 33 实例027 窗口颜色的渐变 34 实例028 带背景的窗体 35 实例029 为窗体增加边框 36 1.9 窗体动画 37 实例030 窗体中的滚动字幕 37 实例031 动画显示窗体 38 实例032 制作闪烁的窗体 39 实例033 直接在窗体上绘图 40 实例034 动画形式的程序界面 41 实例035 以时钟显示界面窗体 42 1.10 标题栏窗体 44 实例036 标题栏上的按钮 45 实例037 使窗体标题栏文字右对齐 47 实例038 没有标题栏但可以改变大小的窗口 48 1.11 设置窗体位置 49 实例039 不可移动的窗体 49 实例040 设置窗体在屏幕中的位置 50 实例041 始终在最上面的窗体 51 1.12 设置窗体大小 52 实例042 限制窗体大小 52 实例043 获取桌面大小 53 实例044 组件大小随窗体的改变而改变 53 实例045 在窗口间移动按钮 54 实例046 如何实现Office助手 55 1.13 窗体控制技术 56 实例047 在关闭窗口前加入确认对话框 56 实例048 程序在循环中响应界面操作 57 实例049 使用任意组件拖动窗体 58 实例050 动态创建窗体和释放窗体 59 实例051 修改提示字体及颜色 60 1.14 其他技术 61 实例052 窗口融合技术 61 实例053 给MDI窗体加背景 62 实例054 如何关闭MDI类型窗体中的子窗体 63 实例055 向提示框中添加图标 64 第2章 控件应用 67 2.1 TEdit控件应用典型实例 68 实例056 从右至左输入数据 68 实例057 为TEdit控件添加列表选择框 69 实例058 只允许输入数字的TEdit组件 70 2.2 TSpeedButton控件应用典型实例 71 实例059 在TSpeedButton按钮中显示图标 71 实例060 折行显示按钮标题 72 2.3 TMemo控件应用典型实例 73 实例061 设置TMemo组件的边界 73 实例062 TMemo组件的光标定位 74 实例063 得到TMemo中的可见行数 75 2.4 TListBox控件应用典型实例 76 实例064 在TListBox组件间交换数据 76 实例065 为TListBox添加水平滚动条 77 实例066 将数据库数据添加到组合框中 78 实例067 借助绑定控件实现数据选择录入 79 2.5 TListView控件应用典型实例 80 实例068 TListView列表拒绝添加重复信息 80 实例069 将数据库数据添加到TListView控件 82 实例070 用TListView控件制作导航界面 83 实例071 在TListView控件中对数据排序或统计 84 实例072 在TListView组件中绘制底纹 86 实例073 在列表视图中拖动视图项 87 2.6 TTreeView控件应用典型实例 88 实例074 将数据库数据显示到树视图中 88 实例075 用TTreeView控件制作导航界面 90 实例076 TTreeView组件遍历磁盘目录 91 实例077 TTreeView组件在数据库中的应用 92 2.7 TStringGrid控件应用典型实例 94 实例078 程序运行时对

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧