QRコード認識
Namespace: FVIL.QRAssembly: 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コードをデコードするクラスです。
要求する入出力画像数:
項目 | 数 | 定数 |
---|---|---|
入力画像 | 1 | SrcImageCount フィールド |
出力画像 | 0 | DstImageCount フィールド |
処理対象画像の条件:
処理対象の画像は下記の条件を満たしている必要が有ります。
- 画像種別が FVIL.ImageType.UC8 である事
- チャネル数が 1 である事
初期値と範囲:
プロパティ | 初期値 | 範囲 | 説明 |
---|---|---|---|
Param | CFviQRParam のインスタンス | CFviQRParam のインスタンス ※インスタンスの差し替えは行えません。設定した場合は内容を複製します。 | QRコード認識パラメータ |
Result | CFviQRResult のインスタンス | 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 |
---|---|
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 |
---|---|
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 |