LEADTOOLS OCR (Leadtools.Forms.Ocr assembly)

AutoZone(OcrProgressCallback) Method

Show in webframe
Example 







Optional callback to show operation progress.
Performs auto decomposition of the page to find the text and graphics zones using predefined parameters
Syntax
void AutoZone( 
   OcrProgressCallback callback
)
'Declaration
 
Overloads Sub AutoZone( _
   ByVal callback As OcrProgressCallback _
) 
'Usage
 
Dim instance As IOcrPage
Dim callback As OcrProgressCallback
 
instance.AutoZone(callback)
void AutoZone( 
   OcrProgressCallback callback
)
- (BOOL)autoZone:(id)target
        selector:(SEL)selector
           error:(NSError**)outError;
            
public void autoZone(OcrProgressListener callback)
function Leadtools.Forms.Ocr.IOcrPage.AutoZone(OcrProgressCallback)( 
   callback 
)
void AutoZone( 
   OcrProgressCallback^ callback
) 

Parameters

callback
Optional callback to show operation progress.
Remarks

You can use the OcrProgressCallback to show the operation progress or to abort it. For more information and an example, refer to OcrProgressCallback.

The zones found by this method are added to the Zones collection of this page. Any previously added zones will be removed from Zones first.

This method finds the zone coordinates (OcrZone.Bounds which will always have units of LogicalUnit.Pixels) and type (OcrZone.ZoneType). The type of the zone determines its role in the page layout and can be classified into three different groups:

  1. The flowed text zone types: OcrZoneType.Text, OcrZoneType.Column, OcrZoneType.Header, OcrZoneType.Footer, OcrZoneType.Caption, OcrZoneType.Title, OcrZoneType.VerticalText, OcrZoneType.LeftRotatedText, OcrZoneType.RightRotatedText and OcrZoneType.Other. These types mean that the zone contains textual information without a table type structure inside (it is flowed text). These types listed above are considered the same, they will not be differentiated from each other during the later processing stages.

    Note: Only OcrZoneType.Text is currently supported for the LEADTOOLS OCR Advantage Engine.

  2. The OcrZoneType.Table type. A zone having this type means that the zone is detected as containing a table, i.e. with columns, with or without a grid. Such zones will be handled differently from those of flowed text type zones.
  3. The OcrZoneType.Graphic type means a zone contains graphics, i.e. this zone will not be recognized at all. The only reason to have such a zone is to save or export the image inside the zone area.

The new zones found by this method will always have the OcrZone.FillMethod and OcrZone.RecognitionModule set to OcrZoneFillMethod.Default and OcrZoneRecognitionModule.Auto respectively. In order to override this automatic fill method and recognition module, you must update each zone in Zones by getting the zone with the IOcrZoneCollection getter, update and set it back with the setter. You can get the number of zones found by this method with the Zones.Count property.

The AutoZone(OcrZoneParser zoneParser, OcrZoneFillMethod fillMethod, LogicalUnit zonesUnit, OcrProgressCallback callback) override of this method lets you control the zone parser, default fill method and the units of the zones found.

To update the zones of a page with fill method set to OcrZoneFillMethod.Default, use UpdateFillMethod.

To detect the global fill method of a page, use DetectFillMethod.

Note: If this IOcrPage is an empty page, in other words, when the OCR engine performs automatic page decomposing with the AutoZone method and could not find any zones in it, the Recognize or RecognizeText methods will fail with an exception. It is recommended you call AutoZone and then check if there is at least one zone found by the engine (using Zones.Count). If the count is zero, do not call Recognize or or RecognizeText.

If a recognition module is not able to recognize an object (i.e. character, or checkmark etc.), this object will be marked as a rejected one. It will become marked by a rejection symbol during conversion to the final output document. Note that IOcrDocumentManager.RejectionSymbol can be set to specify the rejection symbol used in the final document.

Note on AutoZone/Recognize and the page image: In certain cases, AutoZone and Recognize will perform image processing on the page that might result in the page being manipulated. For example, if you add a zone of type table, the engine might automatically deskew the page if required. This result in the image representation of the image to be different after AutoZone or Recognize is called. If your application has a requirement to view the image of the page, then call GetRasterImage after AutoZone or Recognize to get the latest version of the image representation of the page in case it has changed. The LEADTOOLS Main OCR C# and VB demos do exactly that.

