Leadtools.Forms.Ocr Namespace > IOcrPage Interface > AutoZone Method : AutoZone(OcrProgressCallback) Method |
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 )
function Leadtools.Forms.Ocr.IOcrPage.AutoZone(OcrProgressCallback)( callback )
void AutoZone( OcrProgressCallback^ callback )
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:
Note: Only OcrZoneType.Text is currently supported for the LEADTOOLS OCR Advantage Engine.
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.
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.Plus, False) ' Start the engine using default parameters ocrEngine.Startup(Nothing, Nothing, Nothing, Nothing) ' 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" End Class
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.Plus, false)) { // Start the engine using default parameters ocrEngine.Startup(null, null, null, null); // 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"; }
[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("----------------------------------"); } }
Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2