QRコード認識
[2Dコード認識]


説明

QRコードとは

QRコードは、マトリックス型二次元データコードの一種で、1994年にデンソーウェーブ(開発当時は株式会社デンソーの一部門)によって開発されました。 バーコードが横方向にしか情報を持たないのに対して、二次元データコードであるQRコードは縦横方向に情報を持っています(fig.1)。そのため、格納できる情報量が多く、数字だけでなく英字や漢字のデータも格納できます。 なお、『QRコード』という名称はデンソーウェーブの登録商標となっており、現在はISOの国際規格として制定(ISO/IEC18004)されています。

qr_top.png

fig.1 QRコード

QRコードの構成

マトリックス型シンボルの二次元データコードであるQRコードは、セルと呼ばれる1つの要素が正方形状に並んで構成されます。各セルは1bitの情報を持ち黒と白(暗と明)で表されます(fig.2)。 1つのQRコードを構成するセルの数は、21×21セル(1型)から177×177セル(40型)まで、4セル刻みで決められています。 セルの配置については、シンボルの持つ情報を格納するデータ領域の他に、QRコードに格納されている情報に依存しない特定のパタンが配置される領域があり、主にシンボルの検出を行うために利用されます。 以下、黒いセルをQRコードのシンボルを構成する対象として説明を行います。

qr_const.png

fig.2 QRコードの構成(2型, 25×25セル)

ファインダーパタン
シンボルの位置を特定するために使われるパタンで、3×3のセルの周囲を囲うようにセルが配置されています。このパタンをQRコードシンボルの3隅に配置することによって、シンボルの位置、傾き、大きさの特徴を検出することができます。
アライメントパタン
シンボルの位置を特定する他、シンボルの歪みを補正する役割も持つパタンです。孤立したセルの周囲を囲うようにセルが配置されており、孤立したセルが存在することで、中心位置を取得する際の歪による影響を受けにくくしています。 型(サイズ)によってアライメントパタンの数も変化し、1型のシンボルにはアライメントパタンはありません。
タイミングパタン
白と黒のセルが交互に並ぶパタンで、ファインダーパタンが存在する縦横の2方向に配置されます。 位置情報のほか、歪みやセルピッチの誤差等を検出することが可能です。
クワイエットゾーン
QRコードシンボルの検出に必要な、シンボル周囲の余白スペースです。このクワイエットゾーンによりシンボル検出を正確に行うことが可能になります。一般的には4セル分のクワイエットゾーンが必要とされています。
データ領域
QRコードのシンボルの中で、以上に挙げた領域以外がシンボル自体の持つ情報(形式、型番情報、メッセージ等)が格納されるデータ領域となります。 データはある規則に基づいてセル情報として符号化されており、入力データと誤り訂正機能を実現するリードソロモン符号が配置されていますので、シンボル自体が汚れ、欠け、隠蔽等により完全でなくてもデコード(読取り)を行うことが可能です。 次の表1、2にQRコードが持つことができるデータの情報とその量、さらに誤り訂正能力をまとめます。
表1.QRコードの最大収納文字数
情報の種類 最大情報量
数字 7,089文字
英数字 4,296文字
8ビットバイト(バイナリ) 2,953文字
漢字 1,817文字
表2.誤り訂正機能
訂正レベル 復元能力
レベルL コードワードの約7%が復元可能
レベルM コードワードの約15%が復元可能
レベルQ コードワードの約25%が復元可能
レベルH コードワードの約30%が復元可能
注意:
  • QRコードシンボルの色は黒(クワイエットゾーン白)のみの対応となります。
  • QRコードシンボルの鏡映反転には対応していません。
  • ECIプロトコル適用のコードには対応していません。
  • 本ライブラリで対応しているQRコードはモデル2と呼ばれるものです。モデル1、マイクロQR等には対応していません。

サンプルコード

// エラー処理は省略しているので注意して下さい。
#include "fie.h"
#include <stdio.h>

