同tesseract OCR识别对图片有要求一样,在训练新的字符集或新的字体时,对图片也有一定要求,符合要求的图片,能大大提高训练的效率。
在图像处理方面,去除噪声,使训练的字符图片尽量连贯、清晰。
其他方面,通常的要求如下:
1. 在一幅图片内,字体统一,决不能将多种字体混合出现在一幅训练图片内;如果不是通过扫描文本获取的字符图片,这个条件很容易被忽视。
2. 理想条件下,同种字体的字符图片集中到一幅大的训练图片中,在同一页内;
3. 要保留一定的字符间距与行间距;
4. 字符高度(大小),只要满足高度最小条件即可,对于小写字符x,其高度要至少大于10个像素;
5. 对于非字母字符,如!@#$%^&(),.{}<>/?,不要集中在一起出现,原因是这样不利于tesseract找出 文本行基线baseline,不利于文本高度及大小的检测,baseline检测是tesseract engine的第一步;
6. 一般每个字符需要10个样本,高频常见字符至少20个样本,不常见字符需要5个样本;
7. 对于同种字体,多页训练图片,可以在训练中,件用相同的方式合并tr文件和box文件,两类文件内的字符次序要相同,利于提高训练效果。
在获取训练字符图片方面,不一定非要从待识别图片中收集,可以利用word字符集找到对应字体,打印,扫描,获取训练图片,简单、方便。这个根据实际情况来应用。
tesseract中有这样一句话:
but note that there is no incremental training mode that allows you to add new training data to existing sets.
大意是,没有增量训练的方式,把新的训练数据加入现有的数据集。
有的提出,通过使用多个训练库联合使用,如参数 -l 之后 tesseract input.tif output -l eng+newfont , 其效果待测试。
//1.下面代码有什么错误?
Void test1()
{
char string[10];
char *str1="0123456789";
strcpy(string, str1);
}
//--------------------------------------
2.下面代码有什么问题?
Void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
}
//--------------------------------------
//3.下面代码有什么问题?
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}
//上面几个问题都是数组越界
//strcpy拷贝的结束标志是查找字符串中的/0 因此如果字符串中没有遇到/0的话 会一直复制,直到遇到/0,上面的123都因此产生越界的情况
//建议使用 strncpy 和 memcpy
int a = ~0;
if( a>65536 )
{
cout<<"32 bit"<<endl;
}
else
{
cout<<"16 bit"<<endl;
}