Example
Copy Code  
Imports Leadtools
Imports Leadtools.Codecs
Imports Leadtools.Forms.Ocr
Imports Leadtools.Forms
Imports Leadtools.Forms.DocumentWriters
Imports Leadtools.WinForms
Imports Leadtools.ImageProcessing.Core
Imports Leadtools.Drawing

Public Sub OcrAutoZoneExample()
   ' Create an image with some text in it
   Dim image As New RasterImage(RasterMemoryFlags.Conventional, 320, 200, 24, RasterByteOrder.Bgr, RasterViewPerspective.TopLeft, Nothing, IntPtr.Zero, 0)
   Dim imageRect As New Rectangle(0, 0, image.ImageWidth, image.ImageHeight)
   Dim hdc As IntPtr = RasterImagePainter.CreateLeadDC(image)
   Using g As Graphics = Graphics.FromHdc(hdc)
      g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
      g.FillRectangle(Brushes.White, imageRect)

      Using f As New Font("Arial", 20, FontStyle.Regular)
         g.DrawString("Normal line", f, Brushes.Black, 0, 0)
      End Using

      Using f As New Font("Courier New", 20, FontStyle.Regular)
         g.DrawString("Monospaced line", f, Brushes.Black, 0, 80)
      End Using
   End Using

   RasterImagePainter.DeleteLeadDC(hdc)

   Dim zonesFileName As String = Path.Combine(LEAD_VARS.ImagesDir, "MyZones.xml")

   ' Create an instance of the engine
   Using ocrEngine As IOcrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, False)
      ' Start the engine using default parameters
      ocrEngine.Startup(Nothing, Nothing, Nothing, LEAD_VARS.OcrAdvantageRuntimeDir)

      ' Create an OCR document
      Using ocrDocument As IOcrDocument = ocrEngine.DocumentManager.CreateDocument()

         ' Add this image to the document
         Dim ocrPage As IOcrPage = ocrDocument.Pages.AddPage(image, Nothing)
         image.Dispose()

         ' Show the zones, there should be no zones yet
         ShowZones("Right after the page was created", ocrPage)

         ' Perform default AutoZoning on the page
         ocrPage.AutoZone(Nothing)

         ' Show the zones, there should be two zones, one for each line
         ShowZones("AutoZone with default parameters", ocrPage)

         ' Upda the fill methods of the zones
         ocrPage.UpdateFillMethod()

         ' Show the zones after the fill method has been updated
         ShowZones("After updating the fill methods", ocrPage)

         ' Update the first zone manually
         Dim ocrZone As OcrZone = ocrPage.Zones(0)
         ocrZone.ZoneType = OcrZoneType.Text
         ocrPage.Zones(0) = ocrZone

         ' Show the zones
         ShowZones("After updating the type of the first zone", ocrPage)

         ' Save the zones to a file and then clear them
         ocrPage.SaveZones(zonesFileName)
         ocrPage.Zones.Clear()

         ' Show the zones, there should be no zones since we just cleared them
         ShowZones("After calling save and clear", ocrPage)

         ' Re-load the zones
         ocrPage.LoadZones(zonesFileName)
         ShowZones("After re-loading the zones", ocrPage)

         ' To do manual auto zoning, it is helpful to first get the fill method of the page
         Dim fillMethod As OcrZoneFillMethod = ocrPage.DetectFillMethod()
         Console.WriteLine("Fill method detected: {0}", fillMethod)

         ' Clear the zones and do auto zone with specific options
         ocrPage.AutoZone(OcrZoneParser.Default, fillMethod, LogicalUnit.Inch, Nothing)
         ShowZones("After AutoZone with specific options, units should be in inches", ocrPage)
      End Using

      ' Shutdown the engine
      ' Note: calling Dispose will also automatically shutdown the engine if it has been started
      ocrEngine.Shutdown()
   End Using
End Sub

Private Sub ShowZones(ByVal message As String, ByVal ocrPage As IOcrPage)
   Console.WriteLine("Zones after {0}:", message)
   For Each ocrZone As OcrZone In ocrPage.Zones
      Dim index As Integer = ocrPage.Zones.IndexOf(ocrZone)
      Console.WriteLine("Zone index: {0}", index)
      Console.WriteLine("  Id                  {0}", ocrZone.Id)
      Console.WriteLine("  Bounds              {0}", ocrZone.Bounds)
      Console.WriteLine("  ZoneType            {0}", ocrZone.ZoneType)
      Console.WriteLine("  FillMethod:         {0}", ocrZone.FillMethod)
      Console.WriteLine("  RecognitionModule:  {0}", ocrZone.RecognitionModule)
      Console.WriteLine("  CharacterFilters:   {0}", ocrZone.CharacterFilters)
      Console.WriteLine("----------------------------------")
   Next

   Console.WriteLine("Hit enter to continue")
   Console.ReadLine()