INT main()
{
    FHANDLE fQRCObj = NULL;
    INT i;
    DOUBLE dSize;
    INT iNumOfDecodedQRs;
    INT* piDecodedQRIndex=NULL;
    CHAR* pcMessage=NULL;
    FMATRIX* pfmatDelimitingPts=NULL;
    FMATRIX* pfmatAppts=NULL;
    FMATRIX* pfmatCellOnes=NULL;
    
    FHANDLE hImg=NULL;
    
    // FIEライブラリの初期化処理
    fnFIE_setup();
    
    // 適当な8ビットグレイ画像を用意する - 画像ファイルは適宜用意すること
    fnFIE_load_bmp( "sample.bmp", &hImg, F_COLOR_IMG_TYPE_UC8 );

    // QRコードオブジェクトの生成
    fnFIE_qr_alloc_obj(&fQRCObj);
    
    //検出モードの設定
    fnFIE_qr_set_effortlevel( fQRCObj, F_QR_MAXIMUM_EFFORT );
    
    // 指定した画像に対して QRコード読み取り実行
    fnFIE_qr_execute( fQRCObj, hImg );
    
    // QRコード読み取り成功情報を参照
    piDecodedQRIndex = NULL;
    fnFIE_qr_query_decoded( fQRCObj, (const INT **)&piDecodedQRIndex, &iNumOfDecodedQRs );
    
    // QRコード情報の表示
    for( i=0; i<iNumOfDecodedQRs; i++ ){
        
        // デコードメッセージの参照
        pcMessage = NULL;
        fnFIE_qr_query_message( fQRCObj,  piDecodedQRIndex[i], (const CHAR **)&pcMessage );
        
        //メッセージ表示
        printf(pcMessage);
        
        // 必要に応じて、QRコードシンボル情報の参照を行って下さい
        pfmatDelimitingPts = NULL;
        fnFIE_qr_query_delimitingpts( fQRCObj, piDecodedQRIndex[i], &pfmatDelimitingPts );
        pfmatAppts = NULL;
        fnFIE_qr_query_appts( fQRCObj, piDecodedQRIndex[i], &pfmatAppts );
        pfmatCellOnes = NULL;
        fnFIE_qr_query_cellones( fQRCObj, piDecodedQRIndex[i], &pfmatCellOnes );
        fnFIE_qr_query_mincellwidth( fQRCObj, piDecodedQRIndex[i], &dSize );
        //...
    }

    // QR コードオブジェクト解放
    fnFIE_free_object( fQRCObj );
    
    // 画像オブジェクト解放
    fnFIE_free_object( hImg );
    
    // FIEライブラリの終了処理
    fnFIE_teardown();
    
    return 0;
}

参考文献:


列挙型

enum  f_qr_mode { F_QR_NORMAL_EFFORT = 100, F_QR_MAXIMUM_EFFORT = 101 }
 QRコード検出モード [詳細]
enum  f_qr_binarize_mode {
  F_QR_BIN_SHIFT_AVERAGE = 0, F_QR_BIN_FIX = 1,
  F_QR_BIN_DISCRIMINATION = 2, F_QR_BIN_SHIFT_AVERAGE_OFFSET = 3,
  F_QR_BIN_KITTLER = 4
}
 QRコード二値化手法 [詳細]

関数

INT FVALGAPI fnFIE_qr_alloc_obj (FHANDLE *pfQRCObj)
  [[OSS]] QRコードオブジェクトの生成
INT FVALGAPI fnFIE_qr_execute (FHANDLE fQRCObj, FHANDLE fimg)
  [[OSS]] QRコード デコード関数
INT FVALGAPI fnFIE_qr_query_decoded (FHANDLE fQRCObj, const INT **ppiDecodedQRIndex, INT *piNumOfDecodedQRs)
  [[OSS]] QRコード検出個数とインデックス配列の取得
INT FVALGAPI fnFIE_qr_query_undecoded (FHANDLE fQRCObj, const INT **ppiUndecodedQRIndex, INT *piNumOfUndecodedQRs)
  [[OSS]] デコードに失敗したQRコード個数とインデックス配列の取得
INT FVALGAPI fnFIE_qr_query_message (FHANDLE fQRCObj, INT iIndex, const CHAR **ppcMessage)
  [[OSS]] QRコードのメッセージの参照
INT FVALGAPI fnFIE_qr_query_center (FHANDLE fQRCObj, INT iIndex, DOUBLE *pdCenterX, DOUBLE *pdCenterY)
  [[OSS]] 読み取りに成功したQRコードの中心位置を取得
INT FVALGAPI fnFIE_qr_query_size (FHANDLE fQRCObj, INT iIndex, INT *piQRSize)
  [[OSS]] 位置検出したQRコードのサイズの取得
INT FVALGAPI fnFIE_qr_query_mincellwidth (FHANDLE fQRCObj, INT iIndex, DOUBLE *pdMinCellWidth)
  [[OSS]] 検出したQRコードの最小セルサイズの取得
INT FVALGAPI fnFIE_qr_query_appts (FHANDLE fQRCObj, INT iIndex, FMATRIX **ppfmatAPPos)
  [[OSS]] 読み取りに成功したQRコードのファインダーパタン、アライメントパタンの中心位置の参照
INT FVALGAPI fnFIE_qr_query_cellones (FHANDLE fQRCObj, INT iIndex, FMATRIX **ppfmatCellOnes)
  [[OSS]] 読み取りに成功したQRコードのセル位置情報の参照
INT FVALGAPI fnFIE_qr_query_delimitingpts (FHANDLE fQRCObj, INT iIndex, FMATRIX **ppfmatDelimitingPts)
  [[OSS]] QRコード区切り座標値の参照
