VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    Обработка форм: Идентификация изображения документа
    В этом разделе
    Иногда необходимо определить тип документа без распознавания данных документа. Например, может возникнуть необходимость разделить изображения с счетами-фактурами и налоговыми декларациями. SDK позволяет выполнить эту работу с помощью класса TemplateMatchingCommand.


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


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

    Вот C#/VB.NET код, который демонстрирует, как определить тип документа (счет-фактура или налоговая декларация) по изображению.
    /// <summary>
    /// Identifies the type of document.
    /// </summary>
    /// <param name="invoiceTemplateFilename">The invoice template filename.</param>
    /// <param name="taxReturnTemplateFilename">The tax return template filename.</param>
    /// <param name="documentFilename">The document filename.</param>
    public static void IdentifyTypeOfDocument(
        string invoiceTemplateFilename,
        string taxReturnTemplateFilename,
        string documentFilename)
    {
        // create new template matching command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatchingCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand();
        // open invoice template
        Vintasoft.Imaging.VintasoftImage invoiceTemplateImage = 
            new Vintasoft.Imaging.VintasoftImage(invoiceTemplateFilename);
        templateMatchingCommand.TemplateImages.Add(invoiceTemplateImage);
        // open tax return template
        Vintasoft.Imaging.VintasoftImage taxReturnTemplateImage = 
            new Vintasoft.Imaging.VintasoftImage(taxReturnTemplateFilename);
        templateMatchingCommand.TemplateImages.Add(taxReturnTemplateImage);
        // open test image
        using (Vintasoft.Imaging.VintasoftImage testImage = 
            new Vintasoft.Imaging.VintasoftImage(documentFilename))
        {
            // execute template matching
            templateMatchingCommand.ExecuteInPlace(testImage);
        }
        // if image is recognized
        if (templateMatchingCommand.Result.ImageCompareResult.IsReliable)
        {
            // write matching template type
            if (templateMatchingCommand.Result.TemplateImage == invoiceTemplateImage)
                System.Console.WriteLine("Document is an invoice.");
            else
                System.Console.WriteLine("Document is a tax return.");
        }
        else
        {
            System.Console.WriteLine("Document type is not recognized.");
        }
        // dispose template images
        templateMatchingCommand.TemplateImages.ClearAndDisposeItems();
    }
    
    ''' <summary>
    ''' Identifies the type of document.
    ''' </summary>
    ''' <param name="invoiceTemplateFilename">The invoice template filename.</param>
    ''' <param name="taxReturnTemplateFilename">The tax return template filename.</param>
    ''' <param name="documentFilename">The document filename.</param>
    Public Shared Sub IdentifyTypeOfDocument(invoiceTemplateFilename As String, taxReturnTemplateFilename As String, documentFilename As String)
        ' create new template matching command
        Dim templateMatchingCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand()
        ' open invoice template
        Dim invoiceTemplateImage As New Vintasoft.Imaging.VintasoftImage(invoiceTemplateFilename)
        templateMatchingCommand.TemplateImages.Add(invoiceTemplateImage)
        ' open tax return template
        Dim taxReturnTemplateImage As New Vintasoft.Imaging.VintasoftImage(taxReturnTemplateFilename)
        templateMatchingCommand.TemplateImages.Add(taxReturnTemplateImage)
        ' open test image
        Using testImage As New Vintasoft.Imaging.VintasoftImage(documentFilename)
            ' execute template matching
            templateMatchingCommand.ExecuteInPlace(testImage)
        End Using
        ' if image is recognized
        If templateMatchingCommand.Result.ImageCompareResult.IsReliable Then
            ' write matching template type
            If templateMatchingCommand.Result.TemplateImage Is invoiceTemplateImage Then
                System.Console.WriteLine("Document is an invoice.")
            Else
                System.Console.WriteLine("Document is a tax return.")
            End If
        Else
            System.Console.WriteLine("Document type is not recognized.")
        End If
        ' dispose template images
        templateMatchingCommand.TemplateImages.ClearAndDisposeItems()
    End Sub
    


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

    Процесс сравнения изображений включает в себя создание отпечатков сравниваемых изображений и собственно сравнение этих отпечатков изображений. В SDK реализованы 2 алгоритма создания отпечатка изображения:
    Также SDK позволяет указать пользовательский алгоритм создания отпечатков изображений.

    Вот C#/VB.NET код, который демонстрирует, как идентифицировать изображение документа с помощью алгоритма, создающего отпечаток изображения на основе линий.
    /// <summary>
    /// Identifies the image using key lines.
    /// </summary>
    /// <param name="templateImages">The template images.</param>
    /// <param name="testImage">The test image.</param>
    /// <returns>Result of template matching.</returns>
    public static Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingResult IdentifyUsingLines(
        Vintasoft.Imaging.VintasoftImage[] templateImages, 
        Vintasoft.Imaging.VintasoftImage testImage)
    {
        // create a recognizer
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyLineRecognizerCommand lineRecognizerCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyLineRecognizerCommand();
        // set units of measure
        lineRecognizerCommand.UnitOfMeasure = Vintasoft.Imaging.UnitOfMeasure.Pixels;
        // set max length of line
        lineRecognizerCommand.MaxLength = 2000;
        // create a template matching command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatchingCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand();
        // set imprint generator based on recognizer
        templateMatchingCommand.ImageImprintGenerator =
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintGeneratorCommand(lineRecognizerCommand);
        // add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages);
        // execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage);
        // return result
        return templateMatchingCommand.Result;
    }
    
    ''' <summary>
    ''' Identifies the image using key lines.
    ''' </summary>
    ''' <param name="templateImages">The template images.</param>
    ''' <param name="testImage">The test image.</param>
    ''' <returns>Result of template matching.</returns>
    Public Shared Function IdentifyUsingLines(templateImages As Vintasoft.Imaging.VintasoftImage(), testImage As Vintasoft.Imaging.VintasoftImage) As Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingResult
        ' create a recognizer
        Dim lineRecognizerCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyLineRecognizerCommand()
        ' set units of measure
        lineRecognizerCommand.UnitOfMeasure = Vintasoft.Imaging.UnitOfMeasure.Pixels
        ' set max length of line
        lineRecognizerCommand.MaxLength = 2000
        ' create a template matching command
        Dim templateMatchingCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand()
        ' set imprint generator based on recognizer
        templateMatchingCommand.ImageImprintGenerator = New Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintGeneratorCommand(lineRecognizerCommand)
        ' add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages)
        ' execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage)
        ' return result
        Return templateMatchingCommand.Result
    End Function
    

    Вот C#/VB.NET код, который демонстрирует, как идентифицировать изображение документа с помощью алгоритма, создающего отпечаток изображения на основе L шаблонов поиска.
    /// <summary>
    /// Identifies the image using key marks.
    /// </summary>
    /// <param name="templateImages">The template images.</param>
    /// <param name="testImage">The test image.</param>
    /// <returns>Result of template matching.</returns>
    public static Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingResult IdentifyUsingMarks(
        Vintasoft.Imaging.VintasoftImage[] templateImages, 
        Vintasoft.Imaging.VintasoftImage testImage)
    {
        // create a recognizer
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyMarkRecognizerCommand markRecognizerCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyMarkRecognizerCommand();
        // set units of measure
        markRecognizerCommand.UnitOfMeasure = Vintasoft.Imaging.UnitOfMeasure.Pixels;
        // set max size of mark
        markRecognizerCommand.MaxMarkSize = 300;
        // set min size of mark
        markRecognizerCommand.MinMarkSize = 50;
        // create a template matching command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatchingCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand();
        // set imprint generator based on recognizer
        templateMatchingCommand.ImageImprintGenerator =
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintGeneratorCommand(markRecognizerCommand);
        // add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages);
        // execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage);
        // return result
        return templateMatchingCommand.Result;
    }
    
    ''' <summary>
    ''' Identifies the image using key marks.
    ''' </summary>
    ''' <param name="templateImages">The template images.</param>
    ''' <param name="testImage">The test image.</param>
    ''' <returns>Result of template matching.</returns>
    Public Shared Function IdentifyUsingMarks(templateImages As Vintasoft.Imaging.VintasoftImage(), testImage As Vintasoft.Imaging.VintasoftImage) As Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingResult
        ' create a recognizer
        Dim markRecognizerCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyMarkRecognizerCommand()
        ' set units of measure
        markRecognizerCommand.UnitOfMeasure = Vintasoft.Imaging.UnitOfMeasure.Pixels
        ' set max size of mark
        markRecognizerCommand.MaxMarkSize = 300
        ' set min size of mark
        markRecognizerCommand.MinMarkSize = 50
        ' create a template matching command
        Dim templateMatchingCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand()
        ' set imprint generator based on recognizer
        templateMatchingCommand.ImageImprintGenerator = New Vintasoft.Imaging.FormsProcessing.TemplateMatching.ImageImprintGeneratorCommand(markRecognizerCommand)
        ' add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages)
        ' execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage)
        ' return result
        Return templateMatchingCommand.Result
    End Function
    


    Выровнивание изображения заполненной формы в соответствии с шаблоном формы

    После идентификации изображения заполненной формы может потребоваться выровнять изображение заполненной формы по шаблону формы. Это можно сделать с помощью класса TemplateAligningCommand.

    Вот C#/VB.NET код, демонстрирующий, как идентифицировать изображение заполненной формы и выровнять изображение заполненной формы по шаблону формы.
    /// <summary>
    /// Identifies and aligns the image.
    /// </summary>
    /// <param name="templateImages">The template images.</param>
    /// <param name="testImage">The test image.</param>
    public static void IdentifyAndAlign(
        Vintasoft.Imaging.VintasoftImage[] templateImages, 
        Vintasoft.Imaging.VintasoftImage testImage)
    {
        // create template matching command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand templateMatchingCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand();
        // add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages);
        // execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage);
        // create template aligning command
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateAligningCommand templateAligningCommand = 
            new Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateAligningCommand();
        // set matching result
        templateAligningCommand.CompareResult = templateMatchingCommand.Result.ImageCompareResult;
        // execute template aligning
        templateAligningCommand.ExecuteInPlace(testImage);
    }
    
    ''' <summary>
    ''' Identifies and aligns the image.
    ''' </summary>
    ''' <param name="templateImages">The template images.</param>
    ''' <param name="testImage">The test image.</param>
    Public Shared Sub IdentifyAndAlign(templateImages As Vintasoft.Imaging.VintasoftImage(), testImage As Vintasoft.Imaging.VintasoftImage)
        ' create template matching command
        Dim templateMatchingCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateMatchingCommand()
        ' add template images
        templateMatchingCommand.TemplateImages.AddRange(templateImages)
        ' execute template matching
        templateMatchingCommand.ExecuteInPlace(testImage)
        ' create template aligning command
        Dim templateAligningCommand As New Vintasoft.Imaging.FormsProcessing.TemplateMatching.TemplateAligningCommand()
        ' set matching result
        templateAligningCommand.CompareResult = templateMatchingCommand.Result.ImageCompareResult
        ' execute template aligning
        templateAligningCommand.ExecuteInPlace(testImage)
    End Sub