ハフ直線検出
[ビジョンツール]


データ構造

struct  F_LH_LINE
 直線検出ハフ用直線構造体 [詳細]

関数

FHANDLE FVALGAPI fnFIE_hough_lines_open (INT stq, INT edq, INT sx, INT sy, INT ex, INT ey, INT *exerr)
 直線検出ハフライブラリのオープン
INT FVALGAPI fnFIE_hough_lines_init_space (FHANDLE hHough)
 ハフ投票空間の初期化
INT FVALGAPI fnFIE_hough_lines_voting (FHANDLE hHough, const F_EDGE *edges, INT edge_num, INT vot_width, INT *voting_num)
 ハフ空間への投票(整数型エッジ点群)
INT FVALGAPI fnFIE_hough_lines_voting_d (FHANDLE hHough, const F_DEDGE *edges, INT edge_num, INT vot_width, INT *voting_num)
 ハフ空間への投票(実数型エッジ点群)
INT FVALGAPI fnFIE_hough_lines_detection (const FHANDLE hHough, INT request_line_num, INT rgn_r, INT rgn_q, F_LH_LINE *ans_lines, INT *line_num)
 ハフ直線検出
INT FVALGAPI fnFIE_hough_lines_refine_line (F_LH_LINE *line, const F_EDGE *edges, INT edge_num, INT err_r, INT err_q, INT *pnt_num)
 直線係数を最小自乗法で求め直す(整数型エッジ点群)
INT FVALGAPI fnFIE_hough_lines_refine_line_d (F_LH_LINE *line, const F_DEDGE *edges, INT edge_num, DOUBLE err_r, DOUBLE err_q, INT *pnt_num)
 直線係数を最小自乗法で求め直す(実数型エッジ点群)
INT FVALGAPI fnFIE_hough_lines_get_support_edges (const F_LH_LINE *line, const F_EDGE *edges, INT edge_num, INT err_r, INT err_q, F_EDGE **support_edges, INT *neib_num, INT *sort_type)
 直線に近いエッジ点群の取得(整数型エッジ点群)
INT FVALGAPI fnFIE_hough_lines_get_support_edges_d (const F_LH_LINE *line, const F_DEDGE *edges, INT edge_num, DOUBLE err_r, DOUBLE err_q, F_DEDGE **support_edges, INT *neib_num, INT *sort_type)
 直線に近いエッジ点群の取得(実数型エッジ点群)
FHANDLE FVALGAPI fnFIE_hough_lines_get_space (FHANDLE hHough, INT *stq, INT *edq, INT *str, INT *edr)
 ハフ投票空間の取得

関数

FHANDLE FVALGAPI fnFIE_hough_lines_open ( INT  stq,
INT  edq,
INT  sx,
INT  sy,
INT  ex,
INT  ey,
INT *  exerr 
)

直線検出ハフライブラリのオープン

直線検出ハフライブラリをオープンします。 本関数を実行する前に、 fnFIE_setup() を実行してください。 実行しない場合は、 未初期化としてエラーコードに F_ERR_UNINIT_LIB が代入され、NULLが返されます。

ハフ投票空間の初期化は本関数では行われません。 投票開始前に必ず fnFIE_hough_lines_init_space() にて投票空間の初期化を行ってください。

stq , edq パラメータは、検出したい直線の向きの範囲を角度で表したものです。 角度範囲 stq , edq は以下の条件を満たさなければなりません。

  • -360≦ stq ≦360
  • 0≦ edq ≦360
  • stqedq
  • edq-stq < 360
sx , sy , ex , ey パラメータは fnFIE_hough_lines_voting() にて投票するエッジ点の存在する座標領域を指定するパラメータです。 本パラメータに従ってハフ平面が生成されるため、この領域をはみ出すエッジ点を投票することは出来ません。 本パラメータは、以下の条件を満たさなければなりません。
  • ex - sx >= 2
  • ey - sy >= 2
本関数でオープンしたオブジェクトは不要になったら fnFIE_free_object() にて解放してください。