INT FVALGAPI fnFIE_qr_add_offsets (FHANDLE fQRCObj, INT iOffsetX, INT iOffsetY)
  [[OSS]] QRコード検出位置に加味するオフセット量の設定
INT FVALGAPI fnFIE_qr_set_binwinsize (FHANDLE fQRCObj, INT iWinSize)
  [[OSS]] QRコード検出時の2値化ウィンドウサイズ
INT FVALGAPI fnFIE_qr_get_binwinsize (FHANDLE fQRCObj, INT *piWinSize)
  [[OSS]] 2値化ウィンドウサイズの取得
INT FVALGAPI fnFIE_qr_set_minvar (FHANDLE fQRCObj, INT iBinMinVar)
  [[OSS]] QRコード2値化分散しきい値の設定
INT FVALGAPI fnFIE_qr_get_minvar (FHANDLE fQRCObj, INT *piBinMinVar)
  [[OSS]] 2値化分散しきい値の取得
INT FVALGAPI fnFIE_qr_set_effortlevel (FHANDLE fQRCObj, enum f_qr_mode EffortLevel)
  [[OSS]] 動作モードの設定
INT FVALGAPI fnFIE_qr_get_effortlevel (FHANDLE fQRCObj, enum f_qr_mode *pEffortLevel)
  [[OSS]] 動作モードの取得
INT FVALGAPI fnFIE_qr_set_binarize_method (FHANDLE fQRCObj, enum f_qr_binarize_mode mode, INT threshold)
  [[OSS]] 二値化手法の設定
INT FVALGAPI fnFIE_qr_get_binarize_method (FHANDLE fQRCObj, enum f_qr_binarize_mode *mode, INT *threshold)
  [[OSS]] 二値化手法の取得
INT FVALGAPI fnFIE_qr_set_timeout (FHANDLE fQRCObj, DOUBLE timeout)
  [[OSS]] タイムアウトの設定
INT FVALGAPI fnFIE_qr_get_timeout (FHANDLE fQRCObj, DOUBLE *timeout)
  [[OSS]] タイムアウトの取得

列挙型

enum f_qr_mode

QRコード検出モード

QRコード検出における検出モードです。

列挙型の値:
F_QR_NORMAL_EFFORT  通常モード:通常検出(汚れ&欠損がない、処理時間重視)
F_QR_MAXIMUM_EFFORT  最大モード:精度重視(推奨)

QRコード二値化手法

QRコード検出における二値化手法

列挙型の値:
F_QR_BIN_SHIFT_AVERAGE  通常モード 局所領域平均値による二値化
F_QR_BIN_FIX  固定閾値による二値化
F_QR_BIN_DISCRIMINATION  大津の判別分析法による二値化
F_QR_BIN_SHIFT_AVERAGE_OFFSET  オフセット付き局所領域平均値による二値化
局所領域平均値に定数を加算した結果を閾値にして二値化を行います。
F_QR_BIN_KITTLER  キトラー法による二値化


関数

INT FVALGAPI fnFIE_qr_alloc_obj ( FHANDLE *  pfQRCObj  ) 

[[OSS]] QRコードオブジェクトの生成

引数:
[in] pfQRCObj QRコードオブジェクトのポインタ。関数エントリー時には *pfQRCObj を NULL で初期化してください。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NOMEMORY メモリ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • QRコードオブジェクトが不要になったら、必ず fnFIE_free_object() で解放してください。
参照:
fnFIE_free_object()

INT FVALGAPI fnFIE_qr_execute ( FHANDLE  fQRCObj,
FHANDLE  fimg 
)

[[OSS]] QRコード デコード関数

入力画像に対して、QRコードのデコードを実行する関数です。

引数:
[in,out] fQRCObj QRコードオブジェクト
[in] fimg 入力画像(type:UC8/ch:1)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_IMAGE 画像オブジェクトの異常
F_ERR_NOMEMORY メモリ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_qr_query_decoded ( FHANDLE  fQRCObj,
const INT **  ppiDecodedQRIndex,
INT *  piNumOfDecodedQRs 
)

[[OSS]] QRコード検出個数とインデックス配列の取得

シンボルの検出とデコードに成功したQRコードの数と、そのインデックス配列への参照を取得する関数です。ここで取得したインデックス配列を参照してQRコードの情報(デコードしたメッセージ、位置情報等)にアクセスします。

引数:
[in] fQRCObj QRコードオブジェクト
[out] ppiDecodedQRIndex 正常に読み取ることができたQRコードインデックス配列の参照。関数エントリー時には *ppiDecodedQRIndex を NULL で初期化してください。
[out] piNumOfDecodedQRs 正常に読み取ることができたQRコード数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • ppiDecodedQRIndex で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_qr_execute()fnFIE_free_object() が呼ばれたときには無効になります。
  • 本関数は、 fnFIE_qr_execute() を行った後にコールします。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_message(), fnFIE_qr_query_center(), fnFIE_qr_query_size(), fnFIE_qr_query_appts(), fnFIE_qr_query_cellones(), fnFIE_qr_query_mincellwidth(), fnFIE_qr_query_delimitingpts()

