VintaSoft Imaging .NET SDK 15.1: Documentation for .NET developer
Vintasoft.Imaging.FormsProcessing.TemplateMatching Namespace / KeyZoneRecognizerCommand Class
Members Object Syntax Example Hierarchy Requirements SeeAlso
In This Topic
KeyZoneRecognizerCommand Class
In This Topic
Recognizes key zones on an image.
Object Model
ProcessingCommandBase RegionOfInterest ProcessingCommandResults KeyZoneRecognizerCommand
Syntax
'Declaration

Public MustInherit Class KeyZoneRecognizerCommand
   Inherits Vintasoft.Imaging.ImageProcessing.ProcessingCommandWithRegion

public abstract class KeyZoneRecognizerCommand : Vintasoft.Imaging.ImageProcessing.ProcessingCommandWithRegion

Example

This C#/VB.NET code shows how to create custom key zone recognizer based on barcode recognition.


''' <summary>
''' Represents key zone based on recognized barcode.
''' </summary>
Public Class BarcodeKeyZone
    Inherits Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone

    #Region "Constructors"

    ''' <summary>
    ''' Initializes a new instance of the <see cref="BarcodeKeyZone"/> class.
    ''' </summary>
    ''' <param name="barcodeInfo">The barcode information.</param>
    Public Sub New(barcodeInfo As Vintasoft.Barcode.IBarcodeInfo)
        MyBase.New()
        _barcodeInfo = barcodeInfo
        If TypeOf barcodeInfo Is Vintasoft.Barcode.BarcodeInfo.AztecInfo Then
            ' get the barcode center from barcode info
            Dim bulleyeCenter As Vintasoft.Primitives.VintasoftPointF = DirectCast(barcodeInfo, Vintasoft.Barcode.BarcodeInfo.AztecInfo).BulleyeCenter
            _location = New System.Drawing.PointF(bulleyeCenter.X, bulleyeCenter.Y)
        Else
            ' calculate the barcode center

            _location = System.Drawing.PointF.Empty
            Dim points As Vintasoft.Primitives.VintasoftPointI() = barcodeInfo.Region.GetPoints()
            For i As Integer = 0 To points.Length - 1
                _location.X += points(i).X
                _location.Y += points(i).Y
            Next
            _location.X /= points.Length
            _location.Y /= points.Length
        End If
    End Sub

    ''' <summary>
    ''' Initializes a new instance of the <see cref="BarcodeKeyZone"/> class.
    ''' </summary>
    ''' <param name="barcodeInfo">The barcode information.</param>
    ''' <param name="location">The location.</param>
    Private Sub New(barcodeInfo As Vintasoft.Barcode.IBarcodeInfo, location As System.Drawing.PointF)
        MyBase.New()
        _barcodeInfo = barcodeInfo
        _location = location
    End Sub

    #End Region



    #Region "Properties"

    Private _location As System.Drawing.PointF
    ''' <summary>
    ''' Gets the location of the key zone on the image.
    ''' </summary>
    Public Overrides ReadOnly Property Location() As System.Drawing.PointF
        Get
            Return _location
        End Get
    End Property

    Private _barcodeInfo As Vintasoft.Barcode.IBarcodeInfo
    ''' <summary>
    ''' Gets the barcode information.
    ''' </summary>
    Public ReadOnly Property BarcodeInfo() As Vintasoft.Barcode.IBarcodeInfo
        Get
            Return _barcodeInfo
        End Get
    End Property

    #End Region



    #Region "Methods"

    ''' <summary>
    ''' Applies a transformation to the key zone.
    ''' </summary>
    ''' <param name="m">The <see cref="Vintasoft.Imaging.AffineMatrix" />
    ''' that specifies the transformation to apply.</param>
    Public Overrides Sub Transform(m As Vintasoft.Imaging.AffineMatrix)
        If m Is Nothing Then
            Return
        End If
        _location = Vintasoft.Imaging.PointFAffineTransform.TransformPoint(m, _location)
    End Sub

    ''' <summary>
    ''' Returns the similarity of specified <see cref="Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone" />
    ''' and the current key zone.
    ''' </summary>
    ''' <param name="zone">The <see cref="Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone" />
    ''' to compare with.</param>
    ''' <returns>
    ''' The similarity of specified keyzone and the current key zone in range from 0 to 1.<br />
    ''' 0 means that zones are absolutely NOT similar;
    ''' 1 means that zones are perfectly similar.
    ''' </returns>
    Public Overrides Function CalculateSimilarity(zone As Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone) As Double
        Dim barcodeZone As BarcodeKeyZone = TryCast(zone, BarcodeKeyZone)
        If barcodeZone Is Nothing Then
            Return 0
        End If

        If barcodeZone.BarcodeInfo.Value = BarcodeInfo.Value AndAlso barcodeZone.BarcodeInfo.BarcodeType = BarcodeInfo.BarcodeType Then
            Return 1
        End If

        Return 0
    End Function

    ''' <summary>
    ''' Creates a new object that is a copy of the current instance.
    ''' </summary>
    ''' <returns>A new object that is a copy of this instance.</returns>
    Public Overrides Function Clone() As Object
        Return New BarcodeKeyZone(BarcodeInfo, Location)
    End Function

    #End Region