引数:
[in] stq 検出する直線の法線方向の角度の範囲の始値(-360〜360, 単位:度)
[in] edq 検出する直線の法線方向の角度の範囲の終値(0〜360, 単位:度)
[in] sx 投票するエッジが存在する領域の左上X座標
[in] sy 投票するエッジが存在する領域の左上Y座標
[in] ex 投票するエッジが存在する領域の右下X座標
[in] ey 投票するエッジが存在する領域の右下Y座標
[out] exerr エラーコード。エラーコードを受け取る必要の無い場合は、NULLを指定します。
戻り値:
正常にオープンできた場合は、直線ハフ構造体のハンドルを返します。 パラメータエラーもしくはメモリ不足の場合は、NULLを返します。
戻り値:
*exerr==F_ERR_NONE 正常終了
*exerr==F_ERR_NOMEMORY メモリ不足エラー
*exerr==F_ERR_INVALID_PARAM パラメータエラー
*exerr==F_ERR_UNINIT_LIB 未初期化( fnFIE_setup() を実行していない )
*exerr==F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_hough_lines_init_space ( FHANDLE  hHough  ) 

ハフ投票空間の初期化

ハフ投票空間全体を0クリアします。

引数:
[in] hHough オープン済みハフ構造体のハンドル
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 不正なハフオブジェクトが渡された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー

INT FVALGAPI fnFIE_hough_lines_voting ( FHANDLE  hHough,
const F_EDGE edges,
INT  edge_num,
INT  vot_width,
INT *  voting_num 
)

ハフ空間への投票(整数型エッジ点群)

勾配付きエッジ点群( F_EDGE * )からハフ投票空間への投票を行ないます。 投票するエッジ点の方向は-180〜180度の範囲でなければいけません。 この範囲でないエッジ点が指定された場合、エラーとなり F_ERR_INVALID_PARAM が返されます。 なお、エッジ勾配強度は投票には用いられません(本関数では使用されない)ので、値のチェックは行いません。 勾配方向についての詳細は 総合ドキュメントのエッジ角度 をご参照ください。

また、投票するエッジ点の座標は、 fnFIE_hough_lines_open() で指定した領域内にある必要があります。 領域外のエッジ点は投票に使われず無視されます。

投票されるエッジ点は、必ず勾配付きエッジ点群でなければなりません。 勾配が無いエッジ点群が投票された場合、正しく直線が検出されないので注意が必要です。

fnFIE_hough_lines_init_space() をコールしない限りはハフ投票空間は初期化されないため、 本ライブラリを複数回コールして投票値を累積させることも可能です。

vot_width パラメータはハフ空間における投票の角度範囲の片幅です。 例えば、 vot_width=10 とした場合、あるエッジの向きが 45 度であれば、 このエッジの投票される範囲は 35 度から 55 度となります(下図を参照してください)。

fie_xlhough_voting.png

この範囲を小さくすれば投票にかかる処理時間も短縮され、また、投票結果のピークの先鋭化もはかれます。 逆にエッジの向きがさほど信用出来ないような状況では真の回答の直線に投票されずに、検出に失敗する恐れもあります。 通常の画像に対しては vot_width=10 くらいから試してみることをお勧めします。

勾配角度 q を持つエッジ点に対して実際に投票されるθの範囲は次の通りとなります。
q-vot_width ≦ θ ≦ q+vot_width
かつ stq ≦ θ ≦ edq
ただし、 mod 360 で考えます。 なお、 stq , edqfnFIE_hough_lines_open() で指定したパラメータです。 q の値によっては投票に使用されないエッジ点も存在し得ます。 例えば、オープンで指定した直線の範囲が -10 度から 10 度で、 本ライブラリの vot_width が 20 度である場合、 向きが 180 度であるエッジ点は仮に投票されるとしても 160 度から 200 度の範囲であり、 直線の範囲 -10 度から 10 度にはないので、投票には寄与しません(無視されます)。

引数:
[in] hHough 直線検出ハフ構造体のハンドル。 fnFIE_hough_lines_open() で取得。
[in] edges 投票する勾配付きエッジ点群(エッジ勾配強度は必要なし)
[in] edge_num エッジ点( edges )の数
[in] vot_width 投票θ片幅(0〜179, 単位:度)
[out] voting_num 投票されたエッジ数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 不正なハフオブジェクトが渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_voting_d()

INT FVALGAPI fnFIE_hough_lines_voting_d ( FHANDLE  hHough,
const F_DEDGE edges,
INT  edge_num,
INT  vot_width,
INT *  voting_num 
)

ハフ空間への投票(実数型エッジ点群)