INT FVALGAPI fnFIE_qr_query_undecoded ( FHANDLE  fQRCObj,
const INT **  ppiUndecodedQRIndex,
INT *  piNumOfUndecodedQRs 
)

[[OSS]] デコードに失敗したQRコード個数とインデックス配列の取得

画像処理によってシンボルの検出は成功したが、デコード処理に異常が起こったQRコードの数とインデックス配列への参照を取得する関数です。ここで取得したインデックス配列を参照してQRコードの情報にアクセスします。

引数:
[in] fQRCObj QRコードオブジェクト
[out] ppiUndecodedQRIndex デコードに失敗したQRコードインデックス配列の参照。関数エントリー時には *ppiUndecodedQRIndex を NULL で初期化してください。
[out] piNumOfUndecodedQRs デコードに失敗したQRコード数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • ppiUnecodedQRIndex で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_qr_execute()fnFIE_free_object() が呼ばれたときには無効になります。
  • 本関数は、 fnFIE_qr_execute() を行った後にコールします。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_center(), fnFIE_qr_query_size(), fnFIE_qr_query_appts(), fnFIE_qr_query_cellones(), fnFIE_qr_query_mincellwidth(), fnFIE_qr_query_delimitingpts()

INT FVALGAPI fnFIE_qr_query_message ( FHANDLE  fQRCObj,
INT  iIndex,
const CHAR **  ppcMessage 
)

[[OSS]] QRコードのメッセージの参照

デコードに成功したQRコードのメッセージを参照します。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置。(0≦iIndex<位置検出できたQRコード数)
[out] ppcMessage 読み取ったQRコードメッセージ。関数エントリー時には *ppcMessage を NULL で初期化してください。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NODATA メッセージがありません(iIndex にデコードに失敗した値を指定)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 本関数は、 fnFIE_qr_execute() にて読み取りを行った後に、 fnFIE_qr_query_decoded() によって得られたインデックス配列を参照して使用します。
  • iIndex に指定できる範囲は「位置検出に成功したQRコード数」ですが、指定した iIndex が読取に成功していなかった場合には戻り値に F_ERR_NODATA が返ります。
  • ppcMessage で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_free_object() か、再度 fnFIE_qr_execute() が呼ばれた場合は無効になります。
  • 漢字モードで格納されているデータは Shift_JIS コードで格納されます。
  • fnFIE_qr_execute() を実行前、または1つのシンボルも検出しない状態で本関数をコールした場合、戻り値に F_ERR_INVALID_PARAM が返ります。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded()

INT FVALGAPI fnFIE_qr_query_center ( FHANDLE  fQRCObj,
INT  iIndex,
DOUBLE *  pdCenterX,
DOUBLE *  pdCenterY 
)

[[OSS]] 読み取りに成功したQRコードの中心位置を取得

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] pdCenterX QRコードの中心 X 座標
[out] pdCenterY QRコードの中心 Y 座標
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded(), fnFIE_qr_add_offsets()
qr_drawcenter.png

fig. fnFIE_qr_query_center() によって得られた中心座標に対して×マークを描画した例

INT FVALGAPI fnFIE_qr_query_size ( FHANDLE  fQRCObj,
INT  iIndex,
INT *  piQRSize 
)

[[OSS]] 位置検出したQRコードのサイズの取得

対応するQRコードのサイズを取得します。サイズはQRコードの 1〜40型に対応する 21〜177の値になります。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] piQRSize QRコードサイズ(=1辺のセル個数(21〜177) )
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded()

INT FVALGAPI fnFIE_qr_query_mincellwidth ( FHANDLE  fQRCObj,
INT  iIndex,
DOUBLE *  pdMinCellWidth 
)

[[OSS]] 検出したQRコードの最小セルサイズの取得

検出したQRコードに存在するセルの中で最小サイズであるセルの値を取得します。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] pdMinCellWidth 最小セル幅
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded()

INT FVALGAPI fnFIE_qr_query_appts ( FHANDLE  fQRCObj,
INT  iIndex,
FMATRIX **  ppfmatAPPos 
)

[[OSS]] 読み取りに成功したQRコードのファインダーパタン、アライメントパタンの中心位置の参照

