VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    Обработка форм: Идентификация и распознавание форм
    В этом разделе
    'Идентификация формы' - это процесс, который сравнивает изображение формы с одним или несколькими изображениями "шаблонов форм" и определяет "шаблон формы", который соответствует "форме". Во время идентификации SDK вычисляет матрицу преобразования, которая определяет перемещение, поворот и масштаб "формы" относительно "шаблона формы". Также во время идентификации SDK определяет достоверность результатов распознавания "формы".

    SDK идентифицирует "форму", даже если изображение формы повернуто или масштабировано по сравнению с "шаблоном формы". SDK НЕ будет идентифицировать "форму", если изображение формы искажено или деформировано по сравнению с "шаблоном формы".



    'Распознавание формы' - это процесс распознавания данных из "полей формы". Во время распознавания "формы" SDK создает список распознанных "полей формы". Для каждого распознанного поля SDK возвращает значение поля и достоверность результата распознавания.



    Класс FormRecognitionManager предназначен для идентификации и распознавания формы. Процесс идентификации и распознавания может выполняться для одной формы или для нескольких форм одновременно, этот процесс может быть синхронным или асинхронным. Класс может предоставлять информацию о ходе распознавания. Также класс позволяет применять команды обработки к шаблону изображения формы и заполненному изображению формы перед идентификацией формы.

    Для синхронного распознавания формы необходимо использовать метод FormRecognitionManager.Recognize, для асинхронного распознавания формы необходимо использовать метод FormRecognitionManager.RecognizeAsync.

    Результат распознавания возвращается как экземпляр класса FormRecognitionResult. Класс FormRecognitionResult содержит результат идентификации формы - FormRecognitionResult.TemplateMatchingResult, и результат распознавания формы - FormRecognitionResult.RecognizedPage.

    "Поле формы" представлено классом FormField, который определяет имя поля, значение поля и достоверность результата распознавания формы. Также класс FormField содержит ссылку на шаблон поля формы. Вот список стандартных классов, определяющих поля формы:
    Архитектура класса FormField открыта, поэтому пользователь может при необходимости определять собственные настраиваемые поля формы. Демо приложение "Forms Processing Demo" содержит пример поля формы, определяющего штрих-код.


    Вот статьи, в которых описывается, как распознавать заполненные формы в различных ситуациях:

    Обработка шаблона изображения формы и заполненного изображения формы перед идентификацией и распознаванием формы

    Иногда шаблон изображения формы и заполненные изображения формы не являются "идеальными", и SDK позволяет указать список команд обработки изображений, которые необходимо применить к шаблону изображения формы и заполненному изображению формы перед идентификацией формы.

    Вот C#/VB.NET код, который демонстрирует, как обработать изображения формы перед ее идентификацией (удалить шум и применить команду Dilate), идентифицировать и распознать форму:
    /// <summary>
    /// Recognizes single image synchronously.
    /// </summary>
    /// <param name="templateManager">The template manager.</param>
    /// <param name="image">The image.</param>
    public static void RecognizeSingleImageSync(
        Vintasoft.Imaging.FormsProcessing.FormRecognition.FormTemplateManager templateManager, 
        Vintasoft.Imaging.VintasoftImage image)
    {
        // create template matching command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatching = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand();
        // set minimal confidence
        templateMatching.MinConfidence = 0.5f;
        // set template images
        templateMatching.TemplateImages = templateManager.TemplateImages;
        // create recognition manager
        Vintasoft.Imaging.FormsProcessing.FormRecognitionManager recognitionManager = 
            new Vintasoft.Imaging.FormsProcessing.FormRecognitionManager(
                templateMatching, templateManager);
    
        // if your form template contains OCR fields,
        // make sure OCR engine manager is initialized before recognition
        // (otherwise recognition will return null (Nothing)),
        // see OCR field recognition examples
    
        // subscribe to ImageRecognitionError event to output recognition errors
        recognitionManager.ImageRecognitionError += recognitionManager_ImageRecognitionError;
    
        // recognize the image
        Vintasoft.Imaging.FormsProcessing.FormRecognitionResult recognitionResult = recognitionManager.Recognize(image);
    
        // unsubscribe from ImageRecognitionError event
        recognitionManager.ImageRecognitionError -= recognitionManager_ImageRecognitionError;
    
        // if recognition failed with error (see ImageRecognitionError event handler output)
        if (recognitionResult == null)
            return;
    
        // get the result of image comparison
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult imageCompareResult =
            recognitionResult.TemplateMatchingResult.ImageCompareResult;
        // if result is not reliable
        if (!imageCompareResult.IsReliable)
        {
            // matching template is not found
            System.Console.WriteLine("Matching template is not found.");
        }
        else
        {
            // get recognized page
            Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPage recognizedPage = recognitionResult.RecognizedPage;
            // write page info
            System.Console.WriteLine(string.Format(
                "Matching template: {0}; confidence: {1:F1}%.",
                recognizedPage.Name,
                imageCompareResult.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
                    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>
    static void recognitionManager_ImageRecognitionError(object sender, 
        Vintasoft.Imaging.FormsProcessing.FormRecognitionErrorEventArgs e)
    {
        System.Console.WriteLine(e.Exception.Message);
    }
    
    ''' <summary>
    ''' Recognizes single image synchronously.
    ''' </summary>
    ''' <param name="templateManager">The template manager.</param>
    ''' <param name="image">The image.</param>
    Public Shared Sub RecognizeSingleImageSync(templateManager As Vintasoft.Imaging.FormsProcessing.FormRecognition.FormTemplateManager, image As Vintasoft.Imaging.VintasoftImage)
        ' create template matching command
        Dim templateMatching As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand()
        ' set minimal confidence
        templateMatching.MinConfidence = 0.5F
        ' set template images
        templateMatching.TemplateImages = templateManager.TemplateImages
        ' create recognition manager
        Dim recognitionManager As New Vintasoft.Imaging.FormsProcessing.FormRecognitionManager(templateMatching, templateManager)
    
        ' if your form template contains OCR fields,
        ' make sure OCR engine manager is initialized before recognition
        ' (otherwise recognition will return null (Nothing)),
        ' see OCR field recognition examples
    
        ' subscribe to ImageRecognitionError event to output recognition errors
        AddHandler recognitionManager.ImageRecognitionError, AddressOf recognitionManager_ImageRecognitionError
    
        ' recognize the image
        Dim recognitionResult As Vintasoft.Imaging.FormsProcessing.FormRecognitionResult = recognitionManager.Recognize(image)
    
        ' unsubscribe from ImageRecognitionError event
        RemoveHandler recognitionManager.ImageRecognitionError, AddressOf recognitionManager_ImageRecognitionError
    
        ' if recognition failed with error (see ImageRecognitionError event handler output)
        If recognitionResult Is Nothing Then
            Return
        End If
    
        ' get the result of image comparison
        Dim imageCompareResult As Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult = recognitionResult.TemplateMatchingResult.ImageCompareResult
        ' if result is not reliable
        If Not imageCompareResult.IsReliable Then
            ' matching template is not found
            System.Console.WriteLine("Matching template is not found.")
        Else
            ' get recognized page
            Dim recognizedPage As Vintasoft.Imaging.FormsProcessing.FormRecognition.FormPage = recognitionResult.RecognizedPage
            ' write page info
            System.Console.WriteLine(String.Format("Matching template: {0}; confidence: {1:F1}%.", recognizedPage.Name, imageCompareResult.Confidence * 100))
    
            ' get form field count
            If recognizedPage.Items.Count = 0 Then
                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
                For Each recognizedField As Vintasoft.Imaging.FormsProcessing.FormRecognition.FormField In recognizedPage.Items
                    ' write field info
                    System.Console.WriteLine(String.Format("  Name: {0}; value: {1}; confidence: {2:F1}%", recognizedField.Name, recognizedField.Value, recognizedField.Confidence * 100))
                Next
            End If
        End If
    End Sub
    
    ''' <summary>
    ''' Handles the ImageRecognitionError event of the FormRecognitionManager.
    ''' </summary>
    Private Shared Sub recognitionManager_ImageRecognitionError(sender As Object, e As Vintasoft.Imaging.FormsProcessing.FormRecognitionErrorEventArgs)
        System.Console.WriteLine(e.Exception.Message)
    End Sub
    


    Отображение распознанной заполненной формы на изображении в WinForms просмотрщике изображений

    Класс FormFieldViewerTool предназначен для отображения распознанной заполненной формы на изображении в WinForms просмотрщике изображений.
    Вот C#/VB.NET код, который демонстрирует, как распознать форму и отобразить результаты в WinForms просмотрщике изображений.
    /// <summary>
    /// Recognizes the current image of specified viewer
    /// and shows recognition results in viewer.
    /// </summary>
    /// <param name="viewer">The viewer.</param>
    /// <param name="formRecognitionManager">The form recognition manager.</param>
    public static bool RecognizeAndShowInViewer(
        Vintasoft.Imaging.UI.ImageViewer viewer,
        Vintasoft.Imaging.FormsProcessing.FormRecognitionManager formRecognitionManager)
    {
        // recognize the image
        Vintasoft.Imaging.FormsProcessing.FormRecognitionResult recognitionResult = 
            formRecognitionManager.Recognize(viewer.Image);
    
        // get the result of image comparison
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult imageCompareResult =
            recognitionResult.TemplateMatchingResult.ImageCompareResult;
        // if image is recognized
        if (imageCompareResult.IsReliable)
        {
            // create a visual tool
            Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.VisualTools.FormFieldViewerTool formFieldViewerTool = 
                new Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.VisualTools.FormFieldViewerTool();
            // create a view for the recognized page
            Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.FormFieldView pageView = 
                Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.FormFieldViewFactory.CreateView(recognitionResult.RecognizedPage);
            // add the view to the collection of the visual tool
            formFieldViewerTool.FieldViewCollection.Add(pageView);
            // set the visual tool as current tool of the viewer
            viewer.VisualTool = formFieldViewerTool;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    ''' <summary>
    ''' Recognizes the current image of specified viewer
    ''' and shows recognition results in viewer.
    ''' </summary>
    ''' <param name="viewer">The viewer.</param>
    ''' <param name="formRecognitionManager">The form recognition manager.</param>
    Public Shared Function RecognizeAndShowInViewer(viewer As Vintasoft.Imaging.UI.ImageViewer, formRecognitionManager As Vintasoft.Imaging.FormsProcessing.FormRecognitionManager) As Boolean
        ' recognize the image
        Dim recognitionResult As Vintasoft.Imaging.FormsProcessing.FormRecognitionResult = formRecognitionManager.Recognize(viewer.Image)
    
        ' get the result of image comparison
        Dim imageCompareResult As Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult = recognitionResult.TemplateMatchingResult.ImageCompareResult
        ' if image is recognized
        If imageCompareResult.IsReliable Then
            ' create a visual tool
            Dim formFieldViewerTool As New Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.VisualTools.FormFieldViewerTool()
            ' create a view for the recognized page
            Dim pageView As Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.FormFieldView = Vintasoft.Imaging.FormsProcessing.FormRecognition.UI.FormFieldViewFactory.CreateView(recognitionResult.RecognizedPage)
            ' add the view to the collection of the visual tool
            formFieldViewerTool.FieldViewCollection.Add(pageView)
            ' set the visual tool as current tool of the viewer
            viewer.VisualTool = formFieldViewerTool
            Return True
        Else
            Return False
        End If
    End Function
    


    Отображение распознанной заполненной формы на изображении в WPF просмотрщике изображений

    Класс WpfFormFieldViewerTool предназначен для отображения распознанной заполненной формы на изображении в WPF просмотрщике изображений.

    Вот C#/VB.NET код, который демонстрирует, как распознать форму и отобразить результаты в WPF просмотрщике изображений.
    /// <summary>
    /// Recognizes the current image of specified viewer
    /// and shows recognition results in viewer.
    /// </summary>
    /// <param name="viewer">The viewer.</param>
    /// <param name="formRecognitionManager">The form recognition manager.</param>
    public static bool RecognizeAndShowInViewer(
        Vintasoft.Imaging.Wpf.UI.WpfImageViewer viewer,
        Vintasoft.Imaging.FormsProcessing.FormRecognitionManager formRecognitionManager)
    {
        // recognize the image
        Vintasoft.Imaging.FormsProcessing.FormRecognitionResult recognitionResult = 
            formRecognitionManager.Recognize(viewer.Image);
    
        // get the result of image comparison
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult imageCompareResult =
            recognitionResult.TemplateMatchingResult.ImageCompareResult;
        // if image is recognized
        if (imageCompareResult.IsReliable)
        {
            // create a visual tool
            Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.VisualTools.WpfFormFieldViewerTool formFieldViewerTool = 
                new Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.VisualTools.WpfFormFieldViewerTool();
            // create a view for the recognized page
            Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.WpfFormFieldView pageView = 
                Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.WpfFormFieldViewFactory.CreateView(recognitionResult.RecognizedPage);
            // add the view to the collection of the visual tool
            formFieldViewerTool.FieldViewCollection.Add(pageView);
            // set transform matrix and resolution of template image
            formFieldViewerTool.SetTransform(
                imageCompareResult.TransformMatrix,
                imageCompareResult.SourceImprint.ImageSize.Resolution);
            // set the visual tool as current tool of the viewer
            viewer.VisualTool = formFieldViewerTool;
            return true;
        }
        else
        {
            return false;
        }
    }
    
    ''' <summary>
    ''' Recognizes the current image of specified viewer
    ''' and shows recognition results in viewer.
    ''' </summary>
    ''' <param name="viewer">The viewer.</param>
    ''' <param name="formRecognitionManager">The form recognition manager.</param>
    Public Shared Function RecognizeAndShowInViewer(viewer As Vintasoft.Imaging.Wpf.UI.WpfImageViewer, formRecognitionManager As Vintasoft.Imaging.FormsProcessing.FormRecognitionManager) As Boolean
        ' recognize the image
        Dim recognitionResult As Vintasoft.Imaging.FormsProcessing.FormRecognitionResult = formRecognitionManager.Recognize(viewer.Image)
    
        ' get the result of image comparison
        Dim imageCompareResult As Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintCompareResult = recognitionResult.TemplateMatchingResult.ImageCompareResult
        ' if image is recognized
        If imageCompareResult.IsReliable Then
            ' create a visual tool
            Dim formFieldViewerTool As New Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.VisualTools.WpfFormFieldViewerTool()
            ' create a view for the recognized page
            Dim pageView As Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.WpfFormFieldView = Vintasoft.Imaging.FormsProcessing.FormRecognition.Wpf.UI.WpfFormFieldViewFactory.CreateView(recognitionResult.RecognizedPage)
            ' add the view to the collection of the visual tool
            formFieldViewerTool.FieldViewCollection.Add(pageView)
            ' set transform matrix and resolution of template image
            formFieldViewerTool.SetTransform(imageCompareResult.TransformMatrix, imageCompareResult.SourceImprint.ImageSize.Resolution)
            ' set the visual tool as current tool of the viewer
            viewer.VisualTool = formFieldViewerTool
            Return True
        Else
            Return False
        End If
    End Function