勾配付きエッジ点群( F_DEDGE * )からハフ投票空間への投票を行ないます。 投票するエッジ点の方向は $-\pi$$\pi$ の範囲でなければいけません。 この範囲でないエッジ点が指定された場合、エラーとなり F_ERR_INVALID_PARAM が返されます。 なお、エッジ勾配強度は投票には用いられません(本関数では使用されない)ので、値のチェックは行いません。 勾配方向についての詳細は 総合ドキュメントのエッジ角度 をご参照ください。

また、投票するエッジ点の座標は、 fnFIE_hough_lines_open() で指定した領域内にある必要があります。 領域外のエッジ点は投票に使われず無視されます。

fnFIE_hough_lines_voting() との違いは、投票する勾配付きエッジ点群が F_DEDGE であることです。 エッジ点群のx、y座標はそれぞれ fnFIE_d4i5() により四捨五入された後、計算に用いられます。 エッジ勾配方向も、-180〜180度の範囲に変換して四捨五入がなされた後、計算に用いられます。

投票されるエッジ点は、必ず勾配付きエッジ点群でなければなりません。 勾配が無いエッジ点群が投票された場合、正しく直線が検出されないので注意が必要です。

fnFIE_hough_lines_init_space() をコールしない限りはハフ投票空間は初期化されないため、 本ライブラリを複数回コールして投票値を累積させることも可能です。

vot_width パラメータはハフ空間における投票の角度範囲の片幅です。 例えば、 vot_width=10 とした場合、あるエッジの向きが 45 度であれば、 このエッジの投票される範囲は 35 度から 55 度となります(下図を参照してください)。

fie_xlhough_voting.png

この範囲を小さくすれば投票にかかる処理時間も短縮され、また、投票結果のピークの先鋭化もはかれます。 逆にエッジの向きがさほど信用出来ないような状況では真の回答の直線に投票されずに、検出に失敗する恐れもあります。 通常の画像に対しては vot_width=10 くらいから試してみることをお勧めします。

勾配角度 q を持つエッジ点に対して実際に投票されるθの範囲は次の通りとなります。
q-vot_width ≦ θ ≦ q+vot_width
かつ stq ≦ θ ≦ edq
ただし、 mod 360 で考えます。 なお、 stq , edqfnFIE_hough_lines_open() で指定したパラメータです。 q の値によっては投票に使用されないエッジ点も存在し得ます。 例えば、オープンで指定した直線の範囲が -10 度から 10 度で、 本ライブラリの vot_width が 20 度である場合、 向きが 180 度であるエッジ点は仮に投票されるとしても 160 度から 200 度の範囲であり、 直線の範囲 -10 度から 10 度にはないので、投票には寄与しません(無視されます)。

引数:
[in] hHough 直線検出ハフ構造体のハンドル。 fnFIE_hough_lines_open() で取得。
[in] edges 投票する勾配付きエッジ点群(エッジ勾配強度は必要なし)
[in] edge_num エッジ点( edges )の数
[in] vot_width 投票θ片幅(0〜179, 単位:度)
[out] voting_num 投票されたエッジ数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 不正なハフオブジェクトが渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_voting()

INT FVALGAPI fnFIE_hough_lines_detection ( const FHANDLE  hHough,
INT  request_line_num,
INT  rgn_r,
INT  rgn_q,
F_LH_LINE ans_lines,
INT *  line_num 
)

ハフ直線検出

投票結果を元に、直線を検出します。 ハフ投票空間上から、投票スコアの高い順に request_line_num 本の直線を検出します。 ただし、投票空間において規定の最小投票数(内部固定)を満たすピークが 要求数に満たない場合には、検出される直線の数はそれよりも少なくなります。

本関数では、ハフ投票空間を書き換えてしまうため、 再度直線検出を行う場合は、投票をし直さなければいけません。

本関数では、検出した直線を保持するためのメモリ確保は行いません。 そのため、 ans_lines は、あらかじめ request_line_num 個以上の メモリを確保した状態でなければいけません。

引数:
[in,out] hHough ハフ構造体のハンドル
[in] request_line_num 検出要求数(1以上)
[in] rgn_r ρ方向極大値決定サイズ(0以上, 単位:ピクセル)
[in] rgn_q θ方向極大値決定サイズ(0〜179, 単位:度)
[out] ans_lines 検出結果直線( request_line_num 個以上のメモリが必要)
[out] line_num 検出された直線の数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_OBJECT 不正なハフオブジェクトが渡された
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
処理結果例:
以下は、 fnFIE_edge_sobel() にて検出したエッジに対してハフ直線検出をした結果です。
fnFIE_edge_sobel() で指定したパラメータは以下の通りです。
  • params.mag_threshold = 40
  • params.nms_length = 1