QRコードのファインダーパタン、アライメントパタンの位置情報(x,y)を取得します。
列ベクトル(3×n の行列で、n は列の数)として値を参照し、各列には、$ \left[ \begin{array}{ccc} \bf{x} & \bf{y} & \bf{1} \end{array} \right]^t $ のように座標が格納されます。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] ppfmatAPPos アライメントパタン中心座標(x,y)の参照。関数エントリー時には *ppfmatAPPos を NULL で初期化してください。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 本関数は、 fnFIE_qr_execute() にて読み取りを行った後に、 fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded() によって得られたインデックス配列を参照して使用します。
  • ファインダーパタンの中心位置座標も含まれています。
  • ppfmatAPPos で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_free_object() か、再度 fnFIE_qr_execute() が呼ばれた場合は無効になります。
  • fnFIE_qr_execute() を実行前、または1つのシンボルも検出しない状態で本関数をコールした場合、戻り値に F_ERR_INVALID_PARAM が返ります。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded(), fnFIE_qr_add_offsets()
記述例
    // ※サンプルコードは結果の描画部のみの記述です。

    ...
    piDecodedQRIndex = NULL;
    fnFIE_qr_query_decoded( fQRCObj, &piDecodedQRIndex, &iNumOfDecodedQRs ) );
    
    for( i=0; i<iNumOfDecodedQRs; i++ ){
        //ファインダーパタン、アライメントパタン描画情報の取得
        pfmatAppts  = NULL;
        fnFIE_qr_query_appts( fQRCObj, piDecodedQRIndex[i], &pfmatAppts );
        
        fnFIE_qr_query_mincellwidth( fQRCObj, piDecodedQRIndex[i], &dSize );
        
        rc = dSize; //描画半径(任意)
        for( c=0; c<pfmatAppts->col; c++ ){
            xc = pfmatAppts->m[0][c];   //各パタンのX座標
            yc = pfmatAppts->m[1][c];   //各パタンのY座標
            
            draw_circle( xc, yc, rc );  //描画関数(各自用意)
        }
    }
    ...
qr_drawappts.png

fig. fnFIE_qr_query_appts() によって得られた点情報を中心にセルサイズを加味して円を描画した例

INT FVALGAPI fnFIE_qr_query_cellones ( FHANDLE  fQRCObj,
INT  iIndex,
FMATRIX **  ppfmatCellOnes 
)

[[OSS]] 読み取りに成功したQRコードのセル位置情報の参照

セルが存在する位置情報(x,y)を取得します。
得られる位置情報はQRコードを構成するセルのみです。つまりクワイエットゾーンと違う色を持つ箇所のみ位置が得られます。 列ベクトル(3×n の行列で、n は列の数)として値を参照し、各列には、$ \left[ \begin{array}{ccc} \bf{x} & \bf{y} & \bf{1} \end{array} \right]^t $ のように座標が格納されます。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] ppfmatCellOnes セルが存在する位置情報(x,y)の列ベクトルの参照。関数エントリー時には *ppfmatCellOnes を NULL で初期化してください。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 本関数は、 fnFIE_qr_execute() にて読み取りを行った後に、 fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded() によって得られたインデックス配列を参照して使用します。
  • ppfmatCellOnes で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_free_object() か、再度 fnFIE_qr_execute() が呼ばれた場合は無効になります。
  • fnFIE_qr_execute() を実行前、または1つのシンボルも検出しない状態で本関数をコールした場合、戻り値に F_ERR_INVALID_PARAM が返ります。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded(), fnFIE_qr_add_offsets()
記述例
    // ※サンプルコードは結果の描画部のみの記述です。

    ...
    piDecodedQRIndex = NULL;
    fnFIE_qr_query_decoded( fQRCObj, &piDecodedQRIndex, &iNumOfDecodedQRs ) );
    
    for( i=0; i<iNumOfDecodedQRs; i++ ){
        //クワイエットゾーンと違う色を持つセル部描画情報の取得
        pfmatCellOnes = NULL;
        fnFIE_qr_query_cellones( fQRCObj, piDecodedQRIndex[i], &pfmatCellOnes );
        
        fnFIE_qr_query_mincellwidth( fQRCObj, piDecodedQRIndex[i], &dSize );
        
        rc = dSize/2; //描画半径(任意)
        
        for( c=0; c<pfmatCellOnes->col; c++ ){
            xc = pfmatCellOnes->m[0][c];    //各セルのX座標
            yc = pfmatCellOnes->m[1][c];    //各セルのY座標
            
            draw_circle( xc, yc, rc );  //描画関数(各自用意)
        }
    }
    ...

qr_drawcellones.png

fig. fnFIE_qr_query_cellones() によって得られた点情報を中心にセルサイズを加味して円を描画した例

INT FVALGAPI fnFIE_qr_query_delimitingpts ( FHANDLE  fQRCObj,
INT  iIndex,
FMATRIX **  ppfmatDelimitingPts 
)

[[OSS]] QRコード区切り座標値の参照

