车牌识别--模板库C语言数组的制作

标签: 车牌 模板 语言 | 发表时间:2014-06-02 07:10 | 作者:liujia2100
出处:http://blog.csdn.net

在车牌识别中,字符模板匹配的模板库是很大的。

包括 10个阿拉伯数字以及26个英文字母还有几十个汉字,每个库都是一张小图片,加载起来也比较繁琐。

后面还有可能为提高识别增加额外的模板库。

之前的处理中,是把这些库的图片文件放到一个文件夹中,程序启动后,再一个一个读取,这样文件的数量就比较多。

原图片模板如下:


程序稳定后,我们就不要这些字符模板库了,可以用数组的形式代替,就是把这些文件数据保存一个c语言数组里面,直接编译到程序中,运行程序的时候直接使用,不用一个一个加载,再去匹配。

目前使用的moan库图片是20x40的8bit灰度BMP格式文件,其信息头长度54+256x4=1078,直接略过信息头和调色板获取图片数据信息

模板制作的c代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CHAR_NUM 66
#define CHAR_WIDHT 20
#define CHAR_HEIGHT 40

char template[CHAR_NUM][CHAR_WIDHT * CHAR_HEIGHT];

int readstr(FILE *inFIL, unsigned char *srcBmp)
{

	int width,height, headlength;
	int i,j,line8;
	unsigned char *temp;
	unsigned char temp1;

	width = CHAR_WIDHT;
	height = CHAR_HEIGHT;
	headlength = 1078;//54 + 256 * 4; 

	line8=(width*8+31)/32*4;

	temp=(char *)malloc(height * line8 * sizeof(char));
	
	fseek(inFIL, headlength, SEEK_SET);
	
	fread(temp, line8 * height,1, inFIL);
	
	if(temp==NULL)
	{
		printf("\n读取失败\n"); 
		return -1;
	}

	for(i=0;i<height;i++)
	{
		for(j=0;j<width;j++)
		{
			temp1 = temp[i*line8+j];
			if(temp1 > 150)
				temp1 = 255;
			else
				temp1 = 0;
			srcBmp[(height-i-1)*width+j]= temp1;// (temp1 > 150 ? 255:0);//(byte)(0.299*bitmap[temp[i*line8+j]].bitb+0.578*bitmap[temp[i*line8+j]].bitg+0.114*bitmap[temp[i*line8+j]].bitr);
		}
	}
	free(temp);
	temp=NULL;
	
	return 0;
}

int readtemplate(char *path, char src[CHAR_NUM][CHAR_WIDHT * CHAR_HEIGHT])
{
	FILE *f[72];
	int i;
	char str[100];

	for(i = 0; i <= CHAR_NUM; i++)
	{
		sprintf(str, "%s%d.bmp", path, i);
		f[i]=fopen(str,"rb");
		if(f[i]==NULL)
		{
			printf("can't open patch:%s\n", str);
			return -1;
		}
		readstr(f[i], src[i]);
		fclose(f[i]);
	}
	
	return 0;
}


int main()
{
	int i, j;
	FILE *f;
	unsigned char p;
	char buf[5];
	f = fopen("Template.h", "wb");
	if(f == NULL)
	{
		printf("Can't open the file\n");
		return -1;
	}
	
	if(readtemplate(".\\test\\moban\\", template) != 0)
	{
		printf("readtemplate error\n");
		return -1;
	}
	
	for(i = 0; i < CHAR_NUM; i++)
		for(j = 0; j < CHAR_WIDHT * CHAR_HEIGHT; j ++)
		{
			if((j%800 == 0))
			fwrite("\n",strlen("\n"),1,f);
			
			p = template[i][j];
			
			sprintf(buf,"%4d,", p);
			fwrite(buf,strlen(buf),1,f);
		
		}

	fclose(f);
	return 0;
}

制作后的数组如下(变量名自行添加)




之前算法是一个一个读取,然后重新复制一遍

void readmoban(char *path,struct BMP_Plate *img2)
{
	FILE *f[72];
	int i;
	char str[80];
	
	for(i=0;i<=66;i++)
	{
		sprintf(str,"%s%d.bmp", path, i);
		f[i]=fopen(str,"rb");	
		if(f[i]==NULL)
		{
			printf("can't open moban:%d,%s\n", i, str);
			exit(-1);
		}
		readstr(f[i],img2->strc[i]); 
		displayGray(img2->strc[i],20,40,0,0);
		fclose(f[i]);
		
	}
	  
}

现在,只需要,指定数组指针,不用加载图片,也不用复制

