QRコード認識

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

Syntax

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

Remarks

QRコードをデコードするクラスです。


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

処理対象画像の条件:

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

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

初期値と範囲:
プロパティ初期値範囲説明
ParamCFviQRParam のインスタンスCFviQRParam のインスタンス
※インスタンスの差し替えは行えません。設定した場合は内容を複製します。
QRコード認識パラメータ
ResultCFviQRResult のインスタンスCFviQRResult のインスタンス
QRコード認識結果

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

関連する FIE 関数:

fnFIE_qr_alloc_obj
fnFIE_qr_execute
fnFIE_qr_set_binwinsize
fnFIE_qr_get_binwinsize
fnFIE_qr_set_minvar
fnFIE_qr_get_minvar
fnFIE_qr_set_effortlevel
fnFIE_qr_get_effortlevel
fnFIE_qr_set_binarize_method
fnFIE_qr_get_binarize_method

Examples

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

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

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

            try
            {
                // 3) パラメータ設定.
                parser.Param.BinMethod = FVIL.QR.BinMethod.Average;
                parser.Param.BinThreshold = 128;
                parser.Param.EffortLevel = FVIL.QR.EffortLevel.Maximum;
                parser.Param.MinVar = 1000;
                parser.Param.WindowSize = 11;

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

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

                FVIL.QR.CFviQRData data0 = new FVIL.QR.CFviQRData(parser.Result[0]);
                Console.WriteLine("QRData");
                Console.WriteLine("      Index = {0}", data0.Index);
                Console.WriteLine("      Center = ({0:f},{1:f})", data0.Center.X, data0.Center.Y);
                Console.WriteLine("      Size = {0:f}", data0.Size);
                Console.WriteLine("      MinCellWidth = {0:f}", data0.MinCellWidth);
                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.QR.CFviQR 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.QR.CFviQRData data = new FVIL.QR.CFviQRData();

            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;

                    // : _appts.
                    FVIL.GDI.CFviGdiPoints _appts = new FVIL.GDI.CFviGdiPoints();
                    _appts.ConvertFrom(data.GetApptsAsDPNT_T_ARRAY());
                    _appts.Pen.Color = Color.FromArgb(0x00, 0xFF, 0xFF);
                    _appts.Style = FVIL.GDI.FigureStyle.Round;
                    _appts.Size = new FVIL.Data.CFviPoint(3.0, 3.0);

                    // : 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.GetDelimitingPtsAsCFviPolyline());
                    _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(_appts);
                    _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 + "/QR.Execute.png");
            }
        }
    }
}


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

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

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

            Try
                ' 3) パラメータ設定.
                parser.Param.BinMethod = FVIL.QR.BinMethod.Average
                parser.Param.BinThreshold = 128
                parser.Param.EffortLevel = FVIL.QR.EffortLevel.Maximum
                parser.Param.MinVar = 1000
                parser.Param.WindowSize = 11

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

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

                Dim data0 As New FVIL.QR.CFviQRData(parser.Result(0))
                Console.WriteLine("QRData")
                Console.WriteLine("      Index = {0}", data0.Index)
                Console.WriteLine("      Center = ({0:f},{1:f})", data0.Center.X, data0.Center.Y)
                Console.WriteLine("      Size = {0:f}", data0.Size)
                Console.WriteLine("      MinCellWidth = {0:f}", data0.MinCellWidth)
                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.QR.CFviQR)
            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.QR.CFviQRData()

            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

                    ' : _appts.
                    Dim _appts As New FVIL.GDI.CFviGdiPoints()
                    _appts.ConvertFrom(data.GetApptsAsDPNT_T_ARRAY())
                    _appts.Pen.Color = Color.FromArgb(&H0, &Hff, &Hff)
                    _appts.Style = FVIL.GDI.FigureStyle.Round
                    _appts.Size = New FVIL.Data.CFviPoint(3.0, 3.0)

                    ' : 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.GetDelimitingPtsAsCFviPolyline())
                    _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(_appts)
                    _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 & "/QR.Execute.png")
            End Using
        End Sub
    End Class
End Namespace

Inheritance Hierarchy

System..::..Object
FVIL..::..CFviObject
FVIL..::..CFviImageParser
FVIL.QR..::..CFviQR

See Also