QRコードの外周を構成する位置情報(x,y)を取得します。
列ベクトル(3×n の行列で、n は列の数)として値を参照し、各列には、$ \left[ \begin{array}{ccc} \bf{x} & \bf{y} & \bf{1} \end{array} \right]^t $ のように座標が格納されます。

引数:
[in] fQRCObj QRコードオブジェクト
[in] iIndex 検出したQRコードインデックス配列の参照位置(0≦iIndex<位置検出できたQRコード数)
[out] ppfmatDelimitingPts QRコード区切り座標値(x,y)の列ベクトルの参照。関数エントリー時には *ppfmatDelimitingPts を NULL で初期化してください。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 本関数は、 fnFIE_qr_execute() にて読み取りを行った後に、 fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded() によって得られたインデックス配列を参照して使用します。
  • ppfmatDelimitingPts で得られたポインタを解放、または内容の変更をしないでください。また、このポインタの内容は fnFIE_free_object() か、再度 fnFIE_qr_execute() が呼ばれた場合は無効になります。
  • fnFIE_qr_execute() を実行前、または1つのシンボルも検出しない状態で本関数をコールした場合、戻り値に F_ERR_INVALID_PARAM が返ります。
参照:
fnFIE_qr_execute(), fnFIE_qr_query_decoded(), fnFIE_qr_query_undecoded(), fnFIE_qr_add_offsets()
記述例
    // ※サンプルコードは結果の描画部のみの記述です。

    ...
    piDecodedQRIndex = NULL;
    fnFIE_qr_query_decoded( fQRCObj, &piDecodedQRIndex, &iNumOfDecodedQRs ) );
    
    for( i=0; i<iNumOfDecodedQRs; i++ ){
        //境界点情報の取得
        pfmatDelimitingPts = NULL;
        fnFIE_qr_query_delimitingpts( fQRCObj, piDecodedQRIndex[i], &pfmatDelimitingPts );
        
        //得られた点の先頭と終端を結ぶことで、QRコードシンボルを囲うように描画します
        for( c=0; c<pfmatDelimitingPts->col; c++ ){
            xs = pfmatDelimitingPts->m[0][(c  )%pfmatDelimitingPts->col];   // 境界線始点X座標
            ys = pfmatDelimitingPts->m[1][(c  )%pfmatDelimitingPts->col];   // 境界線始点Y座標
            xe = pfmatDelimitingPts->m[0][(c+1)%pfmatDelimitingPts->col];   // 境界線終点X座標
            ye = pfmatDelimitingPts->m[1][(c+1)%pfmatDelimitingPts->col];   // 境界線終点Y座標
            
            draw_line( xs, ys, xe, ye );    //描画関数(各自用意)
        }
    }
    ...
qr_drawdelimit.png

fig. fnFIE_qr_query_delimitingpts() によって得られた点情報を線でつないで描画した例

INT FVALGAPI fnFIE_qr_add_offsets ( FHANDLE  fQRCObj,
INT  iOffsetX,
INT  iOffsetY 
)

[[OSS]] QRコード検出位置に加味するオフセット量の設定

検出したすべてのQRコードの検出位置(x,y)に、本関数で設定したオフセット量を足します。 例えば、チャイルド画像を使用してQRコードの読み取りを行った場合に、本関数でオフセット値を入力するとルート画像上での位置情報として回答を得ることができます。

引数:
[in,out] fQRCObj QRコードオブジェクト
[in] iOffsetX 検出位置に足されるオフセット量X
[in] iOffsetY 検出位置に足されるオフセット量Y
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 本関数は fnFIE_qr_execute() の結果に常に反映される値を設定する関数ではなく、1回の fnFIE_qr_execute() によって格納された位置情報に対して値を加算するものです。 そのため、たとえいつも同じオフセット量を加算する場合でも fnFIE_qr_execute() によって検出を行った後に本関数を連続してコールする必要があります。
参照:
fnFIE_qr_query_center(), fnFIE_qr_query_appts(), fnFIE_qr_query_delimitingpts(), fnFIE_qr_query_cellones()
記述例
    // ※サンプルコードは本関数の使用についてのみの記述です。

    ...
    // 画像オブジェクト(hImg)のサイズ 640x480
    // QRコードの検出を始点:(50,100), 横サイズ:150, 縦サイズ:200のエリアで行う
    
    FHANDLE hImgChild = NULL; // child image
    FHANDLE fQRCObj = NULL; // QR code object
    INT child_sx, child_sy, child_width, child_height;
    
    // チャイルド画像エリア指定
    child_sx     =  50;
    child_sy     = 100;
    child_width  = 150;
    child_height = 200;
    
    // チャイルド画像生成
    hImgChild =  fnFIE_img_child_alloc( hImg, child_sx, child_sy, child_width, child_height );
    
    // QRコードオブジェクト生成
    fnFIE_qr_alloc_obj( &fQRCObj );
    
    // QRコード読取り実行
    fnFIE_qr_execute( fQRCObj, hImgChild );
    
    // 親画像での結果座標に変換
    fnFIE_qr_add_offsets( fQRCObj, child_sx, child_sy );
    
    // 親画像上に結果座標を表示
    ...