int readtemplate(char *moban,struct BMP_Plate *img2)
{

	int i;
#if 0	
	for(i = 0; i <= CHAR_NUM; i++)
	{
		memcpy(img2->strc[i],&moban[i * TEMPPLATE_SIZE], TEMPPLATE_SIZE);
	}
#else
	for(i = 0; i <= CHAR_NUM; i++)
	{
		img2->strc[i] = &moban[i * TEMPPLATE_SIZE];
	}
#endif
	return 0;
}
不用再重新复制数据了,优化了代码,节省了时间(其实节省的也不是很多^^ )。

作者:liujia2100 发表于2014-6-1 23:10:17 原文链接
阅读:91 评论:0 查看评论

相关 [车牌 模板 语言] 推荐:

车牌识别--模板库C语言数组的制作

- - CSDN博客移动开发推荐文章
在车牌识别中,字符模板匹配的模板库是很大的. 包括 10个阿拉伯数字以及26个英文字母还有几十个汉字,每个库都是一张小图片,加载起来也比较繁琐. 后面还有可能为提高识别增加额外的模板库. 之前的处理中,是把这些库的图片文件放到一个文件夹中,程序启动后,再一个一个读取,这样文件的数量就比较多. 程序稳定后,我们就不要这些字符模板库了,可以用数组的形式代替,就是把这些文件数据保存一个c语言数组里面,直接编译到程序中,运行程序的时候直接使用,不用一个一个加载,再去匹配.

语言壁垒

- kylexlau - Chun Tian (binghe)
虽然经常更新微博,但确实又有些日子没写常规博客了. 10 月开始前有必要再写一篇,整理一下近期的各种思路,以良好的精神面貌迎接今年的最后一个季度. 首先发布一个已经不太新的消息:Practical Common Lisp 的中文版《实用 Common Lisp 编程》几经周折终于付印了,下月即可正式出版;读者们甚至已经可以在当当网上预订了.

模板方法

- - 博客园_首页
由于前两天刚好用到模板方法这个模式,而且这个模式相对来 比较简单实用,就写写个人的一些认知吧. 大家对宋丹丹和赵本山的小品里有一个很经典的台词一定不会陌生,而且还日常中经常引用:. 《钟点工》中宋丹丹问要把大象装冰箱,总共分几步. 赵本山就懵了,大象那么大,冰箱那么小,怎么才能把大象装冰箱里呢. 答案也很经典:三步:第1步,把冰箱门打开;第2步,把大象装进去;第3步,把冰箱门带上.

车牌里的潜规则

- 茫茫 - 南方周末-热点新闻
山西省曾作为国内整治特种车牌的典范区域. 但如今,对于特种车牌的整治却越来越力不从心,业内人士称:“整顿更像是一个障眼法,谁会主动革掉自己的特权.

UnQL:NoSQL查询语言

- 卡飞菲 - Solidot
CouchDB作者Damien Katz与SQLite作者Richard Hipp正在为NoSQL文档数据库开发一种高级查询语言UnQL(发音同Uncle,是UNstructured Query Language的缩写). Katz表示,他们坚信为了推广NoSQL需要一种通用的查询语言,类似当年推广关系型数据库应运而生的SQL语言.

Go 语言初步

- wei - 云风的 BLOG
所谓认真玩,就是拿 Go 写点程序,前后大约两千行吧. 据说 Go 的最佳开发平台是 Mac OS ,我没有. Windows 版还没全部搞定,但是也可以用了. 如果你用 google 搜索,很容易去到一个叫 go-windows 的开源项目上. 如果你用这个,很多库都没有,而且语法也是老的. 我在 Windows 下甚至不能正确链接自己写的多个 package.

C语言之父

- Dylen - 子说
同事说c语言之父去世了,另一个同事大吃一惊,问:谭浩强死了. 不知丹尼斯·里奇(Dennis Ritchie)情何以堪.

Bootstrap,网站模板,bootstrap模板

- - CSDN博客Web前端推荐文章
日期:2013-3-31  来源: GBin1.com. Charisma是一套全功能的,免费,会员质量的响应式HTML5管理员界面模板,基于 "Bootstrap",拥有了9套不同的主题颜色内容,可以满足你的不同需要. 完全响应式,针对了移动设备和触摸设备优化. 基于bootstrap,同时也支持jQuery UI.

CSS Media Queries 模板

- - blog.moocss.com
CSS Media Queries 模板. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60.

Eclipse注释模板

- - ITeye博客
Eclipse注释模板:Window->Preference->Java->Code Style->Code Template. (1)Comments-Types 类注释. * @author 你的名字. * @Version 版本. * @ModifiedBy 修改人. * @Copyright 公司名称.