Browse Source

Upgraded Tesseract from 4.1.1 to 5.0

pull/703/head
Canming Huang 4 years ago
parent
commit
7b5a92aa56
  1. 13
      Emgu.CV.Example/XamarinForms/Core/AboutPage.cs
  2. 4
      Emgu.CV.Example/XamarinForms/iOS/Emgu.CV.XamarinForms.iOS.csproj
  3. 2
      Emgu.CV.Example/iOS/Emgu.CV.Example.iOS.csproj
  4. 1
      Emgu.CV.Extern/CMakeLists.txt
  5. 11
      Emgu.CV.Extern/tesseract/libtesseract/CMakeLists.txt
  6. 2
      Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git
  7. 122
      Emgu.CV.Extern/tesseract/tesseract.cpp
  8. 87
      Emgu.CV.Extern/tesseract/tesseract_c.h
  9. 8
      Emgu.CV.OCR/LocaleGuard.cs
  10. 50
      Emgu.CV.OCR/OcrInvoke.cs
  11. 321
      Emgu.CV.OCR/PageIterator.cs
  12. 8
      Emgu.CV.OCR/Pix.cs
  13. 14
      Emgu.CV.OCR/TessResultRenderer.cs
  14. 48
      Emgu.CV.OCR/Tesseract.cs
  15. 4
      Emgu.CV.OCR/TesseractResult.cs
  16. 2
      Emgu.CV.Platform/Android/Resources/Resource.Designer.cs

13
Emgu.CV.Example/XamarinForms/Core/AboutPage.cs

