/* ** bmp8 must be grayscale ** (x1,y1) and (x2,y2) from top left of bitmap */ void jocr_single_word_from_bmp8(char *text,int maxlen,WILLUSBITMAP *bmp8, int x1,int y1,int x2,int y2,int allow_spaces, int std_proc) { job_t *job,_job; int i,w,h,dw,dh,bw; unsigned char *src,*dst; // static char *funcname="jocr_single_word_from_bmp8"; char *buf; int pgm2asc(job_t *job); char *getTextLine(int); if (x1>x2) { w=x1; x1=x2; x2=w; } w=x2-x1+1; bw=w/40; if (bw<6) bw=6; dw=w+bw*2; if (y1>y2) { h=y1; y1=y2; y2=h; } h=y2-y1+1; dh=h+bw*2; job=&_job; job_init(job); job_init_image(job); // willus_mem_alloc_warn((void **)&job->src.p.p,w*h,funcname,10); /* Must use malloc since job_free_image counts on this. */ job->src.p.p=malloc(dw*dh); job->src.p.x=dw; job->src.p.y=dh; job->src.p.bpp=1; src=bmp_rowptr_from_top(bmp8,y1)+x1; memset(job->src.p.p,255,dw*dh); dst=(unsigned char *)job->src.p.p + dw*bw + bw; for (i=y1;i<=y2;i++,dst+=dw,src+=bmp8->width) memcpy(dst,src,w); pgm2asc(job); buf=getTextLine(0); if (buf) { strncpy(text,buf,maxlen-1); text[maxlen-1]='\0'; if (std_proc) ocr_text_proc(text,allow_spaces); } else text[0]='\0'; // willus_mem_free((double **)&job->src.p.p,funcname); job_free_image(job); }
void test() { int multipnm=1; job_t job; while (multipnm==1) { job_init(&job); job.cfg.out_format=XML; job.cfg.cfilter = filter; job.src.fname = "patch00000.pgm"; // TODO multipnm=readpgm(job.src.fname, &job.src.p, job.cfg.verbose); if (multipnm<0) break; pgm2asc(&job); int linecounter = 0; const char *line; line = getTextLine(linecounter++); while (line) { //fputs(line, stdout); //Interpret line here line = getTextLine(linecounter++); } free_textlines(); job_free(&job); } return; }
/* ------------------------------------------------------------- // ------ MAIN - replace this by your own aplication! // ------------------------------------------------------------- */ int main(int argn, char *argv[]) { int multipnm=1; job_t job; JOB = &job; setvbuf(stdout, (char *) NULL, _IONBF, 0); /* not buffered */ while (multipnm==1) { job_init(&job); process_arguments(&job, argn, argv); mark_start(&job); multipnm = read_picture(&job); /* separation of main and rest for using as lib this will be changed later => introduction of set_option() for better communication to the engine */ if (multipnm<0) break; /* read error */ /* call main loop */ pgm2asc(&job); mark_end(&job); print_output(&job); job_free(&job); } return 0; }
// Function: osra_gocr_ocr() // Make an attempt to OCR the image box with GOCR engine. // // Parameters: // job_t - includes pixel map and character filter // // Returns: // 0 in case the recognition failed or valid alphanumeric character char osra_gocr_ocr(job_t &gocr_job) { OCR_JOB = &gocr_job; JOB = &gocr_job; // cout<<"Before gocr"<<endl; try { pgm2asc(&gocr_job); } catch (...) { } //cout<<"After gocr"<<endl; char *l = (char *) gocr_job.res.linelist.start.next->data; if (l != NULL && strlen(l) == 1 && isalnum(l[0])) return l[0]; return UNKNOWN_CHAR; }
/* ------------------------------------------------------------- // ------ MAIN - replace this by your own aplication! // ------------------------------------------------------------- */ int main(int argn, char *argv[]) { int multipnm=1; job_t job1, *job; /* fixme, dont want global variables for lib */ job=OCR_JOB=&job1; setvbuf(stdout, (char *) NULL, _IONBF, 0); /* not buffered */ job_init(job); /* init cfg and db */ process_arguments(job, argn, argv); /* load character data base (JS1002: now outside pgm2asc) */ if ( job->cfg.mode & 2 ) /* check for db-option flag */ load_db(job); /* load_db uses readpnm() and would conflict with multi images */ while (multipnm==1) { /* multi-image loop */ job_init_image(job); /* single image */ mark_start(job); multipnm = read_picture(job); /* separation of main and rest for using as lib this will be changed later => introduction of set_option() for better communication to the engine */ if (multipnm<0) break; /* read error */ /* call main loop */ pgm2asc(job); mark_end(job); print_output(job); job_free_image(job); } return ((multipnm<0)?multipnm:0); /* -1=255 on error, 0 ok */ }
char* gocr_main(job_t* job) { int multipnm=1; char* output; setvbuf(stdout, (char *) NULL, _IONBF, 0); /* not buffered */ /* load character data base (JS1002: now outside pgm2asc) */ if ( job->cfg.mode & 2 ) /* check for db-option flag */ load_db(job); /* load_db uses readpnm() and would conflict with multi images */ while (multipnm==1) { /* multi-image loop */ job_init_image(job); /* single image */ mark_start(job); multipnm = read_picture(job); /* separation of main and rest for using as lib this will be changed later => introduction of set_option() for better communication to the engine */ if (multipnm<0) break; /* read error */ /* call main loop */ pgm2asc(job); mark_end(job); output = print_output(job); job_free_image(job); } // return ((multipnm<0)?multipnm:0); /* -1=255 on error, 0 ok */ return output; }