End Sub

Public NotInheritable Class LEAD_VARS
Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images"
Public Const OcrAdvantageRuntimeDir As String = "C:\LEADTOOLS 18\Bin\Common\OcrAdvantageRuntime"
End Class
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Forms.Ocr;
using Leadtools.Forms;
using Leadtools.Forms.DocumentWriters;
using Leadtools.WinForms;
using Leadtools.Drawing;

public void OcrAutoZoneExample()
{
   // Create an image with some text in it
   RasterImage image = new RasterImage(RasterMemoryFlags.Conventional, 320, 200, 24, RasterByteOrder.Bgr, RasterViewPerspective.TopLeft, null, IntPtr.Zero, 0);
   Rectangle imageRect = new Rectangle(0, 0, image.ImageWidth, image.ImageHeight);
   IntPtr hdc = RasterImagePainter.CreateLeadDC(image);
   using (Graphics g = Graphics.FromHdc(hdc))
   {
      g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
      g.FillRectangle(Brushes.White, imageRect);

      using (Font f = new Font("Arial", 20, FontStyle.Regular))
         g.DrawString("Normal line", f, Brushes.Black, 0, 0);

      using (Font f = new Font("Courier New", 20, FontStyle.Regular))
         g.DrawString("Monospaced line", f, Brushes.Black, 0, 80);
   }

   RasterImagePainter.DeleteLeadDC(hdc);

   string zonesFileName = Path.Combine(LEAD_VARS.ImagesDir, "MyZones.xml");

   // Create an instance of the engine
   using (IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false))
   {
      // Start the engine using default parameters
      ocrEngine.Startup(null, null, null, LEAD_VARS.OcrAdvantageRuntimeDir);

      // Create an OCR document
      using (IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument())
      {
         // Add this image to the document
         IOcrPage ocrPage = ocrDocument.Pages.AddPage(image, null);
         image.Dispose();

         // Show the zones, there should be no zones yet
         ShowZones("Right after the page was created", ocrPage);

         // Perform default AutoZoning on the page
         ocrPage.AutoZone(null);

         // Show the zones, there should be two zones, one for each line
         ShowZones("AutoZone with default parameters", ocrPage);

         // Upda the fill methods of the zones
         ocrPage.UpdateFillMethod();

         // Show the zones after the fill method has been updated
         ShowZones("After updating the fill methods", ocrPage);

         // Update the first zone manually
         OcrZone ocrZone = ocrPage.Zones[0];
         ocrZone.ZoneType = OcrZoneType.Text;
         ocrPage.Zones[0] = ocrZone;

         // Show the zones
         ShowZones("After updating the type of the first zone", ocrPage);

         // Save the zones to a file and then clear them
         ocrPage.SaveZones(zonesFileName);
         ocrPage.Zones.Clear();

         // Show the zones, there should be no zones since we just cleared them
         ShowZones("After calling save and clear", ocrPage);

         // Re-load the zones
         ocrPage.LoadZones(zonesFileName);
         ShowZones("After re-loading the zones", ocrPage);

         // To do manual auto zoning, it is helpful to first get the fill method of the page
         OcrZoneFillMethod fillMethod = ocrPage.DetectFillMethod();
         Console.WriteLine("Fill method detected: {0}", fillMethod);

         // Clear the zones and do auto zone with specific options
         ocrPage.AutoZone(OcrZoneParser.Default, fillMethod, LogicalUnit.Inch, null);
         ShowZones("After AutoZone with specific options, units should be in inches", ocrPage);
      }

      // Shutdown the engine
      // Note: calling Dispose will also automatically shutdown the engine if it has been started
      ocrEngine.Shutdown();
   }
}

private void ShowZones(string message, IOcrPage ocrPage)
{
   Console.WriteLine("Zones after {0}:", message);
   foreach (OcrZone ocrZone in ocrPage.Zones)
   {
      int index = ocrPage.Zones.IndexOf(ocrZone);
      Console.WriteLine("Zone index: {0}", index);
      Console.WriteLine("  Id                  {0}", ocrZone.Id);
      Console.WriteLine("  Bounds              {0}", ocrZone.Bounds);
      Console.WriteLine("  ZoneType            {0}", ocrZone.ZoneType);
      Console.WriteLine("  FillMethod:         {0}", ocrZone.FillMethod);
      Console.WriteLine("  RecognitionModule:  {0}", ocrZone.RecognitionModule);
      Console.WriteLine("  CharacterFilters:   {0}", ocrZone.CharacterFilters);
      Console.WriteLine("----------------------------------");
   }

   Console.WriteLine("Hit enter to continue");
   Console.ReadLine();
}

