特徴量
[FPM(特徴点応用マッチング)]


関数

FHANDLE FVALGAPI fnFIE_fpm_feature_alloc (FHANDLE himage, enum f_fpm_mode matching_mode, enum f_fpm_featedge method, const F_FPM_FEATURE *pfeature_param, BOOL border, INT *perr_code)
 特徴量を取得
FHANDLE FVALGAPI fnFIE_fpm_feature_window_alloc (FHANDLE himage, BOX_T window, enum f_fpm_mode matching_mode, enum f_fpm_featedge method, const F_FPM_FEATURE *pfeature_param, BOOL border, INT *perr_code)
 ウィンドウを指定して特徴量を取得
FHANDLE FVALGAPI fnFIE_fpm_feature_import_alloc (F_DEDGE *img_edges, INT num_img_edges, INT img_width, INT img_height, enum f_fpm_mode matching_mode, INT *perr_code)
 点情報から FPM特徴量オブジェクトを生成
INT FVALGAPI fnFIE_fpm_feature_mask (FHANDLE hfeature, FHANDLE hmask)
 特徴量のマスク
INT FVALGAPI fnFIE_fpm_feature_get_num (FHANDLE hfeature, INT *pfeature_num)
 特徴量数の取得
INT FVALGAPI fnFIE_fpm_feature_get_edges (FHANDLE hfeature, F_DEDGE *pedges)
 特徴量の取得(勾配方向付きエッジ)
INT FVALGAPI fnFIE_fpm_feature_get_matching_mode (FHANDLE hfeature, enum f_fpm_mode *pmatching_mode)
 特徴量取得マッチングモードの取得
INT FVALGAPI fnFIE_fpm_feature_get_method (FHANDLE hfeature, enum f_fpm_featedge *pmethod)
 特徴量抽出手法の取得

関数

FHANDLE FVALGAPI fnFIE_fpm_feature_alloc ( FHANDLE  himage,
enum f_fpm_mode  matching_mode,
enum f_fpm_featedge  method,
const F_FPM_FEATURE pfeature_param,
BOOL  border,
INT *  perr_code 
)

特徴量を取得

画像オブジェクトから特徴量を抽出し、特徴量オブジェクト(F_OBJID_FPM_FEATURE)を生成します。

引数:
[in] himage 特徴量を計測する対象となる画像オブジェクト (画像タイプ:uc8 のみ対応)
チャネル数は 1 でなければいけません。
[in] matching_mode FPMを行う際のマッチングモード
  • F_FPM_NORMAL_MODE 通常モード
  • F_FPM_SPEED_MODE 高速モード
[in] method 特徴量抽出手法
  • F_FPM_SOBEL_EDGE ソーベルによる特徴量抽出
  • F_FPM_CORR_EDGE 相関エッジによる特徴量抽出
  • F_FPM_SOBEL_MAX_EDGE 強度上限付ソーベルによる特徴量抽出
  • F_FPM_CORR_MAX_EDGE 強度上限付相関エッジによる特徴量抽出
  • F_FPM_GROOVE_EDGE 細線エッジによる特徴量抽出
[in] pfeature_param 特徴量計測パラメータ
[in] border 特徴量抽出時のボーダー処理
  • TRUE ボーダー処理を行う
  • FALSE ボーダー処理を行わない
[out] perr_code 正常終了、またはエラーコードが入力されます。エラーコードを受け取る必要の無い場合は、NULLを指定します。
  • F_ERR_NONE 正常終了
  • F_ERR_INVALID_IMAGE 引数画像オブジェクトが異常
  • F_ERR_INVALID_PARAM 引数異常
  • F_ERR_NOMEMORY メモリ不足
  • F_ERR_FPM_NOFEATURE 特徴量が見つかりません。
  • F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
戻り値:
正常終了した場合は、生成したFPM特徴量オブジェクトのハンドルを返します。 異常終了により生成できなかったときはNULLを返します。
注意:
  • FPM特徴量オブジェクトが不要になったら、必ず fnFIE_free_object() で解放してください。
  • 入力する画像オブジェクトの ステップサイズが 8で割り切れない場合には画像のコピーを行うため処理時間が余計にかかります。 特に、F_FPM_NORMAL_MODEで実行する場合, 画像オブジェクトを fnFIE_img_root_import_alloc() で確保した場合にはお気をつけください。

FHANDLE FVALGAPI fnFIE_fpm_feature_window_alloc ( FHANDLE  himage,
BOX_T  window,
enum f_fpm_mode  matching_mode,
enum f_fpm_featedge  method,
const F_FPM_FEATURE pfeature_param,
BOOL  border,
INT *  perr_code 
)

