CV リファレンス マニュアル
最終変更者: 怡土順一, 最終変更リビジョン: 448, 最終変更日時: 2008-12-24 00:28:23 +0900 (水, 24 12月 2008)
-
画像処理(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)
- (ピンホールカメラモデル, 歪み(Pinhole Camera Model, Distortion))
- カメラキャリブレーション(Camera Calibration)
- 姿勢推定(Pose Estimation)
- エピポーラ幾何(Epipolar Geometry)
- 参考文献
カメラキャリブレーションと3次元再構成(Camera Calibration and 3D Reconstruction)
エピポーラ幾何(Epipolar Geometry)
FindFundamentalMat
2枚の画像間の点対応から基礎行列(F行列)を計算する
int cvFindFundamentalMat( const CvMat* points1,
const CvMat* points2,
CvMat* fundamental_matrix,
int method=CV_FM_RANSAC,
double param1=1.,
double param2=0.99,
CvMat* status=NULL);
- points1
- 大きさが2xN, Nx2, 3xN,また は Nx3 の1枚目の画像上の点の配列 (N は点の数). マルチチャンネルで大きさ 1xN,または Nx1 の配 列も使用可能である. 点の座標は浮動小数点型で表される(単精度または倍精度).
- points2
- 2枚目の画像上の点の配列で point1とフォーマッ トやサイズは同じ.
- fundamental_matrix
- 出力される基礎行列.サイズは 3x3, または 9x3(7-point methodは3つの行列を返す).
- method
- 基礎行列の計算手法.
- CV_FM_7POINT - 7-pointアルゴリズム. N == 7
- CV_FM_8POINT - 8-pointアルゴリズム. N >= 8
- CV_FM_RANSAC - RANSAC アルゴリズム. N >= 8
- CV_FM_LMEDS - LMedSアルゴリズム. N >= 8
- CV_FM_7POINT - 7-pointアルゴリズム. N == 7
- param1
- RANSAC またはLMedSメソッドのときにのみ使用されるパラメー タ.点からエピポーラ線までの最大距離(その距離を超えるもの は外れ値であると判断し,それらを最終的な基礎行列の計算に使 用しない)をピクセル単位で示す.通常は0.5 または 1.0にセッ トされる.
- param2
- RANSAC または LMedSメソッドのときにのみ使用されるパラメータ. 行列の計算精度の信頼レベルを示す.
- status
- N個の要素をもつオプションの出力配列.各要素において外れ値 のときは0,そうでないときは1がセットされている. この配列はRANSACまた はLMedSメソッドのときのみ計算される.他の手法では,すべて1にセットされる.
エピポーラ幾何は以下の式で表される.
p2T*F*p1=0,
ここで F は基礎行列,p1 と p2 は2枚の画像間での対応点である.
関数 cvFindFundamentalMat は,基礎行列を上記の4つの手法の うちの1つを用いて計算し,求めた基礎行列の数(1 または 3) を返す.もし行列が求まらないときは0を返す.
計算された基礎行列は,この後cvComputeCorrespondEpilinesに渡され,指定された点に対応するエピポーラ線を求める.
(例)RANSACアルゴリズムを用いた基礎行列の推定
int point_count = 100; CvMat* points1; CvMat* points2; CvMat* status; CvMat* fundamental_matrix; points1 = cvCreateMat(1,point_count,CV_32FC2); points2 = cvCreateMat(1,point_count,CV_32FC2); status = cvCreateMat(1,point_count,CV_8UC1); /* 点対応を与える */ for( i = 0; i < point_count; i++ ) { points1->data.db[i*2] = <x1,i>; points1->data.db[i*2+1] = <y1,i>; points2->data.db[i*2] = <x2,i>; points2->data.db[i*2+1] = <y2,i>; } fundamental_matrix = cvCreateMat(3,3,CV_32FC1); int fm_count = cvFindFundamentalMat( points1,points2,fundamental_matrix, CV_FM_RANSAC,1.0,0.99,status );
ComputeCorrespondEpilines
ステレオ画像の一方の画像上の点に対応する他方の画像上の エピポーラ線を計算する
void cvComputeCorrespondEpilines( const CvMat* points,
int which_image,
const CvMat* fundamental_matrix,
CvMat* correspondent_lines);
- points
- 入力点で大きさは2xN, Nx2, 3xN,また はNx3の配列である (ここで N は 点の数). マルチチャンネルの 1xN,また は Nx1 の配列も使用可能.
- which_image
- pointsを含む画像のインデックス(1 または 2).
- fundamental_matrix
- 基礎行列.
- correspondent_lines
- 計算されたエピポーラ線.大きさ は3xN また Nx3 の配列.
関数 cvComputeCorrespondEpilines は,ステレオ画像の一方の 画像上の各点に対応する他方の画像上の点(つまり,同じ3次元点を投影したもの) を含むような直線の方程式を求める. それぞれの線は,以下に示すように3つの要素 l=[a,b,c]T を持つベクトルで表される.
lT*[x, y, 1]T=0, または a*x + b*y + c = 0基礎行列の定義から (cvFindFundamentalMat を 参照),1枚目の画像(which_image=1)上の 点p1に対応する直線l2は 以下のように計算される.
l2=F*p1また,2枚目の画像(which_image=2)上の 点p2に対応する直線l1は 以下のように計算される.
l1=FT*p2
直線の係数はある範囲内に収まる.この直線は (a2+b2=1)となるように正規化され, correspondent_lines として保存される.
ConvertPointsHomogenious
座標を同次座標系に(または同次座標系から)変換する
void cvConvertPointsHomogenious( const CvMat* src, CvMat* dst );
- src
- 入力点の配列.大きさは2xN, Nx2, 3xN, Nx3, 4xN, またはNx4(ここでNは点の数).マルチチャンネ ルの1xNまたはNx1の配列も使用可能.
- dst
- 出力点の配列.入力配列と同じ数の点が含まれる次元数は,同じ, あるいは入力より1少ないか1大きい.そして2..4の範囲内でなければならない.
関数 cvConvertPointsHomogenious は,2次元または3次元の点を 同次座標系に(または同次座標系から)変換,単純なコピー,あるいは配列の 転置を行う.もし入力配列の次元が出力配列より大きい場合,各座標値はベク トルの最後の座標値(要素値)で割られる.
(x,y[,z],w) -> (x',y'[,z']): x' = x/w y' = y/w z' = z/w (出力が3次元の場合)出力配列の次元が大きい場合は,それぞれの点座標ベクトルに1が加えられる.
(x,y[,z]) -> (x,y[,z],1)これ以外の場合は,入力配列が単純に出力にコピー(オプションとして転置を伴う)される. 注釈:この関数はさまざまな種類の配列を受け付けるので, 入力と出力の次元が不明瞭であるときはエラーを報告する場合がある. この関数を入力点数 N>=5 で使用するか, マルチチャンネルの Nx1 または 1xN の配列を用いれば,常に安全 である.