データマトリックス認識

Namespace: FVIL.DM
Assembly: FVILbasic (in FVILbasic.dll) Version: 3.1.0.0 (3.1.0.17)

Syntax

C#
[SerializableAttribute]
public class CFviDM : CFviImageParser
Visual Basic
<SerializableAttribute>
Public Class CFviDM
	Inherits CFviImageParser

Remarks

データマトリックスをデコードするクラスです。


要求する入出力画像数:
項目定数
入力画像1SrcImageCount フィールド
出力画像0DstImageCount フィールド

処理対象画像の条件:

処理対象の画像は下記の条件を満たしている必要が有ります。

  • 画像種別が FVIL.ImageType.UC8 である事
  • チャネル数が 1 である事

初期値と範囲:
プロパティ初期値範囲説明
ParamCFviDMParam のインスタンスCFviDMParam のインスタンス
※インスタンスの差し替えは行えません。設定した場合は内容を複製します。
データマトリックス認識パラメータ
ResultCFviDMResult のインスタンスCFviDMResult のインスタンス
データマトリックス認識結果

処理対象画像の有効性検査と有効化:
  • 入力画像の有効性検査
    このクラスの CheckValidity(CFviImage) 関数で入力画像の有効性を検査できます。 この関数はスタティックメンバですので、このクラスのインスタンスを生成せずに直接呼び出す事ができます。
  • 入出力画像の整合性検査
    このクラスの IsValid()()()() メソッドで入出力画像の整合性を検査できます。 このメソッドが false を返す場合は、前述の処理対象画像の条件を満たしていない為、 実行できない事を意味します。
  • 出力画像の有効化
    このクラスでは有効化はサポートしていません。
    Validate()()()() または Validate(Int32) メソッドを実行した場合は常に例外を発行します。

関連する FIE 関数:

fnFIE_dm_alloc_obj
fnFIE_dm_execute
fnFIE_dm_set_slant_allowance
fnFIE_dm_get_slant_allowance
fnFIE_dm_set_size_minmax
fnFIE_dm_get_size_minmax
fnFIE_dm_set_cellwidth_minmax
fnFIE_dm_get_cellwidth_minmax
fnFIE_dm_set_minvar
fnFIE_dm_get_minvar
fnFIE_dm_set_color
fnFIE_dm_get_color

Examples

ソースコード:
C# Copy imageCopy
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using fvalgcli;

namespace User.SampleCode
{
    public partial class DM
    {
        [FvPluginExecute]
        public void Execute()
        {
            // 1) インスタンスの準備.
            FVIL.Data.CFviImage src = new FVIL.Data.CFviImage(Defs.TestImageDir + "/dm_kanjibase256.bmp");
            FVIL.DM.CFviDMResult result = new FVIL.DM.CFviDMResult();
            FVIL.DM.CFviDM parser = new FVIL.DM.CFviDM(src, result);

            // 2) 処理対象画像の有効性検査.
            if (FVIL.ErrorCode._SUCCESS != FVIL.DM.CFviDM.CheckValidity(src)) return;

            try
            {
                // 3) パラメータ設定.
                parser.Param.CellWidthMax = 15;
                parser.Param.CellWidthMin = 4;
                parser.Param.ColorType = FVIL.DM.ColorType.Dark;
                parser.Param.MinVar = 1000;
                parser.Param.SizeMax = 64;
                parser.Param.SizeMin = 10;
                parser.Param.SlantAllowance = 10;

                // 4) 画像処理実行.
                FVIL.CFviTimeCounter timer = new FVIL.CFviTimeCounter();
                timer.Start();
                parser.Execute();
                double msec = timer.Stop();

                Console.WriteLine("DM");
                Console.WriteLine("execute. {0} msec", msec.ToString("0.###"));
                Console.WriteLine("Result.Count = {0}", parser.Result.Count);

                FVIL.DM.CFviDMData data0 = new FVIL.DM.CFviDMData(parser.Result[0]);
                Console.WriteLine("DMData");
                Console.WriteLine("      Index = {0}", data0.Index);
                Console.WriteLine("      Center = ({0:f},{1:f})", data0.Center.X, data0.Center.Y);
                Console.WriteLine("      (Width, Height) = ({0:f},{1:f})", data0.Size.Width, data0.Size.Height);
                Console.WriteLine("      CellWidth = {0:f}", data0.CellWidth);
                Console.WriteLine("      CellHeight = {0:f}", data0.CellHeight);
                Console.WriteLine("      Text = {0}", data0.Text);

                // E) 確認用.
                SaveImage(parser);
            }
            catch (System.Exception ex)
            {
                Assert.Fail("{0}", ex.Message);
            }
            finally
            {
                src.Dispose();
                result.Dispose();
                parser.Dispose();
            }
        }