ウィンドウを指定して特徴量を取得

画像オブジェクトの特定の範囲から特徴量を抽出し、特徴量オブジェクト(F_OBJID_FPM_FEATURE)を生成します。

引数:
[in] himage 特徴量を計測する対象となる画像オブジェクト (画像タイプ:uc8 のみ対応)
チャネル数は 1 でなければいけません。
[in] window 特徴量を計測する対象画像エリアです。
[in] matching_mode FPMを行う際のマッチングモード
  • F_FPM_NORMAL_MODE 通常モード
  • F_FPM_SPEED_MODE 高速モード
[in] method 特徴量抽出手法
  • F_FPM_SOBEL_EDGE ソーベルによる特徴量抽出
  • F_FPM_CORR_EDGE 相関エッジによる特徴量抽出
  • F_FPM_SOBEL_MAX_EDGE 強度上限付ソーベルによる特徴量抽出
  • F_FPM_CORR_MAX_EDGE 強度上限付相関エッジによる特徴量抽出
  • F_FPM_GROOVE_EDGE 細線エッジによる特徴量抽出
[in] pfeature_param 特徴量計測パラメータ
[in] border 特徴量抽出時のボーダー処理
  • TRUE ボーダー処理を行う
  • FALSE ボーダー処理を行わない
[out] perr_code 正常終了、またはエラーコードが入力されます。エラーコードを受け取る必要の無い場合は、NULLを指定します。
  • F_ERR_NONE 正常終了
  • F_ERR_INVALID_IMAGE 引数画像オブジェクトが異常
  • F_ERR_INVALID_PARAM 引数異常
  • F_ERR_NOMEMORY メモリ不足
  • F_ERR_FPM_NOFEATURE 特徴量が見つかりません。
  • F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
戻り値:
正常終了した場合は、生成したFPM特徴量オブジェクトのハンドルを返します。 異常終了により生成できなかったときはNULLを返します。
注意:
  • FPM特徴量オブジェクトが不要になったら、必ず fnFIE_free_object() で解放してください。
  • 入力する画像オブジェクトの ステップサイズが 8で割り切れない場合には画像のコピーを行うため処理時間が余計にかかります。 特に、F_FPM_NORMAL_MODEで実行する場合, 画像オブジェクトを fnFIE_img_root_import_alloc() で確保した場合にはお気をつけください。

FHANDLE FVALGAPI fnFIE_fpm_feature_import_alloc ( F_DEDGE img_edges,
INT  num_img_edges,
INT  img_width,
INT  img_height,
enum f_fpm_mode  matching_mode,
INT *  perr_code 
)

点情報から FPM特徴量オブジェクトを生成

F_DEDGE 型のエッジ情報をインポートして、FPM特徴量オブジェクト(F_OBJID_FPM_FEATURE)を生成します。 自身で作成した処理によって計測したエッジ情報や、既知の幾何情報から生成した情報等を用いて、FPMを実行するためのFPM特徴量オブジェクトを生成することが可能です。

引数:
[in] img_edges F_DEDGE 型 エッジデータ
[in] num_img_edges img_edges に格納されているエッジデータ数(1≦ num_img_edges)
[in] img_width img_edges を取得した画像幅(1≦ img_width)
[in] img_height img_edges を取得した画像高さ(1≦ img_height)
[in] matching_mode FPMを行う際のマッチングモード
  • F_FPM_NORMAL_MODE 通常モード
  • F_FPM_SPEED_MODE 高速モード
[out] perr_code 正常終了、またはエラーコードが入力されます。エラーコードを受け取る必要の無い場合は、NULLを指定することも可能です。
  • F_ERR_NONE 正常終了
  • F_ERR_INVALID_PARAM 引数異常
  • F_ERR_NOMEMORY メモリ不足
  • F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
戻り値:
正常終了した場合は、生成したFPM特徴量オブジェクトのハンドルを返します。 異常終了により生成できなかったときはNULLを返します。
注意:
  • 入力情報 img_edges のメンバである 強度 mag は使用しません。値が未知であっても値を計算する必要はありません。(未知の場合には 0で初期化しておいてください)
  • FPM特徴量オブジェクトが不要になったら、必ず fnFIE_free_object() で解放してください。
  • img_edges の入力エッジ情報は、画像処理で取得したエッジを想定しています。そのため img_edges のXYの入力値として、四捨五入して負になる、または img_width, img_height 以上になる値を入力した場合には、戻り値に F_ERR_INVALID_PARAM が返ります。

