ImageEn, unit iexHelperFunctions

TIEBitmapHelper.OCR_GetOrientation

TIEBitmapHelper.OCR_GetOrientation


Declaration

function OCR_GetOrientation(Language: TIEOCRLanguages = OCR_English_Language; const LanguagePath: string = ''; Engine: TIEVisionOCREngine = ievOCRDefault): Double; overload;
function OCR_GetOrientation(const LanguageCode: string; const LanguagePath: string = ''; Engine: TIEVisionOCREngine = ievOCRDefault): Double; overload;


Description

A shortcut method that creates a TIEVisionOCR object and calls getTextAngle and getOrientation to accurately calculate the text angle of a document.
The language can be specified by type or as a language code string (e.g. 'eng').
You can call Rotate with the -1 * result to correctly rotate the image.



Note:
You must add the iexHelperFunctions unit to your uses clause
LanguagePath and Engine cannot be changed after first use (without restarting the application)
You wil require a TrainedData file for the specified language (e.g. "eng.TrainedData") and the orientation file "osd.TrainedData". An exception is raised if either is not found
OCR requires IEVision. You will need to register it before calling the method


Method Behaviour

The following call:

deskewAngle := ImageEnView1.IEBitmap.OCR_GetOrientation();
if deskewAngle <> 0 then
  ImageEnView1.Proc.Rotate( -deskewAngle, ierFast, clWhite );

Is the same as calling:

// create OCR object
mOCR := IEVisionLib.createOCR( PAnsiChar( AnsiString( '' )), PAnsiChar( AnsiString( IEOCRLanguageList[langCode].Code )), ievOCRDefault );

// set page layout
mOCR.setSegmentationMode( ievOCRAuto_OSD );

// Calculate Orientation and text angle
mOCR.getTextAngle( ImageEnView1.IEBitmap.GetIEVisionImage() );
mOCR.getOrientation( orientation, writingDirection, textlineOrder, deskewAngle );

// Calculate optimal rotation angle
deskewAngle := -deskewAngle * 180 / PI;
if orientation = ievOCROrientPAGE_RIGHT then
  deskewAngle := deskewAngle - 90
else
if orientation = ievOCROrientPAGE_DOWN then
  deskewAngle := deskewAngle - 180
else
if orientation = ievOCROrientPAGE_LEFT then
  deskewAngle := deskewAngle - 270;

if deskewAngle <> 0 then
  ImageEnView1.Proc.Rotate( -deskewAngle, ierFast, clWhite );


Demo

Demo  Demos\ImageEditing\EveryMethod\EveryMethod.dpr


Example

// Auto-fix the orientation and skew of the image
ShowTempHourglass();
deskewAngle := ImageEnView1.IEBitmap.OCR_GetOrientation();
if deskewAngle <> 0 then
  ImageEnView1.Proc.Rotate( -deskewAngle, ierFast, clWhite );

For the following image, the returned value would be -92.94°:



See Also

TIEOCRLanguages