        /// <summary>
        /// 確認用.
        /// </summary>
        /// <param name="parser"></param>
        private void SaveImage(FVIL.DM.CFviDM parser)
        {
            FVIL.Data.CFviImage src = parser.SrcImages[0];

            // 画像表示の準備.
            FVIL.GDI.CFviDisplay display = new FVIL.GDI.CFviDisplay();
            display.Image = src;
            display.DisplayRect = src.Window;

            // オーバレイの生成.
            FVIL.GDI.CFviOverlay pOverlay0 = new FVIL.GDI.CFviOverlay();
            pOverlay0.Enable = true;
            pOverlay0.Scaling = true;
            pOverlay0.ScalingMode = FVIL.GDI.ScalingMode.Center;
            display.Overlays.Add(pOverlay0);

            // 解析結果の描画.
            FVIL.DM.CFviDMData data = new FVIL.DM.CFviDMData();

            foreach (object item in parser.Result)
            {
                data.CopyFrom(item);

                // 描画用: 複合図形.
                FVIL.GDI.CFviGdiCluster _cluster = new FVIL.GDI.CFviGdiCluster();
                {
                    // : 中心.
                    FVIL.GDI.CFviGdiPoint _center = new FVIL.GDI.CFviGdiPoint();
                    _center.CopyFrom(data.Center);
                    _center.Size = new System.Drawing.Size(5, 3);
                    _center.Pen.Color = Color.FromArgb(0xFF, 0x00, 0x00);
                    _center.Style = FVIL.GDI.FigureStyle.Cross;

                    // : CellOnes.
                    FVIL.GDI.CFviGdiPoints _cellOnes = new FVIL.GDI.CFviGdiPoints();
                    _cellOnes.ConvertFrom(data.GetCellOnesAsDPNT_T_ARRAY());
                    _cellOnes.Pen.Color = Color.FromArgb(0xFF, 0x00, 0xFF);
                    _cellOnes.Style = FVIL.GDI.FigureStyle.Square;
                    _cellOnes.Size = new FVIL.Data.CFviPoint(0.5, 0.5);

                    // : DelimitingPts.
                    FVIL.GDI.CFviGdiPolyline _delimitingPts = new FVIL.GDI.CFviGdiPolyline();
                    _delimitingPts.CopyFrom(data.GetCornerAsCFviPolyline());
                    _delimitingPts.Pen.Color = Color.FromArgb(0x00, 0x00, 0xFF);
                    _delimitingPts.FillAlpha = 0x3F;
                    _delimitingPts.FillColor = Color.FromArgb(0x00, 0x00, 0xFF);
                    _delimitingPts.FillEnable = true;

                    // 複合図形.
                    _cluster.Figures.Clear();
                    _cluster.Figures.Add(_center);
                    _cluster.Figures.Add(_cellOnes);
                    _cluster.Figures.Add(_delimitingPts);

                    // --- 複合図形の基準位置を設定する.
                    _cluster.BasePosition = _center.ToCFviPoint();    // 中心.
                }

                // 追加.
                pOverlay0.Figures.Add(_cluster);
            }

            // 保存.
            using (FVIL.Data.CFviImage canvas = new FVIL.Data.CFviImage())
            {
                display.SaveImage(canvas);
                canvas.Save(Defs.ResultDir + "/DM.Execute.png");
            }
        }
    }
}


Visual Basic Copy imageCopy
Imports System.Collections.Generic
Imports System.Text
Imports System.Drawing
Imports fvalgcli