static class LEAD_VARS
{
public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images";
public const string OcrAdvantageRuntimeDir = @"C:\LEADTOOLS 18\Bin\Common\OcrAdvantageRuntime";
}
using Leadtools;
using Leadtools.Codecs;
using Leadtools.Controls;
using Leadtools.Forms.Ocr;
using Leadtools.Forms;
using Leadtools.Forms.DocumentWriters;
using Leadtools.ImageProcessing;

[TestMethod]
public async Task OcrAutoZoneExample()
{
   string imageFileName = @"Assets\OCR1.TIF";
   string zonesFileName = "MyZones.xml";

   // Create an instance of the engine
   IOcrEngine ocrEngine = OcrEngineManager.CreateEngine(OcrEngineType.Advantage, false);

   // Start the engine using default parameters
   ocrEngine.Startup(null, null, String.Empty, Tools.OcrEnginePath);

   // Create an OCR document
   IOcrDocument ocrDocument = ocrEngine.DocumentManager.CreateDocument();

   // Load the image
   IOcrPage ocrPage = null;
   using (RasterCodecs codecs = new RasterCodecs())
   {
      StorageFile loadFile = await Tools.AppInstallFolder.GetFileAsync(imageFileName);
      using (RasterImage image = await codecs.LoadAsync(LeadStreamFactory.Create(loadFile)))
         ocrPage = ocrDocument.Pages.AddPage(image, null);
   }

   // Show the zones, there should be no zones yet
   ShowZones("Right after the page was created", ocrPage);

   // Perform default AutoZoning on the page
   ocrPage.AutoZone(null);

   // Show the zones, there should be nine zones
   ShowZones("AutoZone image", ocrPage);

   // Update the first zone manually
   OcrZone ocrZone = ocrPage.Zones[0];
   ocrZone.ZoneType = OcrZoneType.Graphic;
   ocrPage.Zones[0] = ocrZone;

   // Show the zones
   ShowZones("After updating the type of the first zone", ocrPage);

   // Save the zones to a file and then clear them
   StorageFile saveFile = await Tools.AppLocalFolder.CreateFileAsync(zonesFileName);
   await ocrDocument.SaveZonesAsync(saveFile);
   ocrPage.Zones.Clear();

   // Show the zones, there should be no zones since we just cleared them
   ShowZones("After calling save and clear", ocrPage);

   // Re-load the zones
   await ocrPage.LoadZonesAsync(saveFile);
   ShowZones("After re-loading the zones", ocrPage);

   // Shutdown the engine
   ocrEngine.Shutdown();
}

private void ShowZones(string message, IOcrPage ocrPage)
{
   Debug.WriteLine("Zones after {0}:", message);
   foreach(OcrZone ocrZone in ocrPage.Zones)
   {
      int index = ocrPage.Zones.IndexOf(ocrZone);
      Debug.WriteLine("Zone index: {0}", index);
      Debug.WriteLine("  Id                  {0}", ocrZone.Id);
      Debug.WriteLine("  Bounds              {0}", ocrZone.Bounds);
      Debug.WriteLine("  ZoneType            {0}", ocrZone.ZoneType);
      Debug.WriteLine("  FillMethod:         {0}", ocrZone.FillMethod);
      Debug.WriteLine("  RecognitionModule:  {0}", ocrZone.RecognitionModule);
      Debug.WriteLine("  CharacterFilters:   {0}", ocrZone.CharacterFilters);
      Debug.WriteLine("----------------------------------");
   }
}
Requirements

Target Platforms

See Also

Reference

IOcrPage Interface
IOcrPage Members
Overload List
IOcrPageCollection Interface
IOcrZoneCollection Interface
OcrZone Structure
Recognize Method
Programming with the LEADTOOLS .NET OCR

 

 


Products | Support | Contact Us | Copyright Notices
© 2006-2014 All Rights Reserved. LEAD Technologies, Inc.

AutoZone(OcrProgressCallback) requires an OCR module license and unlock key. For more information, refer to: Imaging Pro/Document/Medical Features