Распознавание даты рождения в OMR форме в .NET
Категория: Обработка форм документов; .NET
20 августа 2020
/// <summary> /// Creates a page template with birth date. /// </summary> /// <returns>A page template with birth date.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPageTemplate CreatePageTemplateWithBirthDate() { // create an OMR field template table for the first digit of day Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable dayPart1Template = CreateTemplateTableForFirstDigitInDay(); // create an OMR field template table for the second digit of day Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable dayPart2Template = CreateTemplateTableForSecondDigitInDay(); // create a form field template group for day Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup dayTemplate = CreateTemplateGroup( "Day", "{0}{1}", dayPart1Template, dayPart2Template); // create an OMR field template table for month Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable monthTemplate = CreateTemplateTableForMonth(); // create an OMR field template table for the first 2 digits of year Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable yearPart1Template = CreateTemplateTableForFirstTwoDigitsInYear(); // create an OMR field template table for the last 2 digits of year Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable yearPart2Template = CreateTemplateTableForLastTwoDigitsInYear(); // create a form field template group for year Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup yearTemplate = CreateTemplateGroup( "Year", "{0}{1}", yearPart1Template, yearPart2Template); // create birth date template as a group of day, month and year templates Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup dateOfBirthTemplate = CreateTemplateGroup( "Date of Birth", "{0}.{1}.{2}", dayTemplate, monthTemplate, yearTemplate); // create an empty page template Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPageTemplate pageTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPageTemplate(); // add birth date template to the page template pageTemplate.Items.Add(dateOfBirthTemplate); return pageTemplate; } /// <summary> /// Creates an OMR field template table for the first digit of day. /// </summary> /// <returns>An OMR field template table for the first digit of day.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable CreateTemplateTableForFirstDigitInDay() { // create template table Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable(); // update table properties result.Name = "D1"; result.ColumnCount = 1; result.RowCount = 4; result.Orientation = Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrTableOrientation.Vertical; result.DistanceBetweenColumns = 0.2f; result.DistanceBetweenRows = 0.2f; // update cell values result.CellValues[0, 0] = "0"; result.CellValues[1, 0] = "1"; result.CellValues[2, 0] = "2"; result.CellValues[3, 0] = "3"; // create table cell template result.CellTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrEllipticalFieldTemplate(); result.CellTemplate.FilledThreshold = 0.4f; // set table bounding box result.BoundingBox = new System.Drawing.RectangleF(6, 65, 20, 85); return result; } /// <summary> /// Creates an OMR field template table for the second digit of day. /// </summary> /// <returns>An OMR field template table for the second digit of day.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable CreateTemplateTableForSecondDigitInDay() { // create template table Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable(); // update table properties result.Name = "D2"; result.ColumnCount = 1; result.RowCount = 10; result.Orientation = Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrTableOrientation.Vertical; result.DistanceBetweenColumns = 0.2f; result.DistanceBetweenRows = 0.2f; // update cell values result.CellValues[0, 0] = "0"; result.CellValues[1, 0] = "1"; result.CellValues[2, 0] = "2"; result.CellValues[3, 0] = "3"; result.CellValues[4, 0] = "4"; result.CellValues[5, 0] = "5"; result.CellValues[6, 0] = "6"; result.CellValues[7, 0] = "7"; result.CellValues[8, 0] = "8"; result.CellValues[9, 0] = "9"; // create table cell template result.CellTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrEllipticalFieldTemplate(); result.CellTemplate.FilledThreshold = 0.4f; // set table bounding box result.BoundingBox = new System.Drawing.RectangleF(29, 65, 19, 216); return result; } /// <summary> /// Creates an OMR field template table for the month. /// </summary> /// <returns>An OMR field template table for the month.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable CreateTemplateTableForMonth() { // create template table Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable(); // update table properties result.Name = "Month"; result.ColumnCount = 1; result.RowCount = 12; result.Orientation = Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrTableOrientation.Vertical; result.DistanceBetweenColumns = 0.2f; result.DistanceBetweenRows = 0.2f; // update cell values result.CellValues[0, 0] = "1"; result.CellValues[1, 0] = "2"; result.CellValues[2, 0] = "3"; result.CellValues[3, 0] = "4"; result.CellValues[4, 0] = "5"; result.CellValues[5, 0] = "6"; result.CellValues[6, 0] = "7"; result.CellValues[7, 0] = "8"; result.CellValues[8, 0] = "9"; result.CellValues[9, 0] = "10"; result.CellValues[9, 0] = "11"; result.CellValues[9, 0] = "12"; // create table cell template result.CellTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrEllipticalFieldTemplate(); result.CellTemplate.FilledThreshold = 0.4f; // set table bounding box result.BoundingBox = new System.Drawing.RectangleF(59, 66, 15, 214); return result; } /// <summary> /// Creates an OMR field template table for the first 2 digits of year. /// </summary> /// <returns>An OMR field template table for the first 2 digits of year.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable CreateTemplateTableForFirstTwoDigitsInYear() { // create template table Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable(); // update table properties result.Name = "Y1"; result.ColumnCount = 2; result.RowCount = 2; result.Orientation = Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrTableOrientation.Vertical; result.DistanceBetweenColumns = 0.2f; result.DistanceBetweenRows = 0.2f; // update cell values result.CellValues[0, 0] = "1"; result.CellValues[0, 1] = "9"; result.CellValues[1, 0] = "2"; result.CellValues[1, 1] = "0"; // create table cell template result.CellTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrEllipticalFieldTemplate(); result.CellTemplate.FilledThreshold = 0.4f; // set table bounding box result.BoundingBox = new System.Drawing.RectangleF(154, 65, 42, 40); return result; } /// <summary> /// Creates an OMR field template table for the last 2 digits of year. /// </summary> /// <returns>An OMR field template table for the last 2 digits of year.</returns> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable CreateTemplateTableForLastTwoDigitsInYear() { // create template table Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrFieldTemplateTable(); // update table properties result.Name = "Y2"; result.ColumnCount = 2; result.RowCount = 10; result.Orientation = Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrTableOrientation.Vertical; result.DistanceBetweenColumns = 0.2f; result.DistanceBetweenRows = 0.2f; // update cell values result.CellValues[0, 0] = "0"; result.CellValues[0, 1] = "0"; result.CellValues[1, 0] = "1"; result.CellValues[1, 1] = "1"; result.CellValues[2, 0] = "2"; result.CellValues[2, 1] = "2"; result.CellValues[3, 0] = "3"; result.CellValues[3, 1] = "3"; result.CellValues[4, 0] = "4"; result.CellValues[4, 1] = "4"; result.CellValues[5, 0] = "5"; result.CellValues[5, 1] = "5"; result.CellValues[6, 0] = "6"; result.CellValues[6, 1] = "6"; result.CellValues[7, 0] = "7"; result.CellValues[7, 1] = "7"; result.CellValues[8, 0] = "8"; result.CellValues[8, 1] = "8"; result.CellValues[9, 0] = "9"; result.CellValues[9, 1] = "9"; // create table cell template result.CellTemplate = new Vintasoft.Imaging.FormsProcessing.FormRecognition.Omr.OmrEllipticalFieldTemplate(); result.CellTemplate.FilledThreshold = 0.4f; // set table bounding box result.BoundingBox = new System.Drawing.RectangleF(199, 65, 41, 216); return result; } /// <summary> /// Creates the form field template group. /// </summary> /// <param name="name">The group name.</param> /// <param name="valueFormat">The group value format.</param> /// <param name="items">The group items.</param> private static Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup CreateTemplateGroup( string name, string valueFormat, params Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplate[] items) { // create a form field template group Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup result = new Vintasoft.Imaging.FormsProcessing.FormRecognition.FormFieldTemplateGroup(); // add item to the form field template group result.Items.AddRange(items); // set name of form field template group result.Name = name; // set value format of form field template group result.ValueFormat = valueFormat; return result; }
/// <summary> /// Recognizes the birth date in filled OMR form. /// </summary> /// <param name="templateImagePath">A path to an image that represents a form template for filling the birth date.</param> /// <param name="filledImagePath">A path to an image that represents filled form with the birth date.</param> public static void RecognizeBirthDateInFilledOmrForm(string templateImagePath, string filledImagePath) { // open an image that represents a form template for filling the birth date using (Vintasoft.Imaging.VintasoftImage templateImage = new Vintasoft.Imaging.VintasoftImage(templateImagePath)) { // create a template manager Vintasoft.Imaging.FormsProcessing.FormRecognition.FormTemplateManager formTemplateManager = new Vintasoft.Imaging.FormsProcessing.FormRecognition.FormTemplateManager(); // create a page template with birth date Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPageTemplate formPageTemplate = CreatePageTemplateWithBirthDate(); // add template image and page template to the template manager formTemplateManager.AddPageTemplate(templateImage, formPageTemplate); // open an image that represents filled form with the birth date using (Vintasoft.Imaging.VintasoftImage filledImage = new Vintasoft.Imaging.VintasoftImage(filledImagePath)) { // recognize filled form with birth date RecognizeFilledFormInImage(formTemplateManager, filledImage); } } } /// <summary> /// Recognizes filled form in an image. /// </summary> /// <param name="templateManager">The template manager that contains information about form template.</param> /// <param name="image">An image that represents filled form.</param> private static void RecognizeFilledFormInImage( Vintasoft.Imaging.FormsProcessing.FormRecognition.FormTemplateManager templateManager, Vintasoft.Imaging.VintasoftImage image) { // create the template matching command Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatchingCommand = new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand(); // set the minimum confidence templateMatchingCommand.MinConfidence = 0.5f; // set template images templateMatchingCommand.TemplateImages = templateManager.TemplateImages; // create the form recognition manager Vintasoft.Imaging.FormsProcessing.FormRecognitionManager formRecognitionManager = new Vintasoft.Imaging.FormsProcessing.FormRecognitionManager(templateMatchingCommand, templateManager); // subscribe to the FormRecognitionResult.ImageRecognitionError event to output recognition errors formRecognitionManager.ImageRecognitionError += RecognitionManager_ImageRecognitionError; // recognize form in image Vintasoft.Imaging.FormsProcessing.FormRecognitionResult formRecognitionResult = formRecognitionManager.Recognize(image); // unsubscribe from FormRecognitionResult.ImageRecognitionError event formRecognitionManager.ImageRecognitionError -= RecognitionManager_ImageRecognitionError; // if recognition is failed if (formRecognitionResult == null) return; // get the result of image comparison Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult imageImprintCompareResult = formRecognitionResult.TemplateMatchingResult.ImageCompareResult; // if image comparison result is NOT reliable if (!imageImprintCompareResult.IsReliable) { // matching template is not found System.Console.WriteLine("Matching template is not found."); } // if image comparison result is reliable else { // get recognized form page Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPage recognizedPage = formRecognitionResult.RecognizedPage; // write page info System.Console.WriteLine(string.Format( "Matching template: {0}; confidence: {1:F1}%.", recognizedPage.Name, imageImprintCompareResult.Confidence * 100)); // get form field count if (recognizedPage.Items.Count == 0) { System.Console.WriteLine("No form fields were recognized."); } else { System.Console.WriteLine(string.Format( "Recognized form field count: {0}", recognizedPage.Items.Count)); // for each recognized form field foreach (Vintasoft.Imaging.FormsProcessing.FormRecognition.FormField recognizedField in recognizedPage.Items) { // write field info to the console System.Console.WriteLine(string.Format( " Name: {0}; value: {1}; confidence: {2:F1}%", recognizedField.Name, recognizedField.Value, recognizedField.Confidence * 100)); } } } } /// <summary> /// Handles the ImageRecognitionError event of the FormRecognitionManager. /// </summary> private static void RecognitionManager_ImageRecognitionError( object sender, Vintasoft.Imaging.FormsProcessing.FormRecognitionErrorEventArgs e) { // writes information about form recognition error to the console System.Console.WriteLine(e.Exception.Message); }