Namespace SampleCode
    Public Partial Class DM
        <FvPluginExecute> _
        Public Sub Execute()
            ' 1) インスタンスの準備.
            Dim src As New FVIL.Data.CFviImage(Defs.TestImageDir & "\dm_kanjibase256.bmp")
            Dim result As New FVIL.DM.CFviDMResult()
            Dim parser As New FVIL.DM.CFviDM(src, result)

            ' 2) 処理対象画像の有効性検査.
            If FVIL.ErrorCode._SUCCESS <> FVIL.DM.CFviDM.CheckValidity(src) Then
                Return
            End If

            Try
                ' 3) パラメータ設定.
                parser.Param.CellWidthMax = 15
                parser.Param.CellWidthMin = 4
                parser.Param.ColorType = FVIL.DM.ColorType.Dark
                parser.Param.MinVar = 1000
                parser.Param.SizeMax = 64
                parser.Param.SizeMin = 10
                parser.Param.SlantAllowance = 10

                ' 4) 画像処理実行.
                Dim timer As New FVIL.CFviTimeCounter()
                timer.Start()
                parser.Execute()
                Dim msec As Double = timer.[Stop]()

                Console.WriteLine("DM")
                Console.WriteLine("execute. {0} msec", msec.ToString("0.###"))
                Console.WriteLine("Result.Count = {0}", parser.Result.Count)

                Dim data0 As New FVIL.DM.CFviDMData(parser.Result(0))
                Console.WriteLine("DMData")
                Console.WriteLine("      Index = {0}", data0.Index)
                Console.WriteLine("      Center = ({0:f},{1:f})", data0.Center.X, data0.Center.Y)
                Console.WriteLine("      (Width, Height) = ({0:f},{1:f})", data0.Size.Width, data0.Size.Height)
                Console.WriteLine("      CellWidth = {0:f}", data0.CellWidth)
                Console.WriteLine("      CellHeight = {0:f}", data0.CellHeight)
                Console.WriteLine("      Text = {0}", data0.Text)

                ' E) 確認用.
                SaveImage(parser)
            Catch ex As System.Exception
                Assert.Fail("{0}", ex.Message)
            Finally
                src.Dispose()
                result.Dispose()
                parser.Dispose()
            End Try
        End Sub

        ''' <summary>
        ''' 確認用.
        ''' </summary>
        ''' <param name="parser"></param>
        Private Sub SaveImage(parser As FVIL.DM.CFviDM)
            Dim src As FVIL.Data.CFviImage = parser.SrcImages(0)

            ' 画像表示の準備.
            Dim display As New FVIL.GDI.CFviDisplay()
            display.Image = src
            display.DisplayRect = src.Window

            ' オーバレイの生成.
            Dim pOverlay0 As New FVIL.GDI.CFviOverlay()
            pOverlay0.Enable = True
            pOverlay0.Scaling = True
            pOverlay0.ScalingMode = FVIL.GDI.ScalingMode.Center
            display.Overlays.Add(pOverlay0)

            ' 解析結果の描画.
            Dim data As New FVIL.DM.CFviDMData()

            For Each item As Object In parser.Result
                data.CopyFrom(item)

                ' 描画用: 複合図形.
                Dim _cluster As New FVIL.GDI.CFviGdiCluster()
                If True Then
                    ' : 中心.
                    Dim _center As New FVIL.GDI.CFviGdiPoint()
                    _center.CopyFrom(data.Center)
                    _center.Size = New System.Drawing.Size(5, 3)
                    _center.Pen.Color = Color.FromArgb(&Hff, &H0, &H0)
                    _center.Style = FVIL.GDI.FigureStyle.Cross

                    ' : CellOnes.
                    Dim _cellOnes As New FVIL.GDI.CFviGdiPoints()
                    _cellOnes.ConvertFrom(data.GetCellOnesAsDPNT_T_ARRAY())
                    _cellOnes.Pen.Color = Color.FromArgb(&Hff, &H0, &Hff)
                    _cellOnes.Style = FVIL.GDI.FigureStyle.Square
                    _cellOnes.Size = New FVIL.Data.CFviPoint(0.5, 0.5)

                    ' : DelimitingPts.
                    Dim _delimitingPts As New FVIL.GDI.CFviGdiPolyline()
                    _delimitingPts.CopyFrom(data.GetCornerAsCFviPolyline())
                    _delimitingPts.Pen.Color = Color.FromArgb(&H0, &H0, &Hff)
                    _delimitingPts.FillAlpha = &H3f
                    _delimitingPts.FillColor = Color.FromArgb(&H0, &H0, &Hff)
                    _delimitingPts.FillEnable = True

                    ' 複合図形.
                    _cluster.Figures.Clear()
                    _cluster.Figures.Add(_center)
                    _cluster.Figures.Add(_cellOnes)
                    _cluster.Figures.Add(_delimitingPts)

                    ' --- 複合図形の基準位置を設定する.
                    _cluster.BasePosition = _center.ToCFviPoint()
                    ' 中心.
                End If

                ' 追加.
                pOverlay0.Figures.Add(_cluster)
            Next

            ' 保存.
            Using canvas As New FVIL.Data.CFviImage()
                display.SaveImage(canvas)
                canvas.Save(Defs.ResultDir & "/DM.Execute.png")
            End Using
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.DM..::..CFviDM

See Also