本関数にて指定したパラメータは以下の通りです。
  • rgn_r = 10
  • rgn_q = 10
  • ans_lines = 10

なお、処理結果画像は、実際に検出・入力したエッジ点、検出した直線を入力画像に描画した画像です。
fie_hough_line_input_img.png

入力画像

fie_hough_line_input_edge.png

入力エッジ画像

fie_hough_line_output_line.png

処理結果画像

使用例
//エラー処理は省略しているの注意してください
#include "fie.h"
#include "oal_aloc.h"


void hough_lines()
{
    FHANDLE hsrc = NULL;    //入力画像
    FHANDLE htmp = NULL;    //途中結果画像
    
    // ソーベルフィルタを利用したエッジ検出のパラメータ定義
    F_EDGE_SOBEL_PARAMS params; //ソーベルエッジ用パラメータ構造体
    UINT    feat_mode;          //ボーダーモードの指定
    INT     border_mode;        //勾配方向、強度データ保持の指定
    DPNT_T  offset;             //オフセット量
    F_DEDGE * pedges = NULL;        //取得されるエッジ
    INT edge_num ;              //取得されるエッジの数
    INT i;

    // ハフ直線検出のパラメータ定義
    FHANDLE hHough = NULL;  //ハフ投票空間
    
    INT stq,edq;            //検出する直線の向きの範囲の始値、終値    
    INT sx,sy;              //投票するエッジが存在する領域の左上x座標、y座標
    INT ex,ey;              //投票するエッジが存在する領域の右下x座標、y座標
    INT vot_width;          //投票θ片幅
    INT voting_num;         //投票されたエッジ数
    
    INT request_line_num;           //検出する直線の要求数
    INT rgn_r;                      //ρ方向極大値決定サイズ
    INT rgn_q;                      //θ方向極大値決定サイズ
    F_LH_LINE* ans_lines = NULL;    //検出結果直線
    INT line_num;                   //検出された直線の数

    INT src_width;                  //入力画像の幅
    INT src_height;                 //入力画像の高さ
    INT j;

    //************************ソーベルフィルタによるエッジ検出処理************************
    //入力画像をファイルから読み込む
    fnFIE_load_bmp("src_img.bmp", &hsrc, F_COLOR_IMG_TYPE_UC8 );

    //パラメータの設定
    params.mag_threshold = 40;
    params.nms_length = 1;

    feat_mode = F_EDGE_FEAT_DIRECT; //直線検出を行うために、必ず勾配方向を指定してエッジを検出する
    border_mode = F_BORDER_NONE;
    offset.x = offset.y = 0.0;

    // ソーベルフィルタを利用したエッジ検出(サブピクセル精度)の実行
    fnFIE_edge_sobel_subpix(hsrc, NULL, &params, 
                            feat_mode, border_mode, offset, 
                            &pedges, &edge_num);
    

    //取得したエッジ点を画像上へプロットする
    fnFIE_img_root_copy(hsrc, &htmp);
    for(i = 0; i < edge_num; i++){
        DPNT_T pnt;
        DOUBLE prot_val=255;

        pnt.x = pedges[i].x;
        pnt.y = pedges[i].y;

        fnFIE_draw_point(htmp, &prot_val, pnt);
    }

    //途中画像の保存
    fnFIE_save_bmp("tmp_img.bmp", htmp);
    


    //************************検出されたエッジ点から直線検出処理************************
    //直線検出ハフライブラリのオープン用パラメータを設定
    stq = 0;                                    //検出する直線の向きの範囲の始値
    edq = 359;                                  //検出する直線の向きの範囲の終値
    
    //投票するエッジが存在する領域の設定 ここでは入力画像全体で設定する
    src_width = fnFIE_img_get_width(hsrc);      //入力画像の幅
    src_height = fnFIE_img_get_height(hsrc);    //入力画像の高さ
    sx = sy = 0;                                //領域の左上座標は0で設定
    ex = src_width;                             //領域の右下x座標は画像の幅で設定
    ey = src_height;                            //領域の右下y座標は画像の高さで設定

    //直線検出ハフライブラリのオープン
    hHough = fnFIE_hough_lines_open(stq, edq, sx, sy, ex, ey, NULL);
    
    //直線ハフ投票空間の初期化
    fnFIE_hough_lines_init_space(hHough);

    //エッジの投票用パラメータ設定
    vot_width = 10;     

    //エッジの投票
    fnFIE_hough_lines_voting_d(hHough, pedges, edge_num, 
                                vot_width, &voting_num);

    //直線検出のパラメータを設定
    rgn_r = 10;
    rgn_q = 10;
    request_line_num  = 10;
    
    //直線検出結果を保存するメモリを確保する
    ans_lines = (F_LH_LINE*)fnOAL_malloc((sizeof( F_LH_LINE)) * request_line_num);

    //直線の検出
    fnFIE_hough_lines_detection(hHough, request_line_num, rgn_r, rgn_q, 
                                    ans_lines, &line_num);

    //取得した直線を画像上へプロットする
    for(j = 0; j < line_num; j++){
        DLINE_T line;
        DOUBLE prot_val=255;

        line.a = ans_lines[j].a ;
        line.b = ans_lines[j].b ;
        line.c = ans_lines[j].c ;
        fnFIE_draw_line(hsrc, &prot_val, line);
    }

    //結果画像の保存
    fnFIE_save_bmp("dst_img.bmp", hsrc);

    //使用した画像オブジェクトの開放
    fnFIE_free_object(hsrc);
    fnFIE_free_object(htmp);

    //ヒープメモリで確保したメモリはfnOAL_free関数により解放する
    fnOAL_free(pedges);     //取得したエッジの開放
    fnOAL_free(ans_lines);  //取得した直線の開放

    //ハフ空間の開放
    fnFIE_free_object(hHough);

}