INT FVALGAPI fnFIE_qr_set_binwinsize ( FHANDLE  fQRCObj,
INT  iWinSize 
)

[[OSS]] QRコード検出時の2値化ウィンドウサイズ

QRコードを検出する際に使用する局所領域2値化のウィンドウサイズを設定します。セル1つの大きさ≦iWinSize を目安に設定します。
2値化手法がF_QR_BIN_SHIFT_AVERAGEまたはF_QR_BIN_SHIFT_AVERAGE_OFFSETの際に利用されます。

引数:
[in,out] fQRCObj QRコードオブジェクト
[in] iWinSize 2値化ウィンドウサイズ(初期値:11, 3≦iWinSize≦15, iWinSize は奇数)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_get_binwinsize()

INT FVALGAPI fnFIE_qr_get_binwinsize ( FHANDLE  fQRCObj,
INT *  piWinSize 
)

[[OSS]] 2値化ウィンドウサイズの取得

現在設定されている2値化ウインドウサイズを取得します。

引数:
[in] fQRCObj QRコードオブジェクト
[out] piWinSize 2値化ウィンドウサイズ
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_set_binwinsize()

INT FVALGAPI fnFIE_qr_set_minvar ( FHANDLE  fQRCObj,
INT  iBinMinVar 
)

[[OSS]] QRコード2値化分散しきい値の設定

2値化のしきい値を決定するための分散値を指定します。

引数:
[in,out] fQRCObj QRコードオブジェクト
[in] iBinMinVar 2値化最小分散値 (初期値:1000, 0≦iBinMinVar)
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_get_minvar()

INT FVALGAPI fnFIE_qr_get_minvar ( FHANDLE  fQRCObj,
INT *  piBinMinVar 
)

[[OSS]] 2値化分散しきい値の取得

現在設定されている分散しきい値を取得します。

引数:
[in] fQRCObj QRコードオブジェクト
[out] piBinMinVar 2値化分散しきい値
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_set_minvar()

INT FVALGAPI fnFIE_qr_set_effortlevel ( FHANDLE  fQRCObj,
enum f_qr_mode  EffortLevel 
)

[[OSS]] 動作モードの設定

QRコードシンボル検出の動作モード( F_QR_NORMAL_EFFORT or F_QR_MAXIMUM_EFFORT )を設定します。

F_QR_NORMAL_EFFORT モード と F_QR_MAXIMUM_EFFORT モード の違いについて
F_QR_MAXIMUM_EFFORT では、ファインダーパタンの中心位置の推定が F_QR_NORMAL_EFFORT モードよりも正確です。 特にセルサイズが小さかったり、ファインダーパタンが劣化していたりするような場合にはより良い結果が得られる傾向があります。 アライメントパタンについてもファインダーパタンと同様に、良い結果が得られる傾向があります。
設定の際には、処理時間に余裕がある状況では F_QR_MAXIMUM_EFFORT を指定し、極めて綺麗な画像や処理時間を重視する際には F_QR_NORMAL_EFFORT を使用してください。
初期値は F_QR_NORMAL_EFFORT です。
引数:
[in,out] fQRCObj QRコードオブジェクト
[in] EffortLevel 動作モード
  • F_QR_NORMAL_EFFORT 通常検出モード
  • F_QR_MAXIMUM_EFFORT 最大検出モード
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_get_effortlevel()

INT FVALGAPI fnFIE_qr_get_effortlevel ( FHANDLE  fQRCObj,
enum f_qr_mode pEffortLevel 
)

[[OSS]] 動作モードの取得

現在設定されている動作モードを取得します。

引数:
[in] fQRCObj QRコードオブジェクト
[out] piEffortLevel 設定している動作モード
  • F_QR_NORMAL_EFFORT 通常検出モード
  • F_QR_MAXIMUM_EFFORT 最大検出モード
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_set_effortlevel()

INT FVALGAPI fnFIE_qr_set_binarize_method ( FHANDLE  fQRCObj,
enum f_qr_binarize_mode  mode,
INT  threshold 
)

[[OSS]] 二値化手法の設定

QRコードを検出する際に使用する二値化手法を設定するとともに、二値化手法に応じたパラメータを設定します。
通常モードである F_QR_BIN_SHIFT_AVERAGE 以外に設定することで読み取り速度を向上できる場合があります。ただし、シェーディングがあったり低コントラストだったりする画像では読み取り性能が低下します。