INT FVALGAPI fnFIE_fpm_feature_mask ( FHANDLE  hfeature,
FHANDLE  hmask 
)

特徴量のマスク

特徴量オブジェクトに格納されている特徴量データに対してマスクを掛けた状態のデータに更新します。

引数:
[in,out] hfeature FPM特徴量オブジェクト
[in] hmask マスクパタン指定用画像オブジェクト(画像タイプ:uc8 のみ対応) マスクを指定する場合には、最下位1ビットをONに指定します。hmask にNULLを渡すとマスクをとりはずします。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 引数オブジェクトの種別が異常
F_ERR_INVALID_IMAGE 引数画像オブジェクトが異常
F_ERR_FPM_NOFEATURE 特徴量がなくなります
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
本関数を呼び出すたびにマスク指定した部分の特徴量データが取り除かれます。異なったマスクで複数回呼び出した場合、いずれのマスクでも指定されなかった部分の特徴量データが残ります。 マスクが一度も掛かっていない時点での特徴量データを復帰させたい場合には、hmaskにNULLを渡してください。

              

使用例:
#include "fie.h"    
#include "oal_aloc.h"
#include <stdio.h>

#define RESULT_N 99     //マッチングの最大検出数

/*
  fnFIE_fpm_feature_maskを使ったサンプルコード

  このサンプルコードはマッチングを行う前に
  FPM特徴量オブジェクトにマスクをかけることで
  画像内の任意の範囲にのみサーチを実行するものです
*/


