Products | Support | Email a link to this topic. | Send comments on this topic. | Back to Introduction - All Topics | Help Version 19.0.6.9
|
Leadtools.Forms.Ocr Assembly > Leadtools.Forms.Ocr Namespace > IOcrPage Interface : AutoZone Method |
void AutoZone( OcrProgressCallback callback )
'Declaration
Sub AutoZone( _ ByVal callback As OcrProgressCallback _ )
'Usage
Dim instance As IOcrPage Dim callback As OcrProgressCallback instance.AutoZone(callback)
void AutoZone( OcrProgressCallback callback )
- (BOOL)autoZone:(nullable LTOcrProgressHandler)progressHandlererror:(NSError **)error
public void autoZone(OcrProgressListener callback)
function Leadtools.Forms.Ocr.IOcrPage.AutoZone( 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: 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 method 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.
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.
This example will perform auto-zoning on an OCR page then displays information about the zones found.
Imports Leadtools Imports Leadtools.Codecs Imports Leadtools.Forms.Ocr Imports Leadtools.Forms Imports Leadtools.Forms.DocumentWriters Imports Leadtools.WinForms Imports Leadtools.Drawing Imports Leadtools.ImageProcessing Imports Leadtools.ImageProcessing.Color <TestMethod> 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 page Using ocrPage As IOcrPage = ocrEngine.CreatePage(image, OcrImageSharingMode.AutoDispose) ' 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) ' 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) 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(message As String, 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(" 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 19\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; using Leadtools.ImageProcessing; using Leadtools.ImageProcessing.Color; 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 page using (IOcrPage ocrPage = ocrEngine.CreatePage(image, OcrImageSharingMode.AutoDispose)) { // 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); // 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); } // 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(" 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 19\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; 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("----------------------------------"); } }