tessdll.cpp

来自「一个google的OCR源码」· C++ 代码 · 共 352 行

CPP
352
字号
///////////////////////////////////////////////////////////////////////// File:        tessdll.cpp// Description: Windows dll interface for Tesseract.// Author:      Glen Wernersbach// Created:     Tue May 15 10:30:01 PDT 2007//// (C) Copyright 2007, Jetsoftdev.// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at// http://www.apache.org/licenses/LICENSE-2.0// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License./////////////////////////////////////////////////////////////////////////// tessdll.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "mfcpch.h"#include "applybox.h"#include "control.h"#include "tessvars.h"#include "tessedit.h"#include "pageres.h"#include "imgs.h"#include "varabled.h"#include "tprintf.h"#include "tesseractmain.h"#include "stderr.h"#include "notdll.h"#include "tessdll.h"#ifdef __MSW32__extern ESHM_INFO shm;            /*info on shm */#define TICKS       1000#endifextern BOOL_VARIABLE tessedit_write_ratings;extern BOOL_VARIABLE tessedit_write_output;extern BOOL_VARIABLE tessedit_write_raw_output;extern BOOL_VARIABLE tessedit_write_txt_map;extern BOOL_VARIABLE tessedit_resegment_from_boxes;//unsigned char membuf[sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR)];BOOL APIENTRY DllMain( HANDLE hModule,                       DWORD  ul_reason_for_call,                       LPVOID lpReserved                     ){  switch (ul_reason_for_call)  {    case DLL_PROCESS_ATTACH:    case DLL_THREAD_ATTACH:    case DLL_THREAD_DETACH:    case DLL_PROCESS_DETACH:      break;  }  return TRUE;}TessDllAPI::TessDllAPI(const char* lang) {  const char *fake_argv[] = { "api_config" };  uinT16 oldlang;  //language  ocr_open_shm ("0", "0", "0", "0", "0", "0", &oldlang);  init_tesseract ("TESSEDIT", "tessapi", lang, 0L, 1, fake_argv);  if (interactive_mode) {    debug_window_on.set_value (TRUE);  }  tessedit_write_ratings.set_value (TRUE);  tessedit_write_output.set_value(FALSE);  tessedit_write_raw_output.set_value(FALSE);  tessedit_write_txt_map.set_value(FALSE);  page_res=0L;  block_list = 0L;  membuf = (unsigned char *) new BYTE[(sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR))];}TessDllAPI::~TessDllAPI() {  EndPage();  End();  if (membuf) delete []membuf;}int TessDllAPI::BeginPage(uinT32 xsize,uinT32 ysize,unsigned char *buf){    return BeginPage(xsize,ysize,buf,1);}int TessDllAPI::BeginPage(uinT32 xsize,uinT32 ysize,unsigned char *buf,uinT8 bpp) {  inT16 c;  EndPage();  if (page_image.create (xsize+800, ysize+800, 1)==-1)    return 0L;  //make the image bigger to enclose in whitespace  //copy the passed buffer into the center of the image  IMAGE tmp;  tmp.create(xsize, ysize, bpp);  for (c=0;c<ysize;c++)    CopyMemory(tmp.get_buffer ()+(c)*((xsize*bpp + 7)/8),               buf+((ysize-1)-c)*((xsize*bpp + 7)/8),((xsize*bpp + 7)/8));  copy_sub_image(&tmp, 0, 0, 0, 0, &page_image, 400, 400, false);  return ProcessPagePass1();}int TessDllAPI::BeginPageUpright(uinT32 xsize,uinT32 ysize,unsigned char *buf){    return BeginPageUpright(xsize,ysize,buf,1);}int TessDllAPI::BeginPageUpright(uinT32 xsize,uinT32 ysize,unsigned char *buf, uinT8 bpp) {    EndPage();//It looks like Adaptive thresholding is disabled so this must be a 1 bpp image  if (page_image.create (xsize+800, ysize+800, 1)==-1)    return 0L;  //make the image bigger to enclose in whitespace  //copy the passed buffer into the center of the image  IMAGE tmp;  tmp.capture(buf, xsize, ysize, bpp);  copy_sub_image(&tmp, 0, 0, 0, 0, &page_image, 400, 400, true);  return ProcessPagePass1();}int TessDllAPI::ProcessPagePass1() {  STRING pagefile;               //input file  static const char *fake_name = "noname.tif";  //invert just to make it a normal black on white image.  invert_image(&page_image);  block_list = new BLOCK_LIST;  pagefile = fake_name;  pgeditor_read_file(pagefile, block_list);  if (tessedit_resegment_from_boxes)    apply_boxes(block_list);  page_res = new PAGE_RES(block_list);  if (page_res)    recog_all_words(page_res, global_monitor,0L,1);  return (page_res!=0);}void TessDllAPI::EndPage() {  if (page_res) delete page_res;  page_res=0L;  if (block_list) delete block_list;  block_list = 0L;}ETEXT_DESC * TessDllAPI::Recognize_all_Words(void) {  return Recognize_a_Block(0,0,0,0);}ETEXT_DESC * TessDllAPI::Recognize_a_Block(uinT32 left,uinT32 right,                                           uinT32 top,uinT32 bottom) {  TBOX          target_word_box(ICOORD (left+400, top+400), ICOORD (right+400, bottom+400));  int           i;  shm.shm_size=sizeof (ETEXT_DESC)+32000L*sizeof (EANYCODE_CHAR);  memset(membuf,0,shm.shm_size);  shm.shm_mem=membuf;  global_monitor = ocr_setup_monitor();  recog_all_words(page_res, global_monitor,(right==0 ? 0L : &target_word_box),2);  for (i=0;i<global_monitor->count;i++) {    global_monitor->text[i].left-=400;    global_monitor->text[i].right-=400;    global_monitor->text[i].bottom-=400;    global_monitor->text[i].top-=400;  }  global_monitor = 0L;  return ((ETEXT_DESC *) membuf);}TessDllAPI *recognize=0L;char* current_lang = 0L;extern "C"{TESSDLL_API void __cdecl TessDllRelease() {  if (recognize) delete recognize;  recognize=0L;}TESSDLL_API void  * __cdecl TessDllInit(const char* lang) {  if (recognize) TessDllRelease();  recognize = new TessDllAPI(lang);  if (current_lang != 0L)    free(current_lang);  current_lang = lang ? strdup(lang) : 0L;  return (void*) recognize;}TESSDLL_API int __cdecl TessDllBeginPageBPP(uinT32 xsize,uinT32 ysize,                                         unsigned char *buf, uinT8 bpp) {  return TessDllBeginPageLangBPP(xsize, ysize, buf, NULL,bpp);}TESSDLL_API int __cdecl TessDllBeginPageLangBPP(uinT32 xsize, uinT32 ysize,                                             unsigned char *buf,                                             const char* lang, uinT8 bpp) {  if (recognize==0L || (lang != 0L) != (current_lang != 0L) ||      lang != 0L && strcmp(lang, current_lang))    TessDllInit(lang);  return recognize->BeginPage(xsize, ysize, buf,bpp);}TESSDLL_API int __cdecl TessDllBeginPageUprightBPP(uinT32 xsize, uinT32 ysize,                                             unsigned char *buf,                                             const char* lang, uinT8 bpp) {  if (recognize==0L || (lang != 0L) != (current_lang != 0L) ||      lang != 0L && strcmp(lang, current_lang))    TessDllInit(lang);  return recognize->BeginPageUpright(xsize, ysize, buf,bpp);}TESSDLL_API int __cdecl TessDllBeginPage(uinT32 xsize,uinT32 ysize,                                         unsigned char *buf) {  return TessDllBeginPageLangBPP(xsize, ysize, buf, NULL,1);}TESSDLL_API int __cdecl TessDllBeginPageLang(uinT32 xsize, uinT32 ysize,                                             unsigned char *buf,                                             const char* lang) {  if (recognize==0L || (lang != 0L) != (current_lang != 0L) ||      lang != 0L && strcmp(lang, current_lang))    TessDllInit(lang);  return recognize->BeginPage(xsize, ysize, buf,1);}TESSDLL_API int __cdecl TessDllBeginPageUpright(uinT32 xsize, uinT32 ysize,                                             unsigned char *buf,                                             const char* lang) {  if (recognize==0L || (lang != 0L) != (current_lang != 0L) ||      lang != 0L && strcmp(lang, current_lang))    TessDllInit(lang);  return recognize->BeginPageUpright(xsize, ysize, buf);}TESSDLL_API void __cdecl TessDllEndPage(void) {  recognize->EndPage();}TESSDLL_API ETEXT_DESC * __cdecl TessDllRecognize_a_Block(uinT32 left,                                                          uinT32 right,                                                          uinT32 top,                                                          uinT32 bottom) {  return recognize->Recognize_a_Block(left,right,top,bottom);}TESSDLL_API ETEXT_DESC * __cdecl TessDllRecognize_all_Words(void) {  return recognize->Recognize_all_Words();}//deprecated funtionsTESSDLL_API void __cdecl ReleaseRecognize(){    if (recognize) delete recognize;recognize=0L;}TESSDLL_API void  * __cdecl InitRecognize(){if (recognize) ReleaseRecognize();recognize = new TessDllAPI();return (void*) recognize;}TESSDLL_API int __cdecl CreateRecognize(uinT32 xsize,uinT32 ysize,unsigned char *buf){InitRecognize();return recognize->BeginPage(xsize,ysize,buf);}TESSDLL_API ETEXT_DESC * __cdecl reconize_a_word(uinT32 left,uinT32 right,uinT32 top,uinT32 bottom){return recognize->Recognize_a_Block(left,right,top,bottom);}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?