INT main()
{
    //FIEライブラリの初期化
    fnFIE_setup();

    //ハフ直線の検出
    hough_lines();

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

    return 0;
}


INT FVALGAPI fnFIE_hough_lines_refine_line ( F_LH_LINE line,
const F_EDGE edges,
INT  edge_num,
INT  err_r,
INT  err_q,
INT *  pnt_num 
)

直線係数を最小自乗法で求め直す(整数型エッジ点群)

指定された1本の直線とエッジ点群から、その直線の近くにある、と判定される点群を選び出し、 これらに対して最小自乗法で直線の方程式を求め直します。 本関数はハフ平面とは関連しないため、引数として直線とエッジ点群のみを取り、 直線検出ハフ構造体は引数に取りません。(必要ない)

line パラメータには fnFIE_hough_lines_detection() で得られた回答直線のうちの1本を選んで入力してください。 正常終了すると、 *line は新たに求められた直線の係数値に書き換えられます。 但し、異常終了した場合には、元の係数が保持されます。

edges パラメータには、直線の近くにある可能性のあるエッジ点群です。 このエッジ点群の中から直線上にある点が選ばれます。

err_r パラメータはエッジ点が直線の近くにあるかどうかを判定するための値です。 具体的には、直線とエッジ点との距離が err_r 以内の場合、このエッジ点が直線の近くにある、 と判定され最小自乗法の計算に使用されます(下図を参照してください)。

err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。 具体的には、直線の向きとエッジ点の向きとの差の絶対値が err_q 以内の場合、 このエッジ点が直線の真のエッジである、と判定され最小自乗法の計算に使用されます(下図を参照してください)。

fie_hough_lines_refine_line.png

引数:
[in,out] line 直線係数
[in] edges エッジ点群(エッジ勾配方向、強度共に必要なし)
[in] edge_num エッジ点( edges )の数
[in] err_r ρ方向許容誤差(0以上, 単位:ピクセル)
[in] err_q θ方向許容誤差(0以上, 単位:度)
[out] pnt_num 直線の上にあるエッジ点の数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_CALC_IMPOSSIBLE 直線の係数が不定となるようなデータが与えられたための異常終了
F_ERR_CALC_OVERFLOW 計算の途中でオーバーフローが起こったための異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_refine_line_d()

INT FVALGAPI fnFIE_hough_lines_refine_line_d ( F_LH_LINE line,
const F_DEDGE edges,
INT  edge_num,
DOUBLE  err_r,
DOUBLE  err_q,
INT *  pnt_num 
)

直線係数を最小自乗法で求め直す(実数型エッジ点群)

