tesseract box文件的制作

tesseract 是谷歌开源的一款主要识别印刷体的ocr软件,目前的了解,针对与纯色背景下的文字识别,其准确度可以达到商用级别,并且着重强调,4.x版本增加了LSTM技术,所以在处理文字的连续性,尤其是英文文字的分割来看,效果比3.x版本要好得多.


对tesseract的学习主要分为两大部分,第一是识别,第二是训练新语言包

因为tessercat本身接近于开箱即用的一种开源软件,它目前训练了上百种语言包,我们只是需要下载对应语言包即可.

而对于训练,我们需要制作自己的图片训练集box文件,这个是比较耗时的,另外需要补充一句,box文件字符的坐标原点与tesseract识别之后给出的不一样,这是是需要注意的.


这是每个字块,其中a-b-c-d代表其四个点

    a"""""b

    c"""""d
    
tesseract识别后,以a为坐标系原点方向点,a-b横坐标方向

给出 a d两个位置坐标位置
而对于box来说则是我们需要给出c,b两个位置

box文件的具体格式,可以参考opencv下的boxMaker代码

 

盒子的范围

例如

---------
|       |
|       |
---------
左上角和右下角
对应与opencv的mat中的横坐标和纵坐标

文本内容解析

C 385 193 438 253 0

后面那个0 是标识是在第几张图片上

 

/**
 *获取每个字所在的位置
 * @auther jianli.yang
 * @params pic num
 * pic 是图像的路径 num会生成 num.box文件
 * box文件位置含义:
 *  x1 y1 x2 y2
 *  以图片左下角为坐标原点 左下角横坐标 纵坐标 有上角横坐标 纵坐标 num
 *  过程中print出来的是位置坐标[以图片左上角为坐标原点,左上角和右下角坐标]
 * 
 * 使用方式:
 * 左键点击开始选择[可以松开左键],点击右键选择区域结束
 */
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <fstream>
using namespace std;
using namespace cv;

#define PICNAME "img-%d.jpeg"
Point pt1 = Point(0,0);
Point n_pt = Point(0,0);//目前的字体的RIGHT下角
char out_put[80] ={};
int pic_height = 0;
int num = 0;

bool is_press = false;//已经选择的点数

Mat img;
Mat img_show;

int now_pic = 0;
/**
 * 打印文本
 */
void printSS()
{
	std::ofstream ofs;
	ofs.open(out_put,ios::app);
	int x1,x2,y1,y2;
	if(pt1.x>n_pt.x){x1=n_pt.x;x2=pt1.x;}
	else {x2=n_pt.x;x1=pt1.x;}
	if(pt1.y>n_pt.y) {y1=n_pt.y;y2=pt1.y;}
	else {y2=n_pt.y;y1=pt1.y;}
	int font_h = (y2-y1);
	y1 = pic_height -font_h - y1;
	y2 = pic_height +font_h - y2;
	
	printf("%s %d %d %d %d %d\n",out_put,x1,y1,x2,y2,num);
	ofs<<" "<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<" "<<num<<"\n";	
	ofs.close();
} 
/**
 * 	鼠标点击事件回调函数
 *  按下右键取消,清空缓存区
 *  按下左键 - 并且成为输入模式[此时屏蔽左键点击事件]-此时将键盘输入的字符存入缓存区,然后当出现enter键的时候,将字符以及位置确定,并且写入文件
 *  
 */
void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{
	n_pt = Point(x,y);
	printf("(%d,%d),(%d,%d),%d\n",pt1.x,pt1.y,n_pt.x,n_pt.y,is_press);
	//取消
   if(flags==2 && is_press)
   {
	   is_press = false;
	   img = img_show.clone();
	   printSS();
   }
   //启动编辑模式
   if(flags==1 && !is_press)
   {
	   pt1 = Point(x,y);
	   is_press = true;
   }
   //如果已经按下了,改变颜色
   if(is_press){
		//changeColor();
		img_show = img.clone();
		rectangle(img_show,pt1,n_pt,Scalar(255,0,0));
		imshow("My Window", img_show);
	}
}
 
int main(int argc, char** argv)
{ 
    if(argc <3){
			printf("params error! you must puts two params\n");
	}
    //init
	img = imread(argv[1]);
	is_press = false;
	
	num = atoi(argv[2]);
	strcpy(out_put,argv[2]);
	strcat(out_put,".box");
	printf("%s\n",argv[2]);
	pic_height = img.rows;
	
    if ( img.empty() ) 
    { 
        cout << "Error loading the image" << endl;
        return -1; 
    }
    
    namedWindow("My Window", 1);
    setMouseCallback("My Window", CallBackFunc, NULL);
    imshow("My Window", img);
	uchar key = waitKey(0);    
    return 0;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值