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

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

包括 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;
}

不用再重新复制数据了,优化了代码,节省了时间(其实节省的也不是很多^^ )。

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

时间: 2024-10-25 22:30:16

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

基于ARM的车牌识别技术研究与实现

在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法工程师职业.现在做人脸识别相关系统.希望能和网络上的有志之士一起在相关方向上学习和进步. 本文首先介绍了课题背景和研究现状,然后介绍了方案选择和设计过程.设计过程包括车牌识别程序设计,引导程序设计,内核驱动设计和文件系统设计.车牌识别程序设计中的车牌定位采用边缘检测和支持向量机相结合的定位算法,字符

车牌识别LPR(八)-- 字符识别

?第八篇:字符识别 车牌定位.车牌倾斜校正.车牌字符分割都是为车牌字符识别做的前提工作,这些前提工作直接关系到车牌识别系统的性能.车牌字符识别是车牌识别系统的核心部分,车牌字符识别的准确率是衡量车牌识别系统的一个很重要的指标. 一般字符识别的方法就是采用模式识别方法,简单的来说模式识别就是先通过提取输入模板的特征,然后通过模板的特征对样本进行分类,从而识别出样本.模式识别主要包括:数据采集.预处理.特征提取.特征匹配,其结构框架如图: 字符识别是模式识别的一个重要应用,首先提取待识别字符的特征:

C++标准库和标准模板库

C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义. 在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括: (1)成本:已经作为标准提供,何苦再花费时间.人力重新开发呢: (2)质量:标准库的都是经过严格测试的,正确性有保证: (3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平: (4)良好的编程风格:采用行业中普遍的做法进行开发. 一.C++标准库 C++标准库的内容分为10类, 分别是:C1.语

车牌识别算法介绍与实践

汽车牌照自己主动识别整个处理过程分为预处理.边缘提取.车牌定位.字符切割.字符识别五大模块,当中字符识别过程主要由下面3个部分组成: ①正确地切割文字图像区域: ②正确的分离单个文字: ③正确识别单个字符. 用MATLAB软件编程来实现每个部分,最后识别出汽车牌照. 系统设计概述 因为车辆牌照是机动车唯一的管理标识符号,在交通管理中具有不可替代的作用,因此车辆牌照识别系统应具有非常高的识别正确率,对环境光照条件.拍摄位置和车辆行驶速度等因素的影响应有较大的容阈,而且要求满足实时性要求. 该系统是

基于opencv的车牌识别系统

前言 学习了很长一段时间了,需要沉淀下,而最好的办法就是做一个东西来应用学习的东西,同时也是一个学习的过程. 概述     OpenCV的全称是:Open Source Computer Vision Library.OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算

C++标准模板库之vector(Boolan)

vector是C++标准模板库中一种常见的容器,像数组类似,vector使用连续的存储空间用来保存元素,使用指针偏移可以快速的访问元素(通常认为是O1复杂度),与数组不同的是它的大小是可变的,在vector内部使用动态分配的内存保存元素,这意味着vector增长时需要重新分配内存,并将原来的原来的数据复制到该内存单元,需要很大的开销,因此vector并不会在每次新增元素时候都重新分配内存空间.vector实际容量(capacity)通常比实际大小(size)大得多.参考数据结构(C++语言版),

C++的标准模板库(STL)简介

STL(Standard Template Library,标准模板库)是C++对泛型编程思想的实现,最早是惠普实验室开发的.在被引入C++之前该技术就已经存在了很长的一段时间.后来STL成为ANSI/ISO C++标准的一部分.各个C++厂商也有各自相应的模板库,这些库效率可能很高,但可移植性不一定好. 在C++标准中,STL被组织为下面的17个头文件:<algorithm>.<deque>.<functional>.<iterator>.<arra

车牌识别--S5PV210测试第二次优化

优化: 1.RGB转HSV 浮点运算改成定点运算: 2.匹配模板由图片改成C语言数组: 3.优化测试BMP车牌图片读取(两层for循环改为一层for循环): 整体相比优化之前时间减少110ms左右. 640x480: 160ms 左右 320x240: 55ms 左右 [[email protected]]#./car test/1.bmp BMP Size:921654, Info_length:54, H:640, W:480 The Car ID IS: ÔÁ A F Q 7 8 7 To

八、C++ 标准模板库-STL概述

C++ 标准模板库-STL概述 一.基本概念 1.1 泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用,重用在两个方面有体现: 面向对象的思想:继承和多态,标准类库 泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库 STL 简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法. 标准模板库