指定された1本の直線とエッジ点群から、その直線の近くにある、と判定される点群を選び出し、 これらに対して最小自乗法で直線の方程式を求め直します。 本関数はハフ平面とは関連しないため、引数として直線とエッジ点群のみを取り、 直線検出ハフ構造体は引数に取りません。(必要ない)

fnFIE_hough_lines_refine_line() との違いは、勾配付きエッジ点群が F_DEDGE であることです。 エッジ点群のx、y座標はそれぞれ fnFIE_d4i5() により四捨五入された後、最小自乗法により計算されます。 ただし、直線とエッジ点との距離の計算は、実数のまま行われます。 エッジ勾配方向も、-180〜180度の範囲に変換して四捨五入がなされた後、計算に用いられます。 勾配方向についての詳細は 総合ドキュメントのエッジ角度 をご参照ください。 エッジ勾配強度は、本関数では使用されません。

line パラメータには fnFIE_hough_lines_detection() で得られた回答直線のうちの1本を選んで入力してください。 正常終了すると、 *line は新たに求められた直線の係数値に書き換えられます。 但し、異常終了した場合には、元の係数が保持されます。

edges パラメータには、直線の近くにある可能性のあるエッジ点群です。 このエッジ点群の中から直線上にある点が選ばれます。

err_r パラメータはエッジ点が直線の近くにあるかどうかを判定するための値です。 具体的には、直線とエッジ点との距離が err_r 以内の場合、このエッジ点が直線の近くにある、 と判定され最小自乗法の計算に使用されます(下図を参照してください)。

err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。 具体的には、直線の向きとエッジ点の向きとの差の絶対値が err_q 以内の場合、 このエッジ点が直線の真のエッジである、と判定され最小自乗法の計算に使用されます(下図を参照してください)。

fie_hough_lines_refine_line.png

引数:
[in,out] line 直線係数
[in] edges エッジ点群(エッジ勾配方向、強度共に必要なし)
[in] edge_num エッジ点( edges )の数
[in] err_r ρ方向許容誤差(0以上, 単位:ピクセル)
[in] err_q θ方向許容誤差(0以上, 単位:度)
[out] pnt_num 直線の上にあるエッジ点の数
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_CALC_IMPOSSIBLE 直線の係数が不定となるようなデータが与えられたための異常終了
F_ERR_CALC_OVERFLOW 計算の途中でオーバーフローが起こったための異常終了
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_refine_line()

INT FVALGAPI fnFIE_hough_lines_get_support_edges ( const F_LH_LINE line,
const F_EDGE edges,
INT  edge_num,
INT  err_r,
INT  err_q,
F_EDGE **  support_edges,
INT *  neib_num,
INT *  sort_type 
)

直線に近いエッジ点群の取得(整数型エッジ点群)

与えられたエッジ点群と直線から、その直線の近くにある点群を取得します。 回答の点群はx座標またはy座標に関してソートされます。 x座標順にソートされるか、y座標順にソートされるかを 呼び出し側で指定することは出来ません。

support_edges には本関数内で確保したメモリ領域が返さまれす。 解放は呼び出し側に任されますので、不要になったら fnOAL_free() にて解放してください。 また、 *support_edges がNULLで初期化されていない場合は、エラーとなります。 見つかったエッジ点数が0個の場合は、領域は確保されず NULLポインタが返されます。

edges の中から、許容誤差範囲内の直線の近くのエッジ点群が取得されます。

err_r パラメータはエッジ点が直線の近くにあるかどうかを判定するための値です。 err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。

引数:
[in] line 直線の方程式
[in] edges エッジ点群(エッジ勾配方向、強度共に必要なし)
[in] edge_num エッジ点の数
[in] err_r ρ方向許容誤差(0以上, 単位:ピクセル)
[in] err_q θ方向許容誤差(0以上, 単位:度)
[out] support_edges 直線の近くのエッジ点群
[out] neib_num 回答した「直線近くのエッジ点」の数
[out] sort_type support_edges のソートタイプ
  • 0:x座標でソート
  • 1:y座標でソート
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_CALC_IMPOSSIBLE 計算不能エラー(エッジ点が見つからなかった)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_refine_line() , fnFIE_hough_lines_get_support_edges_d()

INT FVALGAPI fnFIE_hough_lines_get_support_edges_d ( const F_LH_LINE line,
const F_DEDGE edges,
INT  edge_num,
DOUBLE  err_r,
DOUBLE  err_q,
F_DEDGE **  support_edges,
INT *  neib_num,
INT *  sort_type 
)