VOID sample_fpm(FHANDLE hImage, FHANDLE hptn, FHANDLE hmask)
{
    INT i,j;
    INT num = 0;

    FHANDLE huc8mask = NULL;                // マスク画像用ハンドル
    FHANDLE hbinmask = NULL;                // マスク画像用ハンドル
    FHANDLE hfpm = NULL;                    // FPMオブジェクト用ハンドル
    FHANDLE fpm_feat_obj = NULL;              // FPMオブジェクト用ハンドル

    F_FPM_FEATURE       feature_param;      // 特徴量抽出を行う際のパラメータ設定用共用体 
    F_FPM_MATCH         matching_param;     // マッチングを行う際のパラメータ設定用構造体
    F_FPM_AREASCORE     areascore_param;    // 領域スコア再計算を行う際のパラメータ設定用構造体
    F_FPM_FEATURE pfeature_param;

    enum f_fpm_mode matching_mode;          // マッチングモードの指定用
    enum f_fpm_featedge method;             // 特徴量を取得する際のエッジ取得方法の指定用
    F_EDGE_SOBEL_PARAMS sobel;              // ソーベルエッジ検出用パラメータ

    BOX_T   win;                            // マッチングエリア指定の矩形設定用
    DPNT_T  offset;                         // マッチング回答オフセット値  
    INT  result_num_no_mask;                        // マッチング結果の個数
    F_SEARCH_RESULT result_no_mask[RESULT_N];       // マッチング結果の格納用配列
    INT  result_num_mask;                        // マッチング結果の個数
    F_SEARCH_RESULT result_mask[RESULT_N];       // マッチング結果の格納用配列


    INT image_width, image_height;          // 入力画像の幅、高さ
    INT ptn_width, ptn_height;              //パタンの幅、高さ
    INT mask_type;                          // マスク画像の種別


    /*画像関係の準備*/
    
    //入力画像のパラメータ獲得
    fnFIE_img_get_params(hImage, NULL, NULL, NULL, &image_width, &image_height);
    fnFIE_img_get_params(hptn, NULL, NULL, NULL, &ptn_width, &ptn_height);
    fnFIE_img_get_params(hmask, NULL, &mask_type, NULL, NULL, NULL);

    //もしマスク画像が2値画像ではなかった場合2値化
    hbinmask = fnFIE_img_root_alloc(F_IMG_BIN, 1, image_width, image_height);
    if (mask_type != F_IMG_BIN) fnFIE_binarize(hmask, hbinmask, 1);
    else fnFIE_img_copy(hmask, hbinmask);

    //2値マスク画像をコピーすることで画素値0or1の濃淡画像を作成
    huc8mask = fnFIE_img_root_alloc(F_IMG_UC8, 1, image_width, image_height);
    fnFIE_img_copy(hbinmask, huc8mask);


    /*パラメータの準備*/

    // サーチの手法設定
    matching_mode = F_FPM_NORMAL_MODE;  // マッチングモードは通常モード
    method = F_FPM_SOBEL_EDGE;          // エッジ取得方法はソーベルエッジ

    // サーチのマッチングパラメータ設定
    matching_param.require_result_num = RESULT_N;
    matching_param.min_angle = 0;
    matching_param.max_angle = 0;
    matching_param.min_scale = 100;
    matching_param.max_scale = 100;
    matching_param.polarity = F_FPM_SAME_POLARITY;
    matching_param.coarse_highcomp_threshold = 50;
    matching_param.coarse_lowcomp_threshold = 60;
    matching_param.coarse_err_wide = 1;
    matching_param.coarse_comp_rate = 3;
    matching_param.refine_execute = TRUE;
    matching_param.refine_err_wide = 1;
    matching_param.refine_threshold = 76;

    //領域スコア再計算パラメータ設定
    areascore_param.err_wide = 1;
    areascore_param.err_wide_tx = 0.5;
    areascore_param.err_wide_ty = 0.5;
    areascore_param.err_wide_tq = 0.5;
    areascore_param.err_wide_ts = 0.5;
    areascore_param.noise_weight = 0.5;
    areascore_param.threshold = 76;

    //特徴量抽出パラメータ設定
    pfeature_param.sobel_edge.mag_threshold = 120;
    pfeature_param.sobel_edge.nms_length = 2;

    //ソーベルエッジパラメータ設定
    sobel.mag_threshold = 120;
    sobel.nms_length = 2;
    feature_param.sobel_edge = sobel;

    //マスターパタン生成用のパラメータ設定 
    offset.x = ptn_width / 2.0;
    offset.y = ptn_height / 2.0;

    //サーチ範囲設定
    win.st.x = 0;
    win.st.y = 0;
    win.ed.x = image_width - 1;
    win.ed.y = image_height - 1;


    //マスターパタン登録
    hfpm = fnFIE_fpm_alloc(hptn, NULL, offset, matching_mode, method, &feature_param, NULL);

    //FPM特徴量オブジェクトを生成 
    fpm_feat_obj = fnFIE_fpm_feature_alloc(hImage, matching_mode, method, &pfeature_param, FALSE, NULL);


    //マスクなしでマッチング実行
    fnFIE_fpm_matching_feature(hfpm, fpm_feat_obj, NULL, win, &matching_param, result_no_mask, &result_num_no_mask);

    //サーチ対象画像の内、サーチしたくない部分にある特徴量をマスクで除外 
    fnFIE_fpm_feature_mask(fpm_feat_obj, huc8mask);

    //マスクありでマッチング実行
    fnFIE_fpm_matching_feature(hfpm, fpm_feat_obj, NULL, win, &matching_param, result_mask, &result_num_mask);

    // 実行結果をコンソール出力
    printf("Number of search results without mask:%d               | Number of search results with mask:%d\n", result_num_no_mask, result_num_mask);
    printf("           x, y            theta       scale    score  |          x, y            theta       scale    score\n");
    for (i = 0; i < result_num_no_mask; i++)
    {
        for (j = 0; j < result_num_mask;j++) 
        {
            if (fnFIE_d4i5(result_no_mask[i].x) - fnFIE_d4i5(result_mask[j].x) == 0 && fnFIE_d4i5(result_no_mask[i].y) - fnFIE_d4i5(result_mask[j].y) == 0)
            {
                printf("%2d.[%8.3f,%8.3f]  [%8.3f]  [%8.3f]  [%3d]  |  [%8.3f,%8.3f]  [%8.3f]  [%8.3f]  [%3d] \n", i + 1,
                    result_no_mask[i].x, result_no_mask[i].y, result_no_mask[i].q, result_no_mask[i].s, result_no_mask[i].score,
                    result_mask[j].x,    result_mask[j].y,    result_mask[j].q,    result_mask[j].s,    result_mask[j].score);
                
                num = 1;
            }
        }

        if(num!=1)
        {
            printf("%2d.[%8.3f,%8.3f]  [%8.3f]  [%8.3f]  [%3d]  |  delete\n",i+1,
                result_no_mask[i].x, result_no_mask[i].y, result_no_mask[i].q, result_no_mask[i].s, result_no_mask[i].score);
        }
        num = 0;
    }


    //オブジェクトの解放
    fnFIE_free_object(hfpm);
    fnFIE_free_object(hbinmask);
    fnFIE_free_object(huc8mask);
    fnFIE_free_object(fpm_feat_obj);
}