@ -70,6 +70,17 @@ namespace Emgu.CV.XamarinForms
parallelText = String.Join("", parallelBackendText.ToArray());
String tesseractText;
String tesseractVersion = Emgu.CV.OCR.Tesseract.VersionString;
if (tesseractVersion.Length == 0)
{
tesseractText = "Not Built";
}
else
{
tesseractText = String.Format("Version: {0}", tesseractVersion);
}
Content =
new WebView()
{
@ -111,6 +122,8 @@ textarea { width: 100%; margin: 0; padding: 0; border - width: 0; }
" + (haveVideoio ? GetBackendInfo(CvInvoke.StreamBackends) : "Videoio backend not supported.") + @"
<H4> VideoWriter Backends: </H4>
" + (haveVideoio ? GetBackendInfo(CvInvoke.WriterBackends) : "Videoio backend not supported.") + @"
<H4> Tesseract OCR: </H4>
" + tesseractText + @"
<H4> Build Info </H4>
<textarea rows=""30"">"
+ CvInvoke.BuildInformation + @"

4
Emgu.CV.Example/XamarinForms/iOS/Emgu.CV.XamarinForms.iOS.csproj

@ -152,7 +152,7 @@
<Content Include="..\Core\box_in_scene.png">
<Link>box_in_scene.png</Link>
</Content>
<Content Include="..\Core\qrcode_barcode.png">
<Content Include="..\Core\qrcode_barcode.png">
<Link>qrcode_barcode.png</Link>
</Content>
<Content Include="..\Core\pedestrian.png">
@ -191,6 +191,8 @@
<ProjectReference Include="..\..\..\Emgu.CV.Platform\iOS\Emgu.CV.Platform.IOS.csproj">
<Project>{0EE2B36C-F7CD-49FA-A270-D7D988CFF6E5}</Project>
<Name>Emgu.CV.Platform.IOS</Name>
<IsAppExtension>false</IsAppExtension>
<IsWatchApp>false</IsWatchApp>
</ProjectReference>
<ProjectReference Include="..\..\..\Emgu.CV.Platform\NetStandard_iOS\Emgu.CV.Platform.NetStandard.IOS.csproj">
<Project>{79214dcd-3f36-4c50-97f4-11af21f60711}</Project>

2
Emgu.CV.Example/iOS/Emgu.CV.Example.iOS.csproj

@ -160,6 +160,8 @@
<ProjectReference Include="..\..\Emgu.CV.Platform\iOS\Emgu.CV.Platform.IOS.csproj">
<Project>{0EE2B36C-F7CD-49FA-A270-D7D988CFF6E5}</Project>
<Name>Emgu.CV.Platform.IOS</Name>
<IsAppExtension>false</IsAppExtension>
<IsWatchApp>false</IsWatchApp>
</ProjectReference>
<ProjectReference Include="..\..\Emgu.CV.Platform\NetStandard_iOS\Emgu.CV.Platform.NetStandard.IOS.csproj">
<Project>{79214dcd-3f36-4c50-97f4-11af21f60711}</Project>

1
Emgu.CV.Extern/CMakeLists.txt

@ -3122,6 +3122,7 @@ SET(LEPT_ROOT_DIR "${PROJECT_SOURCE_DIR}/tesseract/libtesseract/leptonica/lepton
IF(TESSERACT_FOUND)
ELSE()
SET(TESSERACT_INCLUDE_DIRS
"${TESSERACT_OCR_ROOT_DIR}/include"
"${TESSERACT_OCR_ROOT_DIR}/src/ccutil"
"${TESSERACT_OCR_ROOT_DIR}/src/api"
"${TESSERACT_OCR_ROOT_DIR}/src/ccmain"

11
Emgu.CV.Extern/tesseract/libtesseract/CMakeLists.txt

@ -5,6 +5,7 @@
#cmake_minimum_required(VERSION 2.8)
SET(TESSERACT_DIR "tesseract-ocr.git")
SET(TESSERACT_SRC_DIR "${TESSERACT_DIR}/src")
SET(TESSERACT_INCLUDE_DIR "${TESSERACT_DIR}/include")
SET(LEPTONICA_DIR "${LEPT_ROOT_DIR}/src")
# Get version with components from VERSION file.
@ -45,9 +46,9 @@ ADD_SUBDIRECTORY(leptonica)
MACRO(SET_TESSERACT_PROJECT_PROPERTY PROJ_NAME)
set_target_properties(${PROJECT_NAME} PROPERTIES
FOLDER "tesseract"
C_STANDARD 11
C_STANDARD 17
C_STANDARD_REQUIRED ON
CXX_STANDARD 11
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON)
IF(DEFINED EMGUCV_PLATFORM_TOOLSET)
@ -71,8 +72,8 @@ SET(PACKAGE_VERSION ${VERSION_PLAIN})
#MESSAGE(STATUS "tesseract version source file: ${PROJECT_SOURCE_DIR}/${TESSERACT_SRC_DIR}/api/tess_version.h.in")
#MESSAGE(STATUS "tesseract version output file: ${PROJECT_SOURCE_DIR}/${TESSERACT_SRC_DIR}/api/tess_version.h")
configure_file(
${PROJECT_SOURCE_DIR}/${TESSERACT_SRC_DIR}/api/tess_version.h.in
${PROJECT_SOURCE_DIR}/${TESSERACT_SRC_DIR}/api/tess_version.h @ONLY)
${PROJECT_SOURCE_DIR}/${TESSERACT_INCLUDE_DIR}/tesseract/version.h.in
${PROJECT_SOURCE_DIR}/${TESSERACT_INCLUDE_DIR}/tesseract/version.h @ONLY)
SET_SOURCE_FILES_PROPERTIES(${PROJECT_SOURCE_DIR}/${TESSERACT_SRC_DIR}/ccutil/tessdatamanager.cpp PROPERTIES COMPILE_DEFINITIONS PACKAGE_VERSION="${PACKAGE_VERSION}")
#add_definitions(-DPACKAGE_VERSION="${PACKAGE_VERSION}")
IF(MSVC)
@ -99,6 +100,8 @@ IF(ANDROID)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/glob/android")
ENDIF()
include_directories("${PROJECT_SOURCE_DIR}/${TESSERACT_INCLUDE_DIR}/")
source_group("Src" FILES ${tesseract_ccutil_srcs})
source_group("Include" FILES ${tesseract_ccutil_hdrs})

2
Emgu.CV.Extern/tesseract/libtesseract/tesseract-ocr.git

@ -1 +1 @@
Subproject commit 97fd7ce6a5e8854147dc9ca47d381985e6d1a594
Subproject commit 68c196a390e78749e26744e185abb3a474ee850c

122
Emgu.CV.Extern/tesseract/tesseract.cpp

@ -4,9 +4,10 @@
//
//----------------------------------------------------------------------------
#include "tesseract_c.h"
const char* TesseractGetVersion()
const char* cveTesseractGetVersion()
{
#ifdef HAVE_EMGUCV_TESSERACT
#ifdef _WIN32
@ -19,7 +20,7 @@ const char* TesseractGetVersion()
#endif
}
EmguTesseract* TessBaseAPICreate()
EmguTesseract* cveTessBaseAPICreate()
{
#ifdef HAVE_EMGUCV_TESSERACT
EmguTesseract* ocr = new EmguTesseract();
@ -29,7 +30,7 @@ EmguTesseract* TessBaseAPICreate()
#endif
}
int TessBaseAPIInit(EmguTesseract* ocr, cv::String* dataPath, cv::String* language, int mode)
int cveTessBaseAPIInit(EmguTesseract* ocr, cv::String* dataPath, cv::String* language, int mode)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->Init(dataPath->c_str(), language->c_str(), (tesseract::OcrEngineMode) mode);
@ -38,16 +39,17 @@ int TessBaseAPIInit(EmguTesseract* ocr, cv::String* dataPath, cv::String* langua
#endif
}
void TessBaseAPIRelease(EmguTesseract** ocr)
void cveTessBaseAPIRelease(EmguTesseract** ocr)
{
#ifdef HAVE_EMGUCV_TESSERACT
delete *ocr;
*ocr = 0;
#else
throw_no_tesseract();
#endif
}
int TessBaseAPIRecognize(EmguTesseract* ocr)
int cveTessBaseAPIRecognize(EmguTesseract* ocr)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->Recognize(NULL);
@ -56,7 +58,7 @@ int TessBaseAPIRecognize(EmguTesseract* ocr)
#endif
}
void TessBaseAPISetImage(EmguTesseract* ocr, cv::_InputArray* mat)
void cveTessBaseAPISetImage(EmguTesseract* ocr, cv::_InputArray* mat)
{
#ifdef HAVE_EMGUCV_TESSERACT
cv::Mat m = mat->getMat();
@ -66,7 +68,7 @@ void TessBaseAPISetImage(EmguTesseract* ocr, cv::_InputArray* mat)
#endif
}
void TessBaseAPISetImagePix(EmguTesseract* ocr, Pix* pix)
void cveTessBaseAPISetImagePix(EmguTesseract* ocr, Pix* pix)
{
#ifdef HAVE_EMGUCV_TESSERACT
ocr->SetImage(pix);
@ -75,7 +77,7 @@ void TessBaseAPISetImagePix(EmguTesseract* ocr, Pix* pix)
#endif
}
void TessBaseAPIGetUTF8Text(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetUTF8Text(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetUTF8Text();
@ -89,7 +91,7 @@ void TessBaseAPIGetUTF8Text(EmguTesseract* ocr, std::vector<unsigned char>* vect
#endif
}
void TessBaseAPIGetHOCRText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetHOCRText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetHOCRText(pageNumber);
@ -103,7 +105,7 @@ void TessBaseAPIGetHOCRText(EmguTesseract* ocr, int pageNumber, std::vector<unsi
#endif
}
void TessBaseAPIGetTSVText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetTSVText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetTSVText(pageNumber);
@ -116,7 +118,7 @@ void TessBaseAPIGetTSVText(EmguTesseract* ocr, int pageNumber, std::vector<unsig
throw_no_tesseract();
#endif
}
void TessBaseAPIGetBoxText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetBoxText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetBoxText(pageNumber);
@ -129,7 +131,7 @@ void TessBaseAPIGetBoxText(EmguTesseract* ocr, int pageNumber, std::vector<unsig
throw_no_tesseract();
#endif
}
void TessBaseAPIGetUNLVText(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetUNLVText(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetUNLVText();
@ -142,7 +144,7 @@ void TessBaseAPIGetUNLVText(EmguTesseract* ocr, std::vector<unsigned char>* vect
throw_no_tesseract();
#endif
}
void TessBaseAPIGetOsdText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
void cveTessBaseAPIGetOsdText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte)
{
#ifdef HAVE_EMGUCV_TESSERACT
char* result = ocr->GetOsdText(pageNumber);
@ -156,59 +158,43 @@ void TessBaseAPIGetOsdText(EmguTesseract* ocr, int pageNumber, std::vector<unsig
#endif
}
void TessBaseAPIExtractResult(EmguTesseract* ocr, std::vector<unsigned char>* charSeq, std::vector<TesseractResult>* resultSeq)
void cveTessBaseAPIExtractResult(EmguTesseract* ocr, std::vector<char>* charSeq, std::vector<TesseractResult>* resultSeq)
{
#ifdef HAVE_EMGUCV_TESSERACT
if (ocr == NULL)
return;
char* text;
int* lengths;
float* costs;
int* x0, *y0, *x1, *y1;
int n = ocr->TesseractExtractResult(&text,
&lengths,
&costs,
&x0,
&y0,
&x1,
&y1);
int totalTextLength = 0;
int height = ocr->GetImageHeight();
for (int i = 0; i < n; i++)
tesseract::ResultIterator* results = ocr->GetIterator();
if (!results)
return;
results->Begin();
int x0, y0, x1, y1;
do
{
totalTextLength += lengths[i];
TesseractResult tr;
tr.length = lengths[i];
tr.cost = costs[i];
tr.region.x = x0[i];
tr.region.y = height - y1[i];
tr.region.width = x1[i] - x0[i];
tr.region.height = y1[i] - y0[i];
tr.confident = results->Confidence(tesseract::RIL_WORD);
results->BoundingBox(tesseract::RIL_WORD, &x0, &y0, &x1, &y1);
tr.region.x = x0;
//tr.region.y = height - y1;
tr.region.y = y0;
tr.region.width = x1 - x0;
tr.region.height = y1 - y0;
char* t = results->GetUTF8Text(tesseract::RIL_WORD);
tr.length = strlen(t);
for (int i = 0; i < tr.length; i++)
charSeq->push_back(*(t + i));
delete[] t;
resultSeq->push_back(tr);
}
charSeq->resize(totalTextLength);
if (n > 0)
{
memcpy(&(*charSeq)[0], text, totalTextLength);
}
delete[] text;
delete[] lengths;
delete[] x0;
delete[] y0;
delete[] x1;
delete[] y1;
} while (results->Next(tesseract::RIL_WORD));
delete results;
#else
throw_no_tesseract();
#endif
}
bool TessBaseAPIProcessPage(
bool cveTessBaseAPIProcessPage(
EmguTesseract* ocr,
Pix* pix,
int pageIndex,
@ -224,7 +210,7 @@ bool TessBaseAPIProcessPage(
#endif
}
bool TessBaseAPISetVariable(EmguTesseract* ocr, const char* varName, const char* value)
bool cveTessBaseAPISetVariable(EmguTesseract* ocr, const char* varName, const char* value)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->SetVariable(varName, value);
@ -233,7 +219,7 @@ bool TessBaseAPISetVariable(EmguTesseract* ocr, const char* varName, const char*
#endif
}
void TessBaseAPISetPageSegMode(EmguTesseract* ocr, tesseract::PageSegMode mode)
void cveTessBaseAPISetPageSegMode(EmguTesseract* ocr, tesseract::PageSegMode mode)
{
#ifdef HAVE_EMGUCV_TESSERACT
ocr->SetPageSegMode(mode);
@ -242,7 +228,7 @@ void TessBaseAPISetPageSegMode(EmguTesseract* ocr, tesseract::PageSegMode mode)
#endif
}
tesseract::PageSegMode TessBaseAPIGetPageSegMode(EmguTesseract* ocr)
tesseract::PageSegMode cveTessBaseAPIGetPageSegMode(EmguTesseract* ocr)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->GetPageSegMode();
@ -251,7 +237,7 @@ tesseract::PageSegMode TessBaseAPIGetPageSegMode(EmguTesseract* ocr)
#endif
}
int TessBaseAPIGetOpenCLDevice(EmguTesseract* ocr, void **device)
int cveTessBaseAPIGetOpenCLDevice(EmguTesseract* ocr, void **device)
{
#ifdef HAVE_EMGUCV_TESSERACT
return static_cast<int>(ocr->getOpenCLDevice(device));
@ -260,7 +246,7 @@ int TessBaseAPIGetOpenCLDevice(EmguTesseract* ocr, void **device)
#endif
}
tesseract::PageIterator* TessBaseAPIAnalyseLayout(EmguTesseract* ocr, bool mergeSimilarWords)
tesseract::PageIterator* cveTessBaseAPIAnalyseLayout(EmguTesseract* ocr, bool mergeSimilarWords)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->AnalyseLayout(mergeSimilarWords);
@ -269,7 +255,7 @@ tesseract::PageIterator* TessBaseAPIAnalyseLayout(EmguTesseract* ocr, bool merge
#endif
}
void TessPageIteratorGetOrientation(tesseract::PageIterator* iterator, tesseract::Orientation* orientation, tesseract::WritingDirection* writingDirection, tesseract::TextlineOrder* order, float* deskewAngle)
void cveTessPageIteratorGetOrientation(tesseract::PageIterator* iterator, tesseract::Orientation* orientation, tesseract::WritingDirection* writingDirection, tesseract::TextlineOrder* order, float* deskewAngle)
{
#ifdef HAVE_EMGUCV_TESSERACT
iterator->Orientation(orientation, writingDirection, order, deskewAngle);
@ -278,7 +264,7 @@ void TessPageIteratorGetOrientation(tesseract::PageIterator* iterator, tesseract
#endif
}
bool TessPageIteratorGetBaseLine(
bool cveTessPageIteratorGetBaseLine(
tesseract::PageIterator* iterator,
tesseract::PageIteratorLevel level,
int* x1, int* y1, int* x2, int* y2)
@ -290,7 +276,7 @@ bool TessPageIteratorGetBaseLine(
#endif
}
void TessPageIteratorRelease(tesseract::PageIterator** iterator)
void cveTessPageIteratorRelease(tesseract::PageIterator** iterator)
{
#ifdef HAVE_EMGUCV_TESSERACT
delete *iterator;
@ -300,7 +286,7 @@ void TessPageIteratorRelease(tesseract::PageIterator** iterator)
#endif
}
int TessBaseAPIIsValidWord(EmguTesseract* ocr, char* word)
int cveTessBaseAPIIsValidWord(EmguTesseract* ocr, char* word)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->IsValidWord(word);
@ -309,7 +295,7 @@ int TessBaseAPIIsValidWord(EmguTesseract* ocr, char* word)
#endif
}
int TessBaseAPIGetOem(EmguTesseract* ocr)
int cveTessBaseAPIGetOem(EmguTesseract* ocr)
{
#ifdef HAVE_EMGUCV_TESSERACT
return ocr->oem();
@ -318,7 +304,7 @@ int TessBaseAPIGetOem(EmguTesseract* ocr)
#endif
}
tesseract::TessPDFRenderer* TessPDFRendererCreate(cv::String* outputbase, cv::String* datadir, bool textonly, tesseract::TessResultRenderer** resultRenderer)
tesseract::TessPDFRenderer* cveTessPDFRendererCreate(cv::String* outputbase, cv::String* datadir, bool textonly, tesseract::TessResultRenderer** resultRenderer)
{
#ifdef HAVE_EMGUCV_TESSERACT
tesseract::TessPDFRenderer* renderer = new tesseract::TessPDFRenderer(outputbase->c_str(), datadir->c_str(), textonly);
@ -328,7 +314,7 @@ tesseract::TessPDFRenderer* TessPDFRendererCreate(cv::String* outputbase, cv::St
throw_no_tesseract();
#endif
}
void TessPDFRendererRelease(tesseract::TessPDFRenderer** renderer)
void cveTessPDFRendererRelease(tesseract::TessPDFRenderer** renderer)
{
#ifdef HAVE_EMGUCV_TESSERACT
delete *renderer;
@ -338,7 +324,7 @@ void TessPDFRendererRelease(tesseract::TessPDFRenderer** renderer)
#endif
}
Pix* leptCreatePixFromMat(cv::Mat* m)
Pix* cveLeptCreatePixFromMat(cv::Mat* m)
{
#ifdef HAVE_EMGUCV_TESSERACT
const unsigned char* imagedata = m->data;
@ -404,7 +390,7 @@ Pix* leptCreatePixFromMat(cv::Mat* m)
#endif
}
void leptPixDestroy(Pix** pix)
void cveLeptPixDestroy(Pix** pix)
{
#ifdef HAVE_EMGUCV_TESSERACT
pixDestroy(pix);
@ -414,7 +400,7 @@ void leptPixDestroy(Pix** pix)
#endif
}
char* stdSetlocale(int category, char* locale)
char* cveStdSetlocale(int category, char* locale)
{
#ifdef HAVE_EMGUCV_TESSERACT
return std::setlocale(category, locale);

87
Emgu.CV.Extern/tesseract/tesseract_c.h

@ -20,11 +20,18 @@ typedef unsigned __int64 UINT64;
#if HAVE_EMGUCV_TESSERACT
#include "baseapi.h"
#include "allheaders.h"
#include "renderer.h"
#include "tesseract/capi.h"
#include <clocale>
#include "image.h"
#include "thresholder.h"
#include "allheaders.h"
#define EmguTesseract tesseract::TessBaseAPI
/*
class EmguTesseract: public tesseract::TessBaseAPI
{
public:
@ -41,17 +48,7 @@ public:
return imageHeight;
}
int TesseractExtractResult(char** text,
int** lengths,
float** costs,
int** x0,
int** y0,
int** x1,
int** y1)
{
return tesseract::TessBaseAPI::TesseractExtractResult(text, lengths, costs, x0, y0, x1, y1, page_res_);
}
};
};*/
#else
@ -79,7 +76,7 @@ static inline CV_NORETURN void throw_no_tesseract() { CV_Error(cv::Error::StsBad
struct TesseractResult
{
int length;
float cost;
float confident;
CvRect region;
};
@ -92,31 +89,31 @@ namespace cv {
}
}
CVAPI(const char*) TesseractGetVersion();
CVAPI(const char*) cveTesseractGetVersion();
CVAPI(EmguTesseract*) TessBaseAPICreate();
CVAPI(EmguTesseract*) cveTessBaseAPICreate();
CVAPI(int) TessBaseAPIInit(EmguTesseract* ocr, cv::String* dataPath, cv::String* language, int mode);
CVAPI(int) cveTessBaseAPIInit(EmguTesseract* ocr, cv::String* dataPath, cv::String* language, int mode);
CVAPI(void) TessBaseAPIRelease(EmguTesseract** ocr);
CVAPI(void) cveTessBaseAPIRelease(EmguTesseract** ocr);
CVAPI(int) TessBaseAPIRecognize(EmguTesseract* ocr);
CVAPI(int) cveTessBaseAPIRecognize(EmguTesseract* ocr);
CVAPI(void) TessBaseAPISetImage(EmguTesseract* ocr, cv::_InputArray* mat);
CVAPI(void) TessBaseAPISetImagePix(EmguTesseract* ocr, Pix* pix);
CVAPI(void) cveTessBaseAPISetImage(EmguTesseract* ocr, cv::_InputArray* mat);
CVAPI(void) cveTessBaseAPISetImagePix(EmguTesseract* ocr, Pix* pix);
CVAPI(void) TessBaseAPIGetUTF8Text(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetUTF8Text(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIGetHOCRText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetHOCRText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIGetTSVText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIGetBoxText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIGetUNLVText(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIGetOsdText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetTSVText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetBoxText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetUNLVText(EmguTesseract* ocr, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) cveTessBaseAPIGetOsdText(EmguTesseract* ocr, int pageNumber, std::vector<unsigned char>* vectorOfByte);
CVAPI(void) TessBaseAPIExtractResult(EmguTesseract* ocr, std::vector<unsigned char>* charSeq, std::vector<TesseractResult>* resultSeq);
CVAPI(void) cveTessBaseAPIExtractResult(EmguTesseract* ocr, std::vector<char>* charSeq, std::vector<TesseractResult>* resultSeq);
CVAPI(bool) TessBaseAPIProcessPage(
CVAPI(bool) cveTessBaseAPIProcessPage(
EmguTesseract* ocr,
Pix* pix,
int pageIndex,
@ -125,35 +122,35 @@ CVAPI(bool) TessBaseAPIProcessPage(
int timeoutMillisec,
tesseract::TessResultRenderer* renderer);
CVAPI(bool) TessBaseAPISetVariable(EmguTesseract* ocr, const char* varName, const char* value);
CVAPI(bool) cveTessBaseAPISetVariable(EmguTesseract* ocr, const char* varName, const char* value);
CVAPI(void) TessBaseAPISetPageSegMode(EmguTesseract* ocr, tesseract::PageSegMode mode);
CVAPI(void) cveTessBaseAPISetPageSegMode(EmguTesseract* ocr, tesseract::PageSegMode mode);
CVAPI(tesseract::PageSegMode) TessBaseAPIGetPageSegMode(EmguTesseract* ocr);
CVAPI(tesseract::PageSegMode) cveTessBaseAPIGetPageSegMode(EmguTesseract* ocr);
CVAPI(int) TessBaseAPIGetOpenCLDevice(EmguTesseract* ocr, void **device);
CVAPI(int) cveTessBaseAPIGetOpenCLDevice(EmguTesseract* ocr, void **device);
CVAPI(tesseract::PageIterator*) TessBaseAPIAnalyseLayout(EmguTesseract* ocr, bool mergeSimilarWords);
CVAPI(tesseract::PageIterator*) cveTessBaseAPIAnalyseLayout(EmguTesseract* ocr, bool mergeSimilarWords);
CVAPI(void) TessPageIteratorGetOrientation(tesseract::PageIterator* iterator, tesseract::Orientation* orientation, tesseract::WritingDirection* writingDirection, tesseract::TextlineOrder* order, float* deskewAngle);
CVAPI(void) cveTessPageIteratorGetOrientation(tesseract::PageIterator* iterator, tesseract::Orientation* orientation, tesseract::WritingDirection* writingDirection, tesseract::TextlineOrder* order, float* deskewAngle);
CVAPI(void) TessPageIteratorRelease(tesseract::PageIterator** iterator);
CVAPI(void) cveTessPageIteratorRelease(tesseract::PageIterator** iterator);
CVAPI(bool) TessPageIteratorGetBaseLine(
CVAPI(bool) cveTessPageIteratorGetBaseLine(
tesseract::PageIterator* iterator,
tesseract::PageIteratorLevel level,
int* x1, int* y1, int* x2, int* y2);
CVAPI(int) TessBaseAPIIsValidWord(EmguTesseract* ocr, char* word);
CVAPI(int) cveTessBaseAPIIsValidWord(EmguTesseract* ocr, char* word);
CVAPI(int) TessBaseAPIGetOem(EmguTesseract* ocr);
CVAPI(int) cveTessBaseAPIGetOem(EmguTesseract* ocr);
CVAPI(tesseract::TessPDFRenderer*) TessPDFRendererCreate(cv::String* outputbase, cv::String* datadir, bool textonly, tesseract::TessResultRenderer** resultRenderer);
CVAPI(void) TessPDFRendererRelease(tesseract::TessPDFRenderer** renderer);
CVAPI(tesseract::TessPDFRenderer*) cveTessPDFRendererCreate(cv::String* outputbase, cv::String* datadir, bool textonly, tesseract::TessResultRenderer** resultRenderer);
CVAPI(void) cveTessPDFRendererRelease(tesseract::TessPDFRenderer** renderer);
CVAPI(Pix*) leptCreatePixFromMat(cv::Mat* m);
CVAPI(void) leptPixDestroy(Pix** pix);
CVAPI(Pix*) cveLeptCreatePixFromMat(cv::Mat* m);
CVAPI(void) cveLeptPixDestroy(Pix** pix);
CVAPI(char*) stdSetlocale(int category, char* locale);
CVAPI(char*) cveStdSetlocale(int category, char* locale);
#endif

8
Emgu.CV.OCR/LocaleGuard.cs

@ -54,7 +54,7 @@ namespace Emgu.CV.OCR
private LocaleCategory _category;
private String _locale;
private String _oldLocale;
/// <summary>
/// Create a locale guard to set the locale to specific value. Will revert locale back to previous value when the object is disposed.
/// </summary>
@ -93,13 +93,13 @@ namespace Emgu.CV.OCR
IntPtr oldLocalePtr;
if (locale == null)
{
oldLocalePtr = stdSetlocale(category, IntPtr.Zero);
oldLocalePtr = cveStdSetlocale(category, IntPtr.Zero);
return oldLocalePtr == IntPtr.Zero ? null : Marshal.PtrToStringAnsi(oldLocalePtr);
}
IntPtr localePtr = Marshal.StringToHGlobalAnsi(locale);
try
{
oldLocalePtr = stdSetlocale(category, localePtr);
oldLocalePtr = cveStdSetlocale(category, localePtr);
}
finally
{
@ -109,7 +109,7 @@ namespace Emgu.CV.OCR
}
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
private static extern IntPtr stdSetlocale(
private static extern IntPtr cveStdSetlocale(
LocaleGuard.LocaleCategory category,
IntPtr locale);
}

50
Emgu.CV.OCR/OcrInvoke.cs

@ -28,50 +28,50 @@ namespace Emgu.CV.OCR
#region Tesseract
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr TessBaseAPICreate();
internal static extern IntPtr cveTessBaseAPICreate();
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern int TessBaseAPIInit(
internal static extern int cveTessBaseAPIInit(
IntPtr ocr,
IntPtr dataPath,
IntPtr language,
OcrEngineMode mode);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIRelease(ref IntPtr ocr);
internal static extern void cveTessBaseAPIRelease(ref IntPtr ocr);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPISetImage(IntPtr ocr, IntPtr image);
internal static extern void cveTessBaseAPISetImage(IntPtr ocr, IntPtr image);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPISetImagePix(IntPtr ocr, IntPtr pix);
internal static extern void cveTessBaseAPISetImagePix(IntPtr ocr, IntPtr pix);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetUTF8Text(
internal static extern void cveTessBaseAPIGetUTF8Text(
IntPtr ocr,
IntPtr text);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetHOCRText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
internal static extern void cveTessBaseAPIGetHOCRText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetTSVText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
internal static extern void cveTessBaseAPIGetTSVText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetBoxText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
internal static extern void cveTessBaseAPIGetBoxText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetUNLVText(IntPtr ocr, IntPtr vectorOfByte);
internal static extern void cveTessBaseAPIGetUNLVText(IntPtr ocr, IntPtr vectorOfByte);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIGetOsdText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
internal static extern void cveTessBaseAPIGetOsdText(IntPtr ocr, int pageNumber, IntPtr vectorOfByte);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPIExtractResult(IntPtr ocr, IntPtr charSeq, IntPtr resultSeq);
internal static extern void cveTessBaseAPIExtractResult(IntPtr ocr, IntPtr charSeq, IntPtr resultSeq);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
[return: MarshalAs(CvInvoke.BoolMarshalType)]
internal static extern bool TessBaseAPIProcessPage(
internal static extern bool cveTessBaseAPIProcessPage(
IntPtr ocr,
IntPtr pix,
int pageIndex,
@ -82,7 +82,7 @@ namespace Emgu.CV.OCR
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
[return: MarshalAs(CvInvoke.BoolMarshalType)]
internal static extern bool TessBaseAPISetVariable(
internal static extern bool cveTessBaseAPISetVariable(
IntPtr ocr,
[MarshalAs(CvInvoke.StringMarshalType)]
String varName,
@ -90,49 +90,49 @@ namespace Emgu.CV.OCR
String value);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr TesseractGetVersion();
internal static extern IntPtr cveTesseractGetVersion();
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessBaseAPISetPageSegMode(IntPtr ocr, PageSegMode mode);
internal static extern void cveTessBaseAPISetPageSegMode(IntPtr ocr, PageSegMode mode);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern PageSegMode TessBaseAPIGetPageSegMode(IntPtr ocr);
internal static extern PageSegMode cveTessBaseAPIGetPageSegMode(IntPtr ocr);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern int TessBaseAPIGetOpenCLDevice(IntPtr ocr, ref IntPtr device);
internal static extern int cveTessBaseAPIGetOpenCLDevice(IntPtr ocr, ref IntPtr device);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr TessBaseAPIAnalyseLayout(
internal static extern IntPtr cveTessBaseAPIAnalyseLayout(
IntPtr ocr,
[MarshalAs(CvInvoke.BoolMarshalType)]
bool mergeSimilarWords);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern int TessBaseAPIIsValidWord(
internal static extern int cveTessBaseAPIIsValidWord(
IntPtr ocr,
[MarshalAs(CvInvoke.StringMarshalType)]
String word);
#endregion
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessPageIteratorRelease(ref IntPtr iterator);
internal static extern void cveTessPageIteratorRelease(ref IntPtr iterator);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessPageIteratorGetOrientation(IntPtr iterator, ref PageOrientation orientation, ref WritingDirection writingDirection, ref TextlineOrder order, ref float deskewAngle);
internal static extern void cveTessPageIteratorGetOrientation(IntPtr iterator, ref PageOrientation orientation, ref WritingDirection writingDirection, ref TextlineOrder order, ref float deskewAngle);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
[return: MarshalAs(CvInvoke.BoolMarshalType)]
internal static extern bool TessPageIteratorGetBaseLine(
internal static extern bool cveTessPageIteratorGetBaseLine(
IntPtr iterator,
PageIteratorLevel level,
ref int x1, ref int y1, ref int x2, ref int y2);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern OcrEngineMode TessBaseAPIGetOem(IntPtr ocr);
internal static extern OcrEngineMode cveTessBaseAPIGetOem(IntPtr ocr);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern int TessBaseAPIRecognize(IntPtr ocr);
internal static extern int cveTessBaseAPIRecognize(IntPtr ocr);
}
}

321
Emgu.CV.OCR/PageIterator.cs

@ -16,175 +16,176 @@ using System.Diagnostics;
namespace Emgu.CV.OCR
{
/// <summary>
/// The tesseract page iterator
/// </summary>
public class PageIterator : UnmanagedObject
{
/// <summary>
/// The tesseract page iterator
/// </summary>
public class PageIterator : UnmanagedObject
{
internal PageIterator(IntPtr ptr)
{
_ptr = ptr;
}
internal PageIterator(IntPtr ptr)
{
_ptr = ptr;
}
/// <summary>
/// Returns orientation for the block the iterator points to.
/// </summary>
public Orientation Orientation
{
get
{
Orientation o = new Orientation();
PageOrientation po = PageOrientation.Up;
WritingDirection wd = WritingDirection.LeftToRight;
TextlineOrder tp = TextlineOrder.TopToBottom;
float deskewAngle = 0;
OcrInvoke.TessPageIteratorGetOrientation(_ptr, ref po, ref wd, ref tp, ref deskewAngle);
o.PageOrientation = po;
o.WritingDirection = wd;
o.TextlineOrder = tp;
o.DeskewAngle = deskewAngle;
return o;
}
}
/// <summary>
/// Returns orientation for the block the iterator points to.
/// </summary>
public Orientation Orientation
{
get
{
Orientation o = new Orientation();
PageOrientation po = PageOrientation.Up;
WritingDirection wd = WritingDirection.LeftToRight;
TextlineOrder tp = TextlineOrder.TopToBottom;
float deskewAngle = 0;
OcrInvoke.cveTessPageIteratorGetOrientation(_ptr, ref po, ref wd, ref tp, ref deskewAngle);
o.PageOrientation = po;
o.WritingDirection = wd;
o.TextlineOrder = tp;
o.DeskewAngle = deskewAngle;
return o;
}
}
/// <summary>
/// Returns the baseline of the current object at the given level. The baseline is the line that passes through (x1, y1) and (x2, y2). WARNING: with vertical text, baselines may be vertical! Returns null if there is no baseline at the current position.
/// </summary>
/// <param name="level">Page iterator level</param>
/// <returns>The baseline of the current object at the given level</returns>
public LineSegment2D? GetBaseLine(PageIteratorLevel level)
{
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
/// <summary>
/// Returns the baseline of the current object at the given level. The baseline is the line that passes through (x1, y1) and (x2, y2). WARNING: with vertical text, baselines may be vertical! Returns null if there is no baseline at the current position.
/// </summary>
/// <param name="level">Page iterator level</param>
/// <returns>The baseline of the current object at the given level</returns>
public LineSegment2D? GetBaseLine(PageIteratorLevel level)
{
int x1 = 0;
int y1 = 0;
int x2 = 0;
int y2 = 0;
bool found = OcrInvoke.TessPageIteratorGetBaseLine(_ptr, level, ref x1, ref y1, ref x2, ref y2);
if (!found)
return null;
else
return new LineSegment2D(new Point(x1, y1), new Point(x2, y2) );
}
bool found = OcrInvoke.cveTessPageIteratorGetBaseLine(_ptr, level, ref x1, ref y1, ref x2, ref y2);
if (!found)
return null;
else
return new LineSegment2D(new Point(x1, y1), new Point(x2, y2));
}
/// <summary>
/// Release the page iterator
/// </summary>
protected override void DisposeObject()
{
OcrInvoke.TessPageIteratorRelease(ref _ptr);
}
}
/// <summary>
/// Release the page iterator
/// </summary>
protected override void DisposeObject()
{
if (IntPtr.Zero != _ptr)
OcrInvoke.cveTessPageIteratorRelease(ref _ptr);
}
}
/// <summary>
/// The orientation
/// </summary>
public struct Orientation
{
/// <summary>
/// Page orientation
/// </summary>
public PageOrientation PageOrientation;
/// <summary>
/// Writing direction
/// </summary>
public WritingDirection WritingDirection;
/// <summary>
/// Textline order
/// </summary>
public TextlineOrder TextlineOrder;
/// <summary>
/// The orientation
/// </summary>
public struct Orientation
{
/// <summary>
/// Page orientation
/// </summary>
public PageOrientation PageOrientation;
/// <summary>
/// Writing direction
/// </summary>
public WritingDirection WritingDirection;
/// <summary>
/// Textline order
/// </summary>
public TextlineOrder TextlineOrder;
/// <summary>
/// after rotating the block so the text orientation is upright, how many radians does one have to rotate the block anti-clockwise for it to be level? -Pi/4 &lt;= deskew_angle &lt;= Pi/4
/// </summary>
public float DeskewAngle;
}
/// <summary>
/// after rotating the block so the text orientation is upright, how many radians does one have to rotate the block anti-clockwise for it to be level? -Pi/4 &lt;= deskew_angle &lt;= Pi/4
/// </summary>
public float DeskewAngle;
}
/// <summary>
/// Page orientation
/// </summary>
public enum PageOrientation
{
/// <summary>
/// Up
/// </summary>
Up = 0,
/// <summary>
/// Right
/// </summary>
Right = 1,
/// <summary>
/// Down
/// </summary>
Down = 2,
/// <summary>
/// Left
/// </summary>
Left = 3,
}
/// <summary>
/// Page orientation
/// </summary>
public enum PageOrientation
{
/// <summary>
/// Up
/// </summary>
Up = 0,
/// <summary>
/// Right
/// </summary>
Right = 1,
/// <summary>
/// Down
/// </summary>
Down = 2,
/// <summary>
/// Left
/// </summary>
Left = 3,
}
/// <summary>
/// Writing direction
/// </summary>
public enum WritingDirection
{
/// <summary>
/// Left to right
/// </summary>
LeftToRight = 0,
/// <summary>
/// Right to left
/// </summary>
RightToLeft = 1,
/// <summary>
/// Top to bottom
/// </summary>
TopToBottom = 2,
}
/// <summary>
/// Writing direction
/// </summary>
public enum WritingDirection
{
/// <summary>
/// Left to right
/// </summary>
LeftToRight = 0,
/// <summary>
/// Right to left
/// </summary>
RightToLeft = 1,
/// <summary>
/// Top to bottom
/// </summary>
TopToBottom = 2,
}
/// <summary>
/// Textline order
/// </summary>
public enum TextlineOrder
{
/// <summary>
/// Left to right
/// </summary>
LeftToRight = 0,
/// <summary>
/// Right to left
/// </summary>
RightToLeft = 1,
/// <summary>
/// Top to bottom
/// </summary>
TopToBottom = 2,
}
/// <summary>
/// Textline order
/// </summary>
public enum TextlineOrder
{
/// <summary>
/// Left to right
/// </summary>
LeftToRight = 0,
/// <summary>
/// Right to left
/// </summary>
RightToLeft = 1,
/// <summary>
/// Top to bottom
/// </summary>
TopToBottom = 2,
}
/// <summary>
/// Page iterator level
/// </summary>
public enum PageIteratorLevel
{
/// <summary>
/// Block of text/image/separator line.
/// </summary>
Block,
/// <summary>
/// Paragraph within a block.
/// </summary>
Para,
/// <summary>
/// Line within a paragraph.
/// </summary>
Textline,
/// <summary>
/// Word within a textline.
/// </summary>
Word,
/// <summary>
/// Symbol/character within a word.
/// </summary>
Symbol
}
/// <summary>
/// Page iterator level
/// </summary>
public enum PageIteratorLevel
{
/// <summary>
/// Block of text/image/separator line.
/// </summary>
Block,
/// <summary>
/// Paragraph within a block.
/// </summary>
Para,
/// <summary>
/// Line within a paragraph.
/// </summary>
Textline,
/// <summary>
/// Word within a textline.
/// </summary>
Word,
/// <summary>
/// Symbol/character within a word.
/// </summary>
Symbol
}
}

8
Emgu.CV.OCR/Pix.cs

@ -27,7 +27,7 @@ namespace Emgu.CV.OCR
/// <param name="mat">The Mat to create the Pix object from</param>
public Pix(Mat mat)
{
_ptr = OcrInvoke.leptCreatePixFromMat(mat);
_ptr = OcrInvoke.cveLeptCreatePixFromMat(mat);
}
/// <summary>
@ -37,7 +37,7 @@ namespace Emgu.CV.OCR
{
if (_ptr != IntPtr.Zero)
{
OcrInvoke.leptPixDestroy(ref _ptr);
OcrInvoke.cveLeptPixDestroy(ref _ptr);
}
}
}
@ -45,9 +45,9 @@ namespace Emgu.CV.OCR
public static partial class OcrInvoke
{
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr leptCreatePixFromMat(IntPtr m);
internal static extern IntPtr cveLeptCreatePixFromMat(IntPtr m);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void leptPixDestroy(ref IntPtr pix);
internal static extern void cveLeptPixDestroy(ref IntPtr pix);
}
}

14
Emgu.CV.OCR/TessResultRenderer.cs

@ -35,7 +35,7 @@ namespace Emgu.CV.OCR
using (CvString csOutputBase = new CvString(outputBase))
using (CvString csDataDir = new CvString(dataDir))
{
_ptr = OcrInvoke.TessPDFRendererCreate(csOutputBase, csDataDir, textOnly, ref _tessResultRendererPtr);
_ptr = OcrInvoke.cveTessPDFRendererCreate(csOutputBase, csDataDir, textOnly, ref _tessResultRendererPtr);
}
}
@ -45,7 +45,7 @@ namespace Emgu.CV.OCR
protected override void DisposeObject()
{
if (IntPtr.Zero != _ptr)
OcrInvoke.TessPDFRendererRelease(ref _ptr);
OcrInvoke.cveTessPDFRendererRelease(ref _ptr);
_tessResultRendererPtr = IntPtr.Zero;
}
@ -64,14 +64,14 @@ namespace Emgu.CV.OCR
public static partial class OcrInvoke
{
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern IntPtr TessPDFRendererCreate(
IntPtr outputbase,
IntPtr datadir,
internal static extern IntPtr cveTessPDFRendererCreate(
IntPtr outputbase,
IntPtr datadir,
[MarshalAs(CvInvoke.BoolMarshalType)]
bool textonly,
bool textonly,
ref IntPtr resultRenderer);
[DllImport(CvInvoke.ExternLibrary, CallingConvention = CvInvoke.CvCallingConvention)]
internal static extern void TessPDFRendererRelease(ref IntPtr renderer);
internal static extern void cveTessPDFRendererRelease(ref IntPtr renderer);
}
}

48
Emgu.CV.OCR/Tesseract.cs

@ -31,7 +31,7 @@ namespace Emgu.CV.OCR
{
get
{
IntPtr ptr = OcrInvoke.TesseractGetVersion();
IntPtr ptr = OcrInvoke.cveTesseractGetVersion();
if (ptr == IntPtr.Zero)
return String.Empty;
else
@ -76,7 +76,7 @@ namespace Emgu.CV.OCR
lg = new Emgu.CV.OCR.LocaleGuard(Emgu.CV.OCR.LocaleGuard.LocaleCategory.All, "C");
try
{
_ptr = OcrInvoke.TessBaseAPICreate();
_ptr = OcrInvoke.cveTessBaseAPICreate();
}
finally
{
@ -96,7 +96,7 @@ namespace Emgu.CV.OCR
/// <returns>0 if no device found. sizeof(cl_device_id) if device is found.</returns>
public int GetOpenCLDevice(ref IntPtr device)
{
return OcrInvoke.TessBaseAPIGetOpenCLDevice(_ptr, ref device);
return OcrInvoke.cveTessBaseAPIGetOpenCLDevice(_ptr, ref device);
}
/*
@ -191,7 +191,7 @@ namespace Emgu.CV.OCR
/// <returns>0 if the word is invalid, non-zero if valid</returns>
public int IsValidWord(String word)
{
return OcrInvoke.TessBaseAPIIsValidWord(_ptr, word);
return OcrInvoke.cveTessBaseAPIIsValidWord(_ptr, word);
}
/// <summary>
@ -202,8 +202,8 @@ namespace Emgu.CV.OCR
/// </value>
public PageSegMode PageSegMode
{
get { return OcrInvoke.TessBaseAPIGetPageSegMode(_ptr); }
set { OcrInvoke.TessBaseAPISetPageSegMode(_ptr, value); }
get { return OcrInvoke.cveTessBaseAPIGetPageSegMode(_ptr); }
set { OcrInvoke.cveTessBaseAPISetPageSegMode(_ptr, value); }
}
/// <summary>
@ -280,7 +280,7 @@ namespace Emgu.CV.OCR
using (CvString csDataPath = new CvString(dataPath))
using (CvString csLanguage = new CvString(language))
{
int initResult = OcrInvoke.TessBaseAPIInit(_ptr, csDataPath, csLanguage, mode);
int initResult = OcrInvoke.cveTessBaseAPIInit(_ptr, csDataPath, csLanguage, mode);
if (initResult != 0)
{
if (dataPath.Equals(String.Empty))
@ -298,7 +298,7 @@ namespace Emgu.CV.OCR
protected override void DisposeObject()
{
if (_ptr != IntPtr.Zero)
OcrInvoke.TessBaseAPIRelease(ref _ptr);
OcrInvoke.cveTessBaseAPIRelease(ref _ptr);
}
/// <summary>
@ -308,7 +308,7 @@ namespace Emgu.CV.OCR
public void SetImage(IInputArray image)
{
using (InputArray iaImage = image.GetInputArray())
OcrInvoke.TessBaseAPISetImage(_ptr, iaImage);
OcrInvoke.cveTessBaseAPISetImage(_ptr, iaImage);
}
/// <summary>
@ -317,7 +317,7 @@ namespace Emgu.CV.OCR
/// <param name="image">The image where detection took place</param>
public void SetImage(Pix image)
{
OcrInvoke.TessBaseAPISetImagePix(_ptr, image);
OcrInvoke.cveTessBaseAPISetImagePix(_ptr, image);
}
/// <summary>
@ -327,7 +327,7 @@ namespace Emgu.CV.OCR
/// <returns>Returns 0 on success.</returns>
public int Recognize()
{
return OcrInvoke.TessBaseAPIRecognize(_ptr);
return OcrInvoke.cveTessBaseAPIRecognize(_ptr);
}
/// <summary>
@ -337,7 +337,7 @@ namespace Emgu.CV.OCR
/// <param name="value">The value to be set</param>
public void SetVariable(String variableName, String value)
{
if (!OcrInvoke.TessBaseAPISetVariable(_ptr, variableName, value))
if (!OcrInvoke.cveTessBaseAPISetVariable(_ptr, variableName, value))
{
throw new System.ArgumentException(String.Format("Unable to set {0} to {1}", variableName, value));
}
@ -351,7 +351,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetUTF8Text(_ptr, bytes);
OcrInvoke.cveTessBaseAPIGetUTF8Text(_ptr, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -365,7 +365,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetTSVText(_ptr, pageNumber, bytes);
OcrInvoke.cveTessBaseAPIGetTSVText(_ptr, pageNumber, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -379,7 +379,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetBoxText(_ptr, pageNumber, bytes);
OcrInvoke.cveTessBaseAPIGetBoxText(_ptr, pageNumber, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -393,7 +393,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetUNLVText(_ptr, bytes);
OcrInvoke.cveTessBaseAPIGetUNLVText(_ptr, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -407,7 +407,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetOsdText(_ptr, pageNumber, bytes);
OcrInvoke.cveTessBaseAPIGetOsdText(_ptr, pageNumber, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -421,7 +421,7 @@ namespace Emgu.CV.OCR
{
using (Util.VectorOfByte bytes = new Util.VectorOfByte())
{
OcrInvoke.TessBaseAPIGetHOCRText(_ptr, pageNumber, bytes);
OcrInvoke.cveTessBaseAPIGetHOCRText(_ptr, pageNumber, bytes);
return UtfByteVectorToString(bytes);
}
}
@ -441,7 +441,7 @@ namespace Emgu.CV.OCR
using (VectorOfByte textSeq = new VectorOfByte())
using (VectorOfTesseractResult results = new VectorOfTesseractResult())
{
OcrInvoke.TessBaseAPIExtractResult(_ptr, textSeq, results);
OcrInvoke.cveTessBaseAPIExtractResult(_ptr, textSeq, results);
byte[] bytes = textSeq.ToArray();
TesseractResult[] trs = results.ToArray();
@ -454,8 +454,8 @@ namespace Emgu.CV.OCR
res[i].Text = _utf8.GetString(bytes, idx, tr.Length).Replace("\n", Environment.NewLine);
idx += tr.Length;
res[i].Cost = tr.Cost;
if (tr.Cost == 0)
res[i].Cost = tr.Confident;
if (tr.Confident == 0)
res[i].Region = Rectangle.Empty;
else
res[i].Region = tr.Region;
@ -504,7 +504,7 @@ namespace Emgu.CV.OCR
using (CvString csFileName = new CvString(filename))
using (CvString csRetryConfig = new CvString(retryConfig))
{
return OcrInvoke.TessBaseAPIProcessPage(
return OcrInvoke.cveTessBaseAPIProcessPage(
_ptr,
pix,
pageIndex,
@ -522,7 +522,7 @@ namespace Emgu.CV.OCR
/// <returns>Page iterator</returns>
public PageIterator AnalyseLayout(bool mergeSimilarWords = false)
{
return new PageIterator(OcrInvoke.TessBaseAPIAnalyseLayout(_ptr, mergeSimilarWords));
return new PageIterator(OcrInvoke.cveTessBaseAPIAnalyseLayout(_ptr, mergeSimilarWords));
}
/// <summary>
@ -530,7 +530,7 @@ namespace Emgu.CV.OCR
/// </summary>
public OcrEngineMode Oem
{
get { return OcrInvoke.TessBaseAPIGetOem(_ptr); }
get { return OcrInvoke.cveTessBaseAPIGetOem(_ptr); }
}
}
}

4
Emgu.CV.OCR/TesseractResult.cs

@ -27,9 +27,9 @@ namespace Emgu.CV.OCR
/// </summary>
public int Length;
/// <summary>
/// The cost
/// The confident
/// </summary>
public float Cost;
public float Confident;
/// <summary>
/// The region
/// </summary>

2
Emgu.CV.Platform/Android/Resources/Resource.Designer.cs

@ -14,7 +14,7 @@ namespace Emgu.CV
{
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "12.1.0.11")]
public partial class Resource
{

Loading…
Cancel
Save