直線に近いエッジ点群の取得(実数型エッジ点群)

与えられたエッジ点群と直線から、その直線の近くにある点群を取得します。 回答の点群はx座標またはy座標に関してソートされます。 x座標順にソートされるか、y座標順にソートされるかを呼び出し側で指定することは出来ません。

fnFIE_hough_lines_get_support_edges() との違いは、入力、出力共に勾配付きエッジ点群が F_DEDGE であることです。 エッジ点群のx、y座標は、実数のまま計算に用いられます。 エッジ勾配方向は、-180〜180度の範囲に変換して四捨五入がなされた後、計算に用いられます。 勾配方向についての詳細は 総合ドキュメントのエッジ角度 をご参照ください。 エッジ勾配強度は、本関数では使用されません。

support_edges には本関数内で確保したメモリ領域が返さまれす。 解放は呼び出し側に任されますので、不要になったら fnOAL_free() にて解放してください。 また、 *support_edges がNULLで初期化されていない場合は、エラーとなります。 見つかったエッジ点数が0個の場合は、領域は確保されず NULLポインタが返されます。

edges の中から、許容誤差範囲内の直線の近くのエッジ点群が取得されます。

err_r パラメータはエッジ点が直線の近くにあるかどうかを判定するための値です。 err_q はエッジ点が直線の真のエッジ点であるかどうかを判定するための値です。

引数:
[in] line 直線の方程式
[in] edges エッジ点群(エッジ勾配方向、強度共に必要なし)
[in] edge_num エッジ点の数
[in] err_r ρ方向許容誤差(0以上, 単位:ピクセル)
[in] err_q θ方向許容誤差(0以上, 単位:度)
[out] support_edges 直線の近くのエッジ点群
[out] neib_num 回答した「直線近くのエッジ点」の数
[out] sort_type support_edges のソートタイプ
  • 0:x座標でソート
  • 1:y座標でソート
戻り値:
F_ERR_NONE 正常終了
F_ERR_INVALID_PARAM 不正なパラメータが渡された
F_ERR_NOMEMORY メモリ不足エラー
F_ERR_CALC_IMPOSSIBLE 計算不能エラー(エッジ点が見つからなかった)
F_ERR_NO_LICENCE ライセンスエラー、または未初期化エラー
参照:
fnFIE_hough_lines_refine_line_d() , fnFIE_hough_lines_get_support_edges()

FHANDLE FVALGAPI fnFIE_hough_lines_get_space ( FHANDLE  hHough,
INT *  stq,
INT *  edq,
INT *  str,
INT *  edr 
)

ハフ投票空間の取得

ハフ投票空間を画像オブジェクトとして取得します。 取得される画像オブジェクトの画素タイプは F_IMG_US16 、チャネル数は1となります。 取得した画像オブジェクトハンドルは不要になったら fnFIE_free_object() によって ユーザー側で解放を行ってください。

fnFIE_hough_lines_voting() , fnFIE_hough_lines_voting_d() で投票されたハフ投票空間は、 fnFIE_hough_lines_detection() を実行することで書き換えられてしまいます。 投票直後のハフ投票空間が必要な場合は、 fnFIE_hough_lines_detection() 実行前に、 本関数で取得した画像オブジェクトのコピーを作成してください。

なお、この画像オブジェクトは fnFIE_img_root_import_alloc() により、 実際に使用しているハフ投票空間をアタッチして作成されます。 そのため、投票空間の実メモリは hHough が保持しており、解放は hHough の解放と連動して行われます。 また、この関数で帰される画像オブジェクトを直接処理すると、 hHough に保持されているハフ投票空間が書き換わります。 fnFIE_hough_lines_ 関数群において hHough 内のハフ投票空間を処理した場合も同様です。

引数:
[in] hHough ハフ構造体のハンドル
[out] stq ハフ投票空間のθ方向の始点
[out] edq ハフ投票空間のθ方向の終点
[out] str ハフ投票空間のr方向の始点
[out] edr ハフ投票空間のr方向の終点
戻り値:
正常にオープンできた場合は、画像オブジェクト(type:us16, channel:1)のハンドルを返します。 ライセンスエラー、未初期化エラー、パラメータエラーもしくはメモリ不足の場合は、NULLを返します。


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