INT main(VOID)
{
    //ライブラリのセットアップ
    fnFIE_setup();

    FHANDLE hImage = NULL;           // 入力画像用ハンドル
    FHANDLE hptn = NULL;             // FPMオブジェクト用ハンドル
    FHANDLE hmsk = NULL;             // FPMオブジェクト用ハンドル


    //画像の読み込み
    fnFIE_load_bmp("smp.bmp", &hImage, F_COLOR_IMG_TYPE_UC8);
    fnFIE_load_bmp("ptn_C.bmp", &hptn, F_COLOR_IMG_TYPE_UC8);
    fnFIE_load_bmp("mask.bmp", &hmsk, F_COLOR_IMG_TYPE_UC8);

    //サーチの実行処理
    sample_fpm(hImage, hptn, hmsk);

    //オブジェクト解放
    fnFIE_free_object(hptn);
    fnFIE_free_object(hImage);
    fnFIE_free_object(hmsk);

    //ライブラリの終了処理
    fnFIE_teardown();



    return 0;
}



fie_fpm_feature_mask_smp_obj.png

(a)

fie_fpm_feature_mask_smp_mask.png

(b)

fie_fpm_feature_mask_smp_result_no_mask.png

(c)

fie_fpm_feature_mask_smp_result_mask.png

(d)

(a)サーチ対象画像。このサンプルコードでは基板上にある『C』の文字をサーチしている。
(b)マスク画像。除外したい部分が白、サーチを行いたい部分が黒となっている。
(c)本関数未使用時に検出した座標を描画した画像。四隅の穴など余計な部分も検出されてしまっている。
(d)本関数使用時に検出した座標を描画した画像。(b)画像の範囲のみの検出結果が表示されている。

参照:
fnFIE_fpm_feature_get_num()

INT FVALGAPI fnFIE_fpm_feature_get_num ( FHANDLE  hfeature,
INT *  pfeature_num 
)

特徴量数の取得

特徴量オブジェクトに格納されている特徴量の数を取得します。

引数:
[in] hfeature FPM特徴量オブジェクト
[out] pfeature_num ハンドル内に格納されている特徴量数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 引数オブジェクトの種別が異常
F_ERR_INVALID_PARAM 引数異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_fpm_feature_get_edges ( FHANDLE  hfeature,
F_DEDGE pedges 
)

特徴量の取得(勾配方向付きエッジ)

特徴量オブジェクトに格納されている特徴量データを勾配方向付きエッジ情報データ型で取得します。

引数:
[in] hfeature FPM特徴量オブジェクト
[out] pedges 取得した特徴量データ 予め fnFIE_fpm_feature_get_num() によって特徴量の数を取得し、必要な領域を確保する必要があります。
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 引数オブジェクトの種別が異常
F_ERR_INVALID_PARAM 引数異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
注意:
  • 強度の出力値は0が入ります。
参照:
fnFIE_fpm_feature_get_num()

INT FVALGAPI fnFIE_fpm_feature_get_matching_mode ( FHANDLE  hfeature,
enum f_fpm_mode pmatching_mode 
)

特徴量取得マッチングモードの取得

特徴量オブジェクトを生成した際のマッチングモードを取得します。

引数:
[in] hfeature FPM特徴量オブジェクト
[out] pmatching_mode FPMを行う際のマッチングモード
  • F_FPM_NORMAL_MODE 通常モード
  • F_FPM_SPEED_MODE 高速モード
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 引数オブジェクトの種別が異常
F_ERR_INVALID_PARAM 引数異常
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_fpm_feature_get_method ( FHANDLE  hfeature,
enum f_fpm_featedge pmethod 
)

特徴量抽出手法の取得

特徴量オブジェクトを生成した際の特徴量抽出手法を取得します。

引数:
[in] hfeature FPM特徴量オブジェクト
[out] pmethod 特徴量抽出手法
  • F_FPM_CORR_MODE 相関エッジ
  • F_FPM_SOBEL_MODE ソーベルエッジ
  • F_FPM_CORR_MAX_MODE 強度上限付相関エッジ
  • F_FPM_SOBEL_MAX_MODE 強度上限付ソーベルエッジ
  • F_FPM_GROOVE_EDGE 細線エッジ
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 引数オブジェクトの種別が異常
F_ERR_INVALID_PARAM 引数異常
F_ERR_NODATA 抽出手法は存在しません( FPMオブジェクトは fnFIE_fpm_feature_import_alloc() によって生成されました )
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー


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