End Class
''' <summary>
''' Recognizes key zones, based on barcodes, on an image.
''' </summary>
Public Class BarcodeKeyZoneRecognizerCommand
    Inherits Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZoneRecognizerCommand

    #Region "Constructors"

    ''' <summary>
    ''' Initializes a new instance of the <see cref="BarcodeKeyZoneRecognizerCommand"/> class.
    ''' </summary>
    Public Sub New()
        MyBase.New()
        ' set default barcode reader settings
        Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Aztec
        Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal Or Vintasoft.Barcode.ScanDirection.Vertical
        Settings.AutomaticRecognition = True
        ' 3 barcode by page
        Settings.ExpectedBarcodes = 3
    End Sub

    #End Region



    #Region "Properties"

    Shared _supportedNativePixelFormats As System.Collections.ObjectModel.ReadOnlyCollection(Of Vintasoft.Imaging.PixelFormat)
    ''' <summary>
    ''' Gets a list of supported native pixel formats for this processing command.
    ''' </summary>
    Public Overrides ReadOnly Property SupportedNativePixelFormats() As System.Collections.ObjectModel.ReadOnlyCollection(Of Vintasoft.Imaging.PixelFormat)
        Get
            If _supportedNativePixelFormats Is Nothing Then
                Dim supportedNativePixelFormats__1 As New System.Collections.Generic.List(Of Vintasoft.Imaging.PixelFormat)()
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.BlackWhite)
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.Bgr24)
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.Bgr32)
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.Indexed1)
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.Indexed8)
                supportedNativePixelFormats__1.Add(Vintasoft.Imaging.PixelFormat.Gray8)
                _supportedNativePixelFormats = supportedNativePixelFormats__1.AsReadOnly()
            End If
            Return _supportedNativePixelFormats
        End Get
    End Property

    Private _settings As New Vintasoft.Barcode.ReaderSettings()
    ''' <summary>
    ''' Gets or sets the barcode reader settings.
    ''' </summary>
    ''' <value>
    ''' The reader settings.
    ''' </value>
    Public Property Settings() As Vintasoft.Barcode.ReaderSettings
        Get
            Return _settings
        End Get
        Set
            If value Is Nothing Then
                Throw New System.ArgumentNullException()
            End If
            _settings = value
        End Set
    End Property

    #End Region



    #Region "Methods"

    ''' <summary>
    ''' Creates a new <see cref="BarcodeKeyZoneRecognizerCommand"/> that is a copy of the current
    ''' instance.
    ''' </summary>
    ''' <returns>A new <see cref="BarcodeKeyZoneRecognizerCommand"/> that is a copy of this
    ''' instance.</returns>
    Public Overrides Function Clone() As Object
        Dim recognizer As New BarcodeKeyZoneRecognizerCommand()
        recognizer.IsNested = IsNested
        recognizer.RegionOfInterest = RegionOfInterest
        recognizer.Settings = Settings.Clone()
        Return recognizer
    End Function


    ''' <summary>
    ''' Recognizes key zones in the specified rectangle of the specified image.
    ''' </summary>
    ''' <param name="image">The image where key zones must be searched.</param>
    ''' <param name="rect">The region of interest on image.</param>
    ''' <returns>An array of recognized key zones.</returns>
    Protected Overrides Function Recognize(image As Vintasoft.Imaging.VintasoftImage, rect As System.Drawing.Rectangle) As Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone()
        Dim reader As New Vintasoft.Barcode.BarcodeReader()
        reader.Settings = Settings.Clone()
        reader.Settings.ScanRectangle = New Vintasoft.Primitives.VintasoftRectI(rect.X, rect.Y, rect.Width, rect.Height)
        Using bitmap As Vintasoft.Imaging.VintasoftBitmap = image.GetAsVintasoftBitmap()
            Dim infos As Vintasoft.Barcode.IBarcodeInfo() = reader.ReadBarcodes(bitmap)
            Dim result As Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone() = New Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone(infos.Length - 1) {}
            For i As Integer = 0 To infos.Length - 1
                result(i) = New BarcodeKeyZone(infos(i))
            Next
            Return result
        End Using
    End Function

    #End Region

End Class


/// <summary>
/// Represents key zone based on recognized barcode.
/// </summary>
public class BarcodeKeyZone : Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone
{

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="BarcodeKeyZone"/> class.
    /// </summary>
    /// <param name="barcodeInfo">The barcode information.</param>
    public BarcodeKeyZone(Vintasoft.Barcode.IBarcodeInfo barcodeInfo)
        : base()
    {
        _barcodeInfo = barcodeInfo;
        if (barcodeInfo is Vintasoft.Barcode.BarcodeInfo.AztecInfo)
        {
            // get the barcode center from barcode info
            Vintasoft.Primitives.VintasoftPointF bulleyeCenter = ((Vintasoft.Barcode.BarcodeInfo.AztecInfo)barcodeInfo).BulleyeCenter;
            _location = new System.Drawing.PointF(bulleyeCenter.X, bulleyeCenter.Y);
        }
        else
        {
            // calculate the barcode center

            _location = System.Drawing.PointF.Empty;
            Vintasoft.Primitives.VintasoftPointI[] points = barcodeInfo.Region.GetPoints();
            for (int i = 0; i < points.Length; i++)
            {
                _location.X += points[i].X;
                _location.Y += points[i].Y;
            }
            _location.X /= points.Length;
            _location.Y /= points.Length;
        }
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="BarcodeKeyZone"/> class.
    /// </summary>
    /// <param name="barcodeInfo">The barcode information.</param>
    /// <param name="location">The location.</param>
    private BarcodeKeyZone(Vintasoft.Barcode.IBarcodeInfo barcodeInfo,
        System.Drawing.PointF location)
        : base()
    {
        _barcodeInfo = barcodeInfo;
        _location = location;
    }

    #endregion



    #region Properties

    System.Drawing.PointF _location;
    /// <summary>
    /// Gets the location of the key zone on the image.
    /// </summary>
    public override System.Drawing.PointF Location
    {
        get
        {
            return _location;
        }
    }

    Vintasoft.Barcode.IBarcodeInfo _barcodeInfo;
    /// <summary>
    /// Gets the barcode information.
    /// </summary>
    public Vintasoft.Barcode.IBarcodeInfo BarcodeInfo
    {
        get
        {
            return _barcodeInfo;
        }
    }

    #endregion



    #region Methods

    /// <summary>
    /// Applies a transformation to the key zone.
    /// </summary>
    /// <param name="m">The <see cref="Vintasoft.Imaging.AffineMatrix" />
    /// that specifies the transformation to apply.</param>
    public override void Transform(Vintasoft.Imaging.AffineMatrix m)
    {
        if (m == null)
            return;
        _location = Vintasoft.Imaging.PointFAffineTransform.TransformPoint(m, _location);
    }

    /// <summary>
    /// Returns the similarity of specified <see cref="Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone" />
    /// and the current key zone.
    /// </summary>
    /// <param name="zone">The <see cref="Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone" />
    /// to compare with.</param>
    /// <returns>
    /// The similarity of specified keyzone and the current key zone in range from 0 to 1.<br />
    /// 0 means that zones are absolutely NOT similar;
    /// 1 means that zones are perfectly similar.
    /// </returns>
    public override double CalculateSimilarity(
        Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone zone)
    {
        BarcodeKeyZone barcodeZone = zone as BarcodeKeyZone;
        if (barcodeZone == null)
            return 0;

        if (barcodeZone.BarcodeInfo.Value == BarcodeInfo.Value &&
            barcodeZone.BarcodeInfo.BarcodeType == BarcodeInfo.BarcodeType)
            return 1;

        return 0;
    }

    /// <summary>
    /// Creates a new object that is a copy of the current instance.
    /// </summary>
    /// <returns>A new object that is a copy of this instance.</returns>
    public override object Clone()
    {
        return new BarcodeKeyZone(BarcodeInfo, Location);
    }

    #endregion

}
/// <summary>
/// Recognizes key zones, based on barcodes, on an image.
/// </summary>
public class BarcodeKeyZoneRecognizerCommand :
    Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZoneRecognizerCommand
{

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the <see cref="BarcodeKeyZoneRecognizerCommand"/> class.
    /// </summary>
    public BarcodeKeyZoneRecognizerCommand()
        : base()
    {
        // set default barcode reader settings
        Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Aztec;
        Settings.ScanDirection =
            Vintasoft.Barcode.ScanDirection.Horizontal | Vintasoft.Barcode.ScanDirection.Vertical;
        Settings.AutomaticRecognition = true;
        // 3 barcode by page
        Settings.ExpectedBarcodes = 3;
    }

    #endregion



    #region Properties

    static System.Collections.ObjectModel.ReadOnlyCollection<Vintasoft.Imaging.PixelFormat> _supportedNativePixelFormats;
    /// <summary>
    /// Gets a list of supported native pixel formats for this processing command.
    /// </summary>
    public override System.Collections.ObjectModel.ReadOnlyCollection<Vintasoft.Imaging.PixelFormat> SupportedNativePixelFormats
    {
        get
        {
            if (_supportedNativePixelFormats == null)
            {
                System.Collections.Generic.List<Vintasoft.Imaging.PixelFormat> supportedNativePixelFormats =
                    new System.Collections.Generic.List<Vintasoft.Imaging.PixelFormat>();
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.BlackWhite);
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.Bgr24);
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.Bgr32);
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.Indexed1);
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.Indexed8);
                supportedNativePixelFormats.Add(Vintasoft.Imaging.PixelFormat.Gray8);
                _supportedNativePixelFormats = supportedNativePixelFormats.AsReadOnly();
            }
            return _supportedNativePixelFormats;
        }
    }

    Vintasoft.Barcode.ReaderSettings _settings = new Vintasoft.Barcode.ReaderSettings();
    /// <summary>
    /// Gets or sets the barcode reader settings.
    /// </summary>
    /// <value>
    /// The reader settings.
    /// </value>
    public Vintasoft.Barcode.ReaderSettings Settings
    {
        get
        {
            return _settings;
        }
        set
        {
            if (value == null)
                throw new System.ArgumentNullException();
            _settings = value;
        }
    }

    #endregion



    #region Methods

    /// <summary>
    /// Creates a new <see cref="BarcodeKeyZoneRecognizerCommand"/> that is a copy of the current
    /// instance.
    /// </summary>
    /// <returns>A new <see cref="BarcodeKeyZoneRecognizerCommand"/> that is a copy of this
    /// instance.</returns>
    public override object Clone()
    {
        BarcodeKeyZoneRecognizerCommand recognizer = new BarcodeKeyZoneRecognizerCommand();
        recognizer.IsNested = IsNested;
        recognizer.RegionOfInterest = RegionOfInterest;
        recognizer.Settings = Settings.Clone();
        return recognizer;
    }


    /// <summary>
    /// Recognizes key zones in the specified rectangle of the specified image.
    /// </summary>
    /// <param name="image">The image where key zones must be searched.</param>
    /// <param name="rect">The region of interest on image.</param>
    /// <returns>An array of recognized key zones.</returns>
    protected override Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone[] Recognize(
        Vintasoft.Imaging.VintasoftImage image,
        System.Drawing.Rectangle rect)
    {
        Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader();
        reader.Settings = Settings.Clone();
        reader.Settings.ScanRectangle = new Vintasoft.Primitives.VintasoftRectI(rect.X, rect.Y, rect.Width, rect.Height);
        using (Vintasoft.Imaging.VintasoftBitmap bitmap = image.GetAsVintasoftBitmap())
        {
            Vintasoft.Barcode.IBarcodeInfo[] infos = reader.ReadBarcodes(bitmap);
            Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone[] result =
                new Vintasoft.Imaging.FormsProcessing.TemplateMatching.KeyZone[infos.Length];
            for (int i = 0; i < infos.Length; i++)
                result[i] = new BarcodeKeyZone(infos[i]);
            return result;
        }
    }

    #endregion

}

Inheritance Hierarchy
Requirements

Target Platforms: .NET 10; .NET 9; .NET 8; .NET 7; .NET 6; .NET Framework 4.8, 4.7, 4.6, 4.5, 4.0, 3.5

See Also