引数:
[in,out] fQRCObj QRコードオブジェクト
[in] mode 設定する二値化手法
  • F_QR_BIN_SHIFT_AVERAGE 通常モード 局所領域平均値による二値化を行います。
  • F_QR_BIN_SHIFT_AVERAGE_OFFSET オフセット付き局所領域平均値による二値化
    局所領域平均値に定数を加算した結果を閾値にして二値化を行います。
  • F_QR_BIN_FIX 固定閾値による二値化を行います。
  • F_QR_BIN_DISCRIMINATION 大津の判別分析法による二値化を行います。
  • F_QR_BIN_KITTLER キトラー法による二値化を行います。
[in] threshold 二値化手法別の閾値
引数 mode によって以下のように異なります。
  • F_QR_BIN_SHIFT_AVERAGE の場合 分散閾値を設定します。 fnFIE_qr_set_minvar() で設定する数値と同一で、初期値は1000です。値域は$ 0 \leq threshold $ です。
  • F_QR_BIN_SHIFT_AVERAGE_OFFSET の場合、局所領域平均値に加算する数値を設定します。20程度を推奨します。 $ (-255 \leq threshold \leq 255 ) $
  • F_QR_BIN_FIX の場合、二値化閾値そのものを設定します。$ (0 \leq threshold \leq 255) $
  • F_QR_BIN_DISCRIMINATION の場合、引数は無視されます。
  • F_QR_BIN_KITTLER の場合、引数は無視されます。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_get_binarize_method()

fnFIE_shift_avr_threshold_ex()

fnFIE_discrimination_multithreshold()

fnFIE_kittler_threshold()

INT FVALGAPI fnFIE_qr_get_binarize_method ( FHANDLE  fQRCObj,
enum f_qr_binarize_mode mode,
INT *  threshold 
)

[[OSS]] 二値化手法の取得

現在設定されている二値化手法と閾値を取得します。

引数:
[in] fQRCObj QRコードオブジェクト
[out] mode 設定されている二値化手法
  • F_QR_BIN_SHIFT_AVERAGE 通常モード 局所領域平均値による二値化を行います。
  • F_QR_BIN_SHIFT_AVERAGE_OFFSET オフセット付き局所領域平均値による二値化
    局所領域平均値に定数を加算した結果を閾値にして二値化を行います。
  • F_QR_BIN_FIX 固定閾値による二値化を行います。
  • F_QR_BIN_DISCRIMINATION 大津の判別分析法による二値化を行います。
  • F_QR_BIN_KITTLER キトラー法による二値化を行います。
[out] threshold 二値化手法別の閾値
mode によって以下のように異なります。
  • F_QR_BIN_SHIFT_AVERAGE の場合 分散閾値を取得します。 fnFIE_qr_get_minvar() で取得する数値と同一です。
  • F_QR_BIN_SHIFT_AVERAGE_OFFSET の場合、局所領域平均値に加算する数値を返します。
  • F_QR_BIN_FIX の場合、二値化閾値を返します。
  • F_QR_BIN_DISCRIMINATION の場合、0が返ります。
  • F_QR_BIN_KITTLER の場合、0が返ります。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT QRコードオブジェクトの異常
F_ERR_INVALID_PARAM パラメータ異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_qr_set_binarize_method()

INT FVALGAPI fnFIE_qr_set_timeout ( FHANDLE  fQRCObj,
DOUBLE  timeout 
)

[[OSS]] タイムアウトの設定

QRコードの認識を打ち切る制限時間を設定します。0を指定した場合はタイムアウトは行いません。

初期値:0ms タイムアウト無し

注意:
現状QRコードが大量に存在する、ファインダパタンが欠けたQRコードがある等の場合、処理時間が非常に長くなる可能性があります。このような現象を回避するため、本関数で制限時間を指定することができます。
引数:
[in] fQRCObj QRコードオブジェクト
[in] timeout タイムアウト時間(ms) ( timeout >= 0.0 )
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 異常終了(パラメータが不正)
F_ERR_INVALID_OBJECT 不正なオブジェクトハンドルが渡されたため、異常終了。
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_qr_get_timeout ( FHANDLE  fQRCObj,
DOUBLE *  timeout 
)

[[OSS]] タイムアウトの取得

指定したオブジェクトハンドルにて設定されているQRコードの認識を打ち切る制限時間を取得します。

初期値:0ms タイムアウト無し

引数:
[in] fQRCObj QRコードオブジェクト
[out] timeout タイムアウト時間(ms) ( timeout >= 0.0 )
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 異常終了(パラメータが不正)
F_ERR_INVALID_OBJECT 不正なオブジェクトハンドルが渡されたため、異常終了。
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー


Documentation copyright © 2009-2024 FAST Corporation.
Generated on Fri Aug 9 16:38:48 2024 for FIEライブラリ by doxygen 1.5.6-FASTSP-p2