CV リファレンス マニュアル
-
画像処理(Image Processing)
- 勾配,エッジ,コーナー(Gradients, Edges and Corners)
- サンプリング,補間,幾何変換(Sampling, Interpolation and Geometrical Transforms)
- モルフォロジー演算(Morphological Operations)
- フィルタと色変換(Filters and Color Conversion)
- ピラミッドとその応用(Pyramids and the Applications)
- 画像分割,領域結合,輪郭検出(Image Segmentation, Connected Components and Contour Retrieval)
- 画像と形状のモーメント(Image and Contour Moments)
- 特殊な画像変換(Special Image Transforms)
- ヒストグラム(Histograms)
- マッチング(Matching)
- 構造解析(Structural Analysis)
- モーション解析と物体追跡(Motion Analysis and Object Tracking)
- パターン認識(Pattern Recognition)
- カメラキャリブレーションと3次元再構成(Camera Calibration and 3D Reconstruction)
- 参考文献
画像処理(Image Processing)
注釈:
この章では画像処理及び解析のための関数について述べる.ほとんどの関数はピクセルの2次元配列に対して実行される.OpenCVでは配列を「画像」として取り扱う.しかしその配列はIplImage形式である必要はなく,CvMat形式またはCvMatND形式でもよい.
マッチング(Matching)
MatchTemplate
テンプレートと重なった画像領域を比較する
void cvMatchTemplate( const CvArr* image, const CvArr* templ,
CvArr* result, int method );
- image
- テンプレートマッチングを行う画像. 8ビットか32ビット浮動小数点型でなければならない.
- templ
- 探索用テンプレート.画像より大きくてはならない,かつ画像と同じタイプである必要がある.
- result
- 比較結果のマップ.シングルチャンネルの32ビット浮動小数点型データ.image が W×H で templ が w×h ならば, result は W-w+1×H-h+1のサイズが必要.
- method
- テンプレートマッチングの方法(以下を参照).
関数cvMatchTemplate は, cvCalcBackProjectPatch に類似している. templを,image全体に対してスライドさせ,それとサイズ w×h で重なる領域とを指定された方法で比較し,その結果を result に保存する. 以下に,この関数で指定可能な比較手法を表す式を示す. (I は画像を,T はテンプレートを,R は結果をそれぞれ表す. 総和計算は,以下のようにテンプレートと(または)画像領域に対して行われる.x'=0..w-1, y'=0..h-1).
method=CV_TM_SQDIFF: R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2 method=CV_TM_SQDIFF_NORMED: R(x,y)=sumx',y'[T(x',y')-I(x+x',y+y')]2/sqrt[sumx',y'T(x',y')2•sumx',y'I(x+x',y+y')2] method=CV_TM_CCORR: R(x,y)=sumx',y'[T(x',y')•I(x+x',y+y')] method=CV_TM_CCORR_NORMED: R(x,y)=sumx',y'[T(x',y')•I(x+x',y+y')]/sqrt[sumx',y'T(x',y')2•sumx',y'I(x+x',y+y')2] method=CV_TM_CCOEFF: R(x,y)=sumx',y'[T'(x',y')•I'(x+x',y+y')], where T'(x',y')=T(x',y') - 1/(w•h)•sumx",y"T(x",y") I'(x+x',y+y')=I(x+x',y+y') - 1/(w•h)•sumx",y"I(x+x",y+y") method=CV_TM_CCOEFF_NORMED: R(x,y)=sumx',y'[T'(x',y')•I'(x+x',y+y')]/sqrt[sumx',y'T'(x',y')2•sumx',y'I'(x+x',y+y')2]比較終了後,関数cvMinMaxLoc により,最も良いマッチング結果を最小値(CV_TM_SQDIFF*)あるいは最大値(CV_TM_CCORR* と CV_TM_CCOEFF*)として検出することができる.カラー画像,カラーテンプレートの場合は,分母・分子それぞれの総和計算は全てのチャンネルについて行われる(各チャンネルで用いる平均値はそれぞれ違う).
MatchShapes
二つの形状を比較する
double cvMatchShapes( const void* object1, const void* object2,
int method, double parameter=0 );
- object1
- 1番目の輪郭,あるいはグレースケール画像.
- object2
- 2番目の輪郭,あるいはグレースケール画像.
- method
- 比較方法.CV_CONTOUR_MATCH_I1, CV_CONTOURS_MATCH_I2,あるいは CV_CONTOURS_MATCH_I3 のいずれか.
- parameter
- それぞれの比較手法特有のパラメータ(現在未使用).
関数 cvMatchShapes は,二つの形状を比較する.以下に示すように,実装されている3つの手法のいずれもHuモーメント(cvGetHuMoments参照)を用いている (ここでAはobject1,Bはobject2を示す).
method=CV_CONTOURS_MATCH_I1: I1(A,B)=sumi=1..7abs(1/mAi - 1/mBi) method=CV_CONTOURS_MATCH_I2: I2(A,B)=sumi=1..7abs(mAi - mBi) method=CV_CONTOURS_MATCH_I3: I3(A,B)=sumi=1..7abs(mAi - mBi)/abs(mAi) ここで, mAi=sign(hAi)•log(hAi), mBi=sign(hBi)•log(hBi), hAi, hBi は,AとBそれぞれのHuモーメント.
CalcEMD2
二つの,重み付き点分布間の 「最小コスト(minimal work)」 距離を計算する.
float cvCalcEMD2( const CvArr* signature1, const CvArr* signature2, int distance_type,
CvDistanceFunction distance_func=NULL, const CvArr* cost_matrix=NULL,
CvArr* flow=NULL, float* lower_bound=NULL, void* userdata=NULL );
typedef float (*CvDistanceFunction)(const float* f1, const float* f2, void* userdata);
- signature1
- 1番目のシグネチャ(点分布),size1×dims+1の浮動小数点型行列.各行は, 重みの後に座標を保存する.ユーザ定義のコスト行列を用いる場合は,1列の行列(重みだけ)でも構わない.
- signature2
- 2番目のシグネチャ(点分布)(signature1と同じフォーマット).行数や重みの合計が異なることもあるが,この場合は余分の"dummy" 点が signature1 か signature2 のどちらかに追加される.
- distance_type
- 用いる評価指標. CV_DIST_L1, CV_DIST_L2, CV_DIST_C は 標準評価指標を表す.CV_DIST_USER はユーザ定義関数 distance_func あるいは,あらかじめ計算された cost_matrix が用いられることを意味する.
- distance_func
- ユーザ定義距離関数.2点の座標を与えると,その点間の距離を返す.
- cost_matrix
- ユーザ定義の size1×size2のコスト行列. 少なくとも,cost_matrix と distance_func のいずれか一つは NULL でなければならない. コスト行列を用いる場合は,下限値(下記参照)の計算は距離定義関数を必要とするため不可能である.
- flow
- 結果の size1×size2のフロー行列(flow matrix). flowij はsignature1のi番目の点からsignature2のj番目の点へのフローを示す.
- lower_bound
- オプションの入出力パラメータ.二つのシグネチャ間の距離(重心間の距離)の下限値.ユーザ定義コスト行列が用いられる場合,点分布同士の重みの合計が等しくない場合,あるいは,重みだけで構成されるシグネチャが存在する(つまり,シグネチャ行列が1列だけの行列)場合など,下限値は計算されないことがある.ユーザは 必ず *lower_bound を初期化しなければならない. 計算された重心間の距離が *lower_bound 以上の場合(シグネチャ間が十分離れていることを意味する),この関数はEMDを計算しない.いずれの場合でも,*lower_bound には,戻り値である計算された重心間の距離がセットされる.従って,重心間距離とEMDの両方の計算が必要な場合は,*lower_bound を 0 にセットする必要がある.
- userdata
- ユーザ定義の距離関数に渡されるオプションデータへのポインタ.
関数 cvCalcEMD2 は,Earth Mover's Distance と(または)二つの重み付き点群間の距離の下限値を計算する. [RubnerSept98]に述べられているアプリケーションの一つは,画像抽出のための多次元ヒストグラムの比較である. EMD は変形シンプレックス法を用いて解く輸送問題(transportation problem)である.そのため最悪の場合の計算複雑さは指数関数的に大きくなるが,平均的には十分高速に計算可能である.実際の使用においては,下限値は十分高速に計算される(線形時間アルゴリズムを用いる).そして,二つのシグネチャ間が十分離れていて同じオブジェクトと認識できないかどうかを,大まかに判定するために用いることができる.