CV リファレンス マニュアル
-
画像処理(Image Processing)
- 勾配,エッジ,コーナー,特徴(Gradients, Edges, Corners and Features)
- サンプリング,補間,幾何変換(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))
- シングルおよびステレオカメラキャリブレーション(Single and Stereo Camera Calibration)
- 姿勢推定(Pose Estimation)
- エピポーラ幾何,ステレオマッチング(Epipolar Geometry, Stereo Correspondence)
- 参考文献
カメラキャリブレーションと3次元再構成(Camera Calibration and 3D Reconstruction)
ピンホールカメラモデル, 歪み
このセクションの関数は,ピンホールカメラモデルを取り扱う.すなわち,ひ とつのビューは透視投影変換を用いて,3次元座標を画像平面に投影することで 構成されている.
s*m' = A*[R|t]*M', あるいは [u] [fx 0 cx] [r11 r12 r13 t1] [X] s[v] = [0 fy cy]*[r21 r22 r23 t2]*[Y] [1] [0 0 1] [r31 r32 r33 t3] [Z] [1]ここで(X, Y, Z)はワールド座標系の3次元座標であり, (u, v)は画像平面に投影された座標である. Aはカメラ行列,またはカメラの内部パラメータ行列と呼ばれている. (cx, cy)は通常は画像中心である主点(レンズの光学的な中心) であり,fx, fyは焦点距離でピクセル単位で表現される.従って, もしある係数によってカメラ画像がアップサンプリングまたはダウンサンプリ ングされている場合,これらすべてのパラメータ(fx, fy, cx, cy)も同じ係数でスケーリング(それぞれが乗算/除算)されなければな らない. 内部パラメータ行列はビューに依存しないので,一度推定すれば焦点 距離を固定している限りは繰返し使用することができる. また,同次変換行列である [R|t] は外部パラメータと呼ばれる. これは,静的環境に対するカメラの動き,または固定カメラの前のオブジェク トの剛体運動を表す.[R|t] は3次元座標 (X, Y, Z) をそれぞれのカメラ座標系に変換する.上述の変換は,以下の式で z≠0 のときと等しい.
[x] [X] [y] = R*[Y] + t [z] [Z] x' = x/z y' = y/z u = fx*x' + cx v = fy*y' + cy実際のカメラレンズは半径方向の歪みや,わずかな円周方向の歪みを持っているので,上のモデルは以下のように拡張される.
[x] [X] [y] = R*[Y] + t [z] [Z] x' = x/z y' = y/z x" = x'*(1 + k1r2 + k2r4 + k3r6) + 2*p1x'*y' + p2(r2+2*x'2) y" = y'*(1 + k1r2 + k2r4 + k3r6) + p1(r2+2*y'2) + 2*p2*x'*y' ここで r2 = x'2+y'2 u = fx*x" + cx v = fy*y" + cyk1,k2,k3 は半径方向の歪み係数, p1,p2 は円周方向の歪み係数である.高次の係数は OpenCVでは考慮されない.歪み係数はビューに依存しないので,内部パラメー タとなる.またキャプチャした画像の解像度にかかわらず同じままである. つまり,例えば, あるカメラが 320x240 の解像度の画像でキャリブレーションされた場合, 同じカメラの 640x480 の解像度の画像に対しても全く同じ歪み係数を用いることができる (fx,fy,cx,cy は適切にスケーリングされなければならないが).
キャリブレーションに関係する関数の多くは,歪み係数のベクトルを扱う. これは,4x1,1x4,5x1,1x5 の浮動小数点型ベクトル(CvMat*)である. 歪み係数の順番は,以下のようになる:
(k1, k2, p1, p2[, k3]).
つまり,最初に二つの半径方向の歪み係数,次に,二つの円周方向の歪み係数, 最後にオプションとして3番目の半径方向の歪み係数が続く. 以前のバージョンの OpenCV との互換性を保つために,このような順番が利用されている.
このセクションの関数は,以下の目的で使用される.
- 内部パラメータ,外部パラメータによって3次元座標を画像上に投影するため.
- 外部パラメータを,内部パラメータと少数の3次元座標およびそれらの画像上への投影を用いて推定するため.
- カメラパラメータ(内部パラメータおよび外部パラメータ)を複数のキャ リブレーションパターンから推定するため (すべてのビューは対応のとれた3次元位置と画像座標からなる).
シングルおよびステレオカメラキャリブレーション(Single and Stereo Camera Calibration)
ProjectPoints2
3次元空間中の点を画像平面へ投影する
void cvProjectPoints2( const CvMat* object_points, const CvMat* rotation_vector,
const CvMat* translation_vector, const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs, CvMat* image_points,
CvMat* dpdrot=NULL, CvMat* dpdt=NULL, CvMat* dpdf=NULL,
CvMat* dpdc=NULL, CvMat* dpddist=NULL, double aspect_ratio=0 );
- object_points
- オブジェクトの点の配列でその大きさは3xNまたはNx3である.N は画像内の点の個数.
- rotation_vector
- 回転ベクトル.1x3または3x1.
- translation_vector
- 並進ベクトル.1x3または3x1.
- intrinsic_matrix
- カメラマトリクス(A) [fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数のベクトル,4x1, 1x4, 5x1, 1x5. このベクトルが NULL の場合,関数は全ての歪み係数が 0 であるとみなす.
- image_points
- 画像平面上の点の出力配列で,その大きさは2xNまたはNx2である.ここでNはビュー上の点の数.
- dpdrot
- オプション:画像平面上の点の回転ベクトルの各要素に関する微分係数を表す2Nx3行列.
- dpdt
- オプション:画像平面上の点の並進ベクトルの各要素に関する微分係数を表す2Nx3行列.
- dpdf
- オプション:画像平面上の点のfx と fyに関する微分係数を表す2Nx2行列.
- dpdc
- オプション:画像平面上の点のcx とcyに関する微分係数を表す2Nx2行列.
- dpddist
- オプション:画像平面上の点の歪み係数に関する微分係数を表す2Nx4行列.
- aspect_ratio
- オプション: dpdfの出力を補正するために用いられるアスペクト比パラメータ (cvCalibrateCamera2 や cvStereoCalibrate が CV_CALIB_FIX_ASPECT_RATIO のフラグ付きで呼ばれると, fy だけが独立パラメータとして推定され, fx は,fy*apect_ratio として計算される. これは,dpdf の値にも影響する). このパラメータが 0 の場合,アスペクト比が固定ではないことを意味する.
関数 cvProjectPoints2 は,3次元空間中の点を画像平面上に投 影した際の座標を,内部パラメータと外部パラメータを用いて計算する.オプ ションとして,この関数は画像中の投影点の偏微分係数行列であるヤコビアン を求める.これは,各パラメータ(内部,外部パラメータ)に関連する全ての 入力パラメータの関数として計算される.ヤコビアンは関 数 cvCalibrateCamera2と関 数 cvFindExtrinsicCameraParams2 に おいて,最適化を行うときに用いられる.この関数自身も,現在の内部/外部パ ラメータの逆投影誤差を計算するために利用される.
注釈: 内部パラメータ及び/または外部パラメータを特別な値に設定 すると,この関数を外部変換のみ,あるいは内部変換のみ(つまり,疎な点集 合の歪みを考慮したものに変換する)を計算するために利用することができる.
FindHomography
2枚の画像間の射影変換を求める
void cvFindHomography( const CvMat* src_points, const CvMat* dst_points,
CvMat* homography, int method=0,
double ransacReprojThreshold=0, CvMat* mask=NULL );
- src_points
- 1枚目の画像上の座標.2xN,Nx2,3xN または Nx3の配列(後ろ二つは同次座標系表記である).ここで N は点の数.
- dst_points
- 2枚目の画像上の座標.2xN,Nx2,3xN または Nx3の配列(後ろ二つは同次座標系表記である).
- homography
- 出力される3x3ホモグラフィ行列(平面射影変換行列).
- method
- ホモグラフィ行列を計算するための手法.次のいずれか一つ:
0 - 全ての点のペアを利用する標準的な手法
CV_RANSAC - RANSACアルゴリズムに基づくロバストな手法
CV_LMEDS - LMedS推定によるロバストな手法
- ransacReprojThreshold
- 点のペアをインライア値として扱うために許容される,逆投影誤差の最大値. このパラメータは,CV_RANSAC が指定された場合にのみ利用される. 例えば,dst_points がピクセル精度のピクセル座標である場合, このパラメータは,おおよそ 1〜3 にセットされるのが正しい.
- mask
- オプション:ロバスト推定(CV_RANSAC, CV_LMEDS)で利用される出力マスク.
関数 cvFindHomography は,2枚の画像間の射影変換行列 H=||hij|| を求める.
[x'i] [xi] si[y'i]~H*[yi] [1 ] [ 1]以下のように,逆投影誤差を最小にする各要素を計算する.
sum_i((x'i-(h11*xi + h12*yi + h13)/(h31*xi + h32*yi + h33))2+ (y'i-(h21*xi + h22*yi + h23)/(h31*xi + h32*yi + h33))2) -> min
パラメータ method の値がデフォルトの 0 にセットされている場合, この関数は,全ての点のペアを用いて最適なホモグラフィ行列を推定する. しかし,全ての点のペア (src_pointsi,dst_pointsi) を剛体,透視変換によりフィッティングすることができない場合(例えば,アウトライアが存在する場合)でも, ロバスト推定手法の一つを用いて正しい変換を推定することができる. CV_RANSAC と CV_LMEDS, このどちらの手法も,互いに対応する点のペアのランダムな部分集合(5 ペア) を繰り返し生成し,この部分集合から,単純な最小二乗法を用いてホモグラフィ行列を推定する. そして,計算されたホモグラフィ行列のクオリティ (RANSACの場合はインライアの数,LMedS推定の場合は中央値逆投影誤差)を求める. 求められた最適な部分集合からホモグラフィ行列の初期推定値,および, インライア/アウトライアのマスクを生成する.
推定手法にかかわらず(ロバスト推定手法であろうがなかろうが), 計算されたホモグラフィ行列は,逆投影後差がより小さくなるように, Levenberg-Marquardt法により高精度化される(ロバスト推定の場合は,インライアのみが用いられる).
CV_RANSAC の推定手法は, 実際には,どのようなアウトライア比率のデータも扱うことができるが, インライアとアウトライアを区別するための閾値が必要である. CV_LMEDS の推定手法は, このような閾値を必要としないが,50%以上のインライアが含まれているデータでなければ正しく動作しない. また,計算された特徴点列データ内にアウトライアが存在しない場合は, 多少のノイズが含まれたとしても,デフォルトの手法が最も適切である.
この関数は,内部行列及び外部行列の初期値を求めるために用いられる. ホモグラフィ行列(平面射影変換行列)はスケールに依存するので,h33=1 になるように正規化される.
CalibrateCamera2
キャリブレーションパターンを用いて内部パラメータ及び外部パラメータを求める
void cvCalibrateCamera2( const CvMat* object_points, const CvMat* image_points,
const CvMat* point_counts, CvSize image_size,
CvMat* intrinsic_matrix, CvMat* distortion_coeffs,
CvMat* rotation_vectors=NULL, CvMat* translation_vectors=NULL,
int flags=0 );
- object_points
- オブジェクト(キャリブレーションパターン)上の点群 座標の結合行列.3xN または Nx3の配列.Nはすべてのビューでの点の数の合計 である.
- image_points
- 対応する画像上の点群座標の結合行列. 2xN またはNx2 の配列.Nはすべてのビューでの点の数の合計である.
- point_counts
- それぞれのビューに含まれる点の数を表すベクトル.サ イズは 1xM または Mx1 でMはビューの数.1xM or Mx1,
- image_size
- 画像サイズ.内部カメラ行列の初期化のみに用いられる.
- intrinsic_matrix
- 出力されるカメラ行列 (A) [fx 0 cx; 0 fy cy; 0 0 1]. CV_CALIB_USE_INTRINSIC_GUESS や CV_CALIB_FIX_ASPECT_RATIO が指定され た場合,fx, fy, cx, cyのパラメータのうち いくつか,またはすべてを初期化する必要がある.
- distortion_coeffs
- 出力される歪み係数のベクトル,4x1, 1x4, 5x1, 1x5.
- rotation_vectors
- 出力される3xMまたはMx3の回転ベクトルの配列 (コンパクトな回転行列の表記についてはcvRodrigues2を参照).
- translation_vectors
- 出力される3xMまたはMx3の並進ベクトルの配列.
- flags
- 処理フラグ.0,または,次の値の組み合わせ.
CV_CALIB_USE_INTRINSIC_GUESS - intrinsic_matrixは最適化が行われた正しい初 期値 fx, fy, cx, cyを含む.このパラメータがセッ トされていない場合,(cx, cy) は最初に画像中心にセットされ(image_size はこの計算に用いられ る),焦点距離は最小二乗法で計算される.注釈:もし内部パラメータが既知であれば,この手法を使う必要はない.代わりに関数 cvFindExtrinsicCameraParams2 を使用すること.
CV_CALIB_FIX_PRINCIPAL_POINT - 主点(光学中心) は最適化中には変化せず,中心または別の指定された場所(このパラメータと同時 に CV_CALIB_USE_INTRINSIC_GUESS がセットされ ている場合)に固定される.
CV_CALIB_FIX_FOCAL_LENGTH - fx と fy の両方が固定される.
CV_CALIB_FIX_ASPECT_RATIO - fx と fy のうちのどちらか一方だけが独立変数であるとし,アスペクト比 fx/fy が intrinsic_matrix の初期値として与えられた値か ら変わらないように最適化処理を行う.この場合,実際に用いられる(fx, fy)の初期値は,行列から与えられる (CV_CALIB_USE_INTRINSIC_GUESSがセットされている場合)か,何らかの方法で推定される(後者の場合は, fx, fy は任意の値にセットされ,それらの比率だけが用いられる).
CV_CALIB_ZERO_TANGENT_DIST - 円周方向の歪み係数は0にセットされ,最適化中は変化しない.
CV_CALIB_FIX_K1 - 0 番目の歪み係数(k1) が(0 または,CV_CALIB_USE_INTRINSIC_GUESS が渡された場合は初期値に)固定される.
CV_CALIB_FIX_K2 - 1 番目の歪み係数(k2)が固定される(同上).
CV_CALIB_FIX_K3 - 4 番目の歪み係数(k3)が固定される(同上).
関数 cvCalibrateCamera2は,内部パラメータと, 各キャリブレーションパターン画像に対応する外部パラメータ(オプション)を推定する. 3次元のオブジェクトポイントの座標と,それらに対応する画像上に投影された点を指定する必要がある. これらは,幾何学的に既知で,容易に特徴点が発見できるオブジェクトを使用することで得られる. そのようなオブジェクトは,キャリブレーション装置やキャリブレーションパターンと呼ばれ, OpenCVはキャリブレーションの道具としてチェスパターンをサポートしている (cvFindChessboardCorners を参照). 現在,内部パラメータの初期化(CV_CALIB_USE_INTRINSIC_GUESS がセットされていない場合)手法は,平面キャリブレーションパターン(オブジェクト上の点のz座標がすべて0または1である)を用いたもののみが実装されている. 初期値 intrinsic_matrix が与えられさえすれば,3次元のキャリブレーション装置を用いることもできる. 内部パラメータと外部パラメータの初期値がこの関数により計算された後, 逆投影誤差の総和が最小になるように各パラメータが最適化される. 逆投影誤差の総和とは,実際の画像上の座標と,現在の内部・外部パラメータ を用いて cvProjectPoints2 で画像上に投影した座標の差の二乗の総和である.
CalibrationMatrixValues
様々なカメラ特性を計算する
void cvCalibrationMatrixValues( const CvMat *calibMatr,
int imgWidth, int imgHeight,
double apertureWidth=0, double apertureHeight=0,
double *fovx=NULL, double *fovy=NULL,
double *focalLength=NULL,
CvPoint2D64f *principalPoint=NULL,
double *pixelAspectRatio=NULL );
- calibMatr
- 内部パラメータ行列(例えば cvCalibrateCamera2 によって求められたもの).
- imgWidth
- 画像幅.ピクセル単位
- imgHeight
- 画像高さ.ピクセル単位
- apertureWidth
- アパーチャ幅.実際の長さ単位.(オプションの入力パラメータ)
- apertureHeight
- アパーチャ高さ.実際の長さ単位.(オプションの入力パラメータ)
- fovx
- x-方向の画角.degree単位(オプションの出力パラメータ)
- fovx
- y-方向の画角.degree単位(オプションの出力パラメータ)
- focalLength
- 焦点距離.実際の長さ単位.(オプションの出力パラメータ)
- principalPoint
- 主点(光学中心)実際の長さ単位.(オプションの出力パラメータ)
- pixelAspectRatio
- ピクセルのアスペクト比 fy/fx.(オプションの出力パラメータ)
関数 cvCalibrationMatrixValues は, 求められたカメラキャリブレーション行列,ピクセル単位の画像フレーム解像度, 物理的アパーチャサイズの値を用いて,様々なカメラ(センサ/レンズ)特性を計算する.
FindExtrinsicCameraParams2
特定のビューに対する外部パラメータを求める
void cvFindExtrinsicCameraParams2( const CvMat* object_points,
const CvMat* image_points,
const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs,
CvMat* rotation_vector,
CvMat* translation_vector );
- object_points
- オブジェクトの点の配列.3xNまたはNx3でNはビューにおける点の数.
- image_points
- 対応する画像上の点の配列.2xNまたはNx2でNはビューにおける点の数.
- intrinsic_matrix
- カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数のベクトル,4x1, 1x4, 5x1, 1x5. このベクトルが NULL の場合,関数は全ての歪み係数が 0 であるとみなす.
- rotation_vector
- 出力される3x1 または 1x3の回転ベクトル(コンパク トな回転行列の表記についてはcvRodrigues2 を参照).
- translation_vector
- 出力される3x1 または 1x3の並進ベクトル.
関数 cvFindExtrinsicCameraParams2 は, カメラの内部パラメータと少数(>=)の 2D<->3D 点対応を利用し て,オブジェクトの姿勢を求める.
StereoCalibrate
ステレオカメラのキャリブレーションを行う
void cvStereoCalibrate( const CvMat* object_points, const CvMat* image_points1,
const CvMat* image_points2, const CvMat* point_counts,
CvMat* camera_matrix1, CvMat* dist_coeffs1,
CvMat* camera_matrix2, CvMat* dist_coeffs2,
CvSize image_size, CvMat* R, CvMat* T,
CvMat* E=0, CvMat* F=0,
CvTermCriteria term_crit=cvTermCriteria(
CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,1e-6),
int flags=CV_CALIB_FIX_INTRINSIC );
- object_points
- オブジェクト点の結合行列,3xN あるいは Nx3.ここで, N は全てのビューにおける点数の合計.
- image_points1
- 1 番目のカメラのビューにおける画像間対応点の結合行列, 2xN あるいは Nx2.ここで,N は全てのビューにおける点数の合計.
- image_points2
- 2 番目のカメラのビューにおける画像間対応点の結合行列, 2xN あるいは Nx2.ここで,N は全てのビューにおける点数の合計.
- point_counts
- 各ビューに含まれる点数のベクトル,1xM あるいは Mx1. ここで,M はビューの数.
- camera_matrix1, camera_matrix2
- 入出力カメラ行列 [fxk 0 cxk; 0 fyk cyk; 0 0 1]. CV_CALIB_USE_INTRINSIC_GUESS か CV_CALIB_FIX_ASPECT_RATIO が指定された場 合は,これらの行列のいくつか(または全て)の要素が初期化されているはずである.
- dist_coeffs1, dist_coeffs2
- 各カメラの歪み係数を表す入出力ベクトル, 4x1,1x4,5x1,1x5.
- image_size
- 画像サイズ.カメラの内部パラメータ行列を初期化する際にのみ用いられる.
- R
- 1 番目と2 番目のカメラの座標系間の回転行列.
- T
- カメラ座標系間の並進ベクトル.
- E
- 出力オプション:E行列.
- F
- 出力オプション:F行列(基礎行列).
- term_crit
- 繰り返し最適化アルゴリズムのための終了条件.
- flags
- 様々なフラグ.0 あるいは以下の値の組み合わせ:
CV_CALIB_FIX_INTRINSIC - これがセットされた場合,外部パラメータのみが最適化されるように, camera_matrix1,2 と dist_coeffs1,2 が固定される.
CV_CALIB_USE_INTRINSIC_GUESS - 他のフラグに依存して,いくつか(あるいは全て)の内部パラメータを最 適化する.ただし,初期値はユーザが与える必要がある.
CV_CALIB_FIX_PRINCIPAL_POINT - 最適化の間,主点(光学中心)が固定される.
CV_CALIB_FIX_FOCAL_LENGTH - fxk および fyk が固定される.
CV_CALIB_FIX_ASPECT_RATIO - fxk/fyk の比率が固定されたまま,fyk が最適化される.
CV_CALIB_SAME_FOCAL_LENGTH - 強制的に,fx0=fx1, fy0=fy1 とする.
CV_CALIB_ZERO_TANGENT_DIST - 各カメラの円周方向の歪み係数が 0 に固定される.
CV_CALIB_FIX_K1 - 0 番目の歪み係数(k1)が固定される.
CV_CALIB_FIX_K2 - 1 番目の歪み係数(k2)が固定される.
CV_CALIB_FIX_K3 - 4 番目の歪み係数(k3)が固定される.
関数 cvStereoCalibrate は,ステレオペアを構成する2台のカメラ間の変換を推定する. 2台のカメラの相対位置および相対姿勢が固定されたステレオカメラがあり, 1番目のカメラと2番目のカメラに対するオブジェクトの姿勢 (R1,T1) と (R2, T2)を, (cvFindExtrinsicCameraParams2 を用いて)それぞれ計算したとすると,これらの姿勢は明らかに互いに関係がある. 言い換えれば,(R1, T1)が与えられると, (R2, T2)が計算できるはずである. そのためには,1番目のカメラに対する,2番目のカメラの位置と姿勢が分かるだけでよい. これが,この関数の機能である.(R,T)は次のように計算される:
R2=R*R1 T2=R*T1 + T,オプションとして,E行列は次のように計算される:
[0 -T2 T1] E = [T2 0 -T0]*R, [-T1 T0 0]ここで,Tiは,並進ベクトル T の要素である: T=[T0, T1, T2]T. また,同様に,F行列は次のように計算される:
F = inv(camera_matrix2)T*E*inv(camera_matrix1),この関数は,ステレオカメラの位置姿勢関係を計算する他に, 2台のカメラそれぞれの完全なキャリブレーションを行うこともできる. しかし,パラメータ空間の次元が大きすぎる事や,入力データのノイズなどが原因で,最適解を得られない可能性もある. 従って, 各カメラの内部パラメータを (例えば,cvCalibrateCamera2 を用いて) 個々に高精度に推定できるならば,そちらの方法が推奨される. その後に,その計算された内部パラメターと, CV_CALIB_FIX_INTRINSIC フラグをこの関数に渡せばよい. それが無理で,全てのパラメータを一度に計算する場合, いくつかのパラメータに制限を与えると良い. 例えば,CV_CALIB_SAME_FOCAL_LENGTH と CV_CALIB_ZERO_TANGENT_DIST フラグを指定するこ とは,通常は妥当な仮定である.
StereoRectify
ステレオカメラの平行化変換を求める
void cvStereoRectify( const CvMat* camera_matrix1, const CvMat* camera_matrix2,
const CvMat* dist_coeffs1, const CvMat* dist_coeffs2,
CvSize image_size, const CvMat* R, const CvMat* T,
CvMat* R1, CvMat* R2, CvMat* P1, CvMat* P2,
CvMat* Q=0, int flags=CV_CALIB_ZERO_DISPARITY );
- camera_matrix1, camera_matrix2
- カメラ行列 [fxk 0 cxk; 0 fyk cyk; 0 0 1].
- dist_coeffs1, dist_coeffs2
- 各カメラの歪み係数ベクトル.4x1,1x4,5x1,1x5.
- image_size
- ステレオカメラのキャリブレーションに用いられる画像サイズ.
- R
- 1 番目と2 番目のカメラの座標系間の回転行列.
- T
- カメラ座標系間の並進ベクトル.
- R1, R2
- それぞれ,1 番目および 2 番目のカメラに対する 3x3 平行化変換(回転行列).
- P1, P2
- 新しい(平行化された)座標系に対する 3x4 の投影行列.
- Q
- 出力オプション:視差と奥行きのマッピング行列,4x4. cvReprojectImageTo3D を参照.
- flags
- オプションフラグ. 0 あるいは CV_CALIB_ZERO_DISPARITY. このフラグがセットされた場合, この関数は,平行化後のビューにおいて各カメラの主点(光学中心)が同じ座標になるようにする. フラグがセットされない場合は,この間数は, 利用できる画像領域が最大になるように(エピポーラ線の傾きに従って)片方の画像を水平・垂直方向に移動する.
関数 cvStereoRectify は, 各カメラ用の回転行列を計算する. この回転行列によって,両方のカメラの画像平面が(仮想的に)同一平面に乗るように変換される. その結果,すべてのエピポーラ線が平行になるので,多数のステレオ対応点問題が単純化される. この関数は,cvStereoCalibrate によって計算された行列を入力とし, 新しい座標系に変換する二つの回転行列と二つの投影行列を出力する. この関数は,通常,両方のカメラ行列と 歪み係数,R,T を計算する関数 cvStereoCalibrate の後に呼ばれる. この間数にとって,次の二つは区別される:
- 水平ステレオ.1 番目のカメラと 2 番目のカメラのビューが互いに,
主に x 軸に沿った方向にずれている(多少は垂直方向の移動もあるかもしれない).
平行化された画像では,左右のカメラ間のエピポーラ線は,水平,かつ,
同じ y 座標(高さ)になる.P1 と P2 は,以下のようになる:
[f 0 cx1 0] P1=[0 f cy 0] [0 0 1 0] [f 0 cx2 Tx*f] P2=[0 f cy 0 ], [0 0 1 0 ]
ここで,Tx はカメラ間の水平方向のずれ量であり, CV_CALIB_ZERO_DISPARITY がセットされている 場合は,cx1=cx2 となる. - 垂直ステレオ.1 番目のカメラと 2 番目のカメラのビューが互いに,
主に y 軸に沿った方向にずれている(これも,多少は水平方向の移動があるかもしれない).
平行化された画像でのエピポーラ線は,垂直,かつ,同じ x 座標になる.
P1 と P2 は,以下のようになる:
[f 0 cx 0] P1=[0 f cy1 0] [0 0 1 0] [f 0 cx 0 ] P2=[0 f cy2 Ty*f], [0 0 1 0 ]
ここで,Ty はカメラ間の垂直方向のずれ量であり, CV_CALIB_ZERO_DISPARITY がセットされている 場合は,cy1=cy2 となる.
StereoRectifyUncalibrated
キャリブレーションされていないステレオカメラの平行化変換を求める
void cvStereoRectifyUncalibrated( const CvMat* points1, const CvMat* points2,
const CvMat* F, CvSize image_size,
CvMat* H1, CvMat* H2,
double threshold=5 );
- points1, points2
- 互いに対応する 2 次元点の二つの配列.
- F
- 基礎行列. points1 と points2 の点ペアを用いて, 関数 cvFindFundamentalMat によって計算される.
- image_size
- 画像サイズ.
- H1, H2
- 1 番目の画像と 2 番目の画像に対する平行化ホモグラフィ行列.
- threshold
- オプション:外れ値を排除するための閾値. このパラメータが 0 よりも大きい場合, エピポーラ幾何に充分に従わないすべての点ペア (つまり,fabs(points2[i]T*F*points1[i])>threshold となる点)が,ホモグラフィ行列を計算する前に棄却される.
関数 cvStereoRectifyUncalibrated は, カメラの内部パラメータと相対的な位置関係が未知な場合において,平行化変換を求める. なので,「Uncalibrated」という接頭辞がついている. もう一つの cvStereoRectify との違いは, この関数は,オブジェクト空間(3次元)における平行化変換ではなく, ホモグラフィ行列 H1 と H2 の形で 平面透視投影変換を出力することである. この関数は,[Hartley99] のアルゴリズムを実装したものである .
このアルゴリズムはカメラの内部パラメータを必要としないが,エピポーラ幾何に非常に依存している事に注意する. 従って,カメラレンズが大きく歪んでいる場合は,F行列を計算してこの行列を呼ぶよりも前に,歪みを補正するのが良い. 例えば,ステレオカメラの各カメラそれぞれの歪み係数を cvCalibrateCamera2 によって計算してから,cvUndistort2 によって歪みを補正する.
Rodrigues2
回転行列から回転ベクトルへ変換する(またはその逆)
int cvRodrigues2( const CvMat* src, CvMat* dst, CvMat* jacobian=0 );
- src
- 入力の回転ベクトル(3x1 あるいは 1x3),または回転行列(3x3).
- dst
- 各入力に対応した出力の回転行列(3x3),または回転ベクトル(3x1 あるいは 1x3).
- jacobian
- オプション出力の3x9または9x3のヤコビアン - 出力配列の各要素の,入力配列の各要素に関する偏微分係数.
関数 cvRodrigues2 は,回転ベクトルを回転行列に変換する.ま たはその逆も可能である. 回転ベクトルは回転行列のコンパクトな表記である. 回転ベクトルの方向は回転軸で,ベクトルの長さは回転軸周りの回転量になっ ている.回転行列 R とそれに対応する回転ベクトル r は次のように計算される.
theta <- norm(r) r <- r/theta [0 -rz ry] R = cos(theta)*I + (1-cos(theta))*rrT + sin(theta)*[rz 0 -rx] [ry rx 0 ]逆変換も以下のように簡単に行うことができる.
[0 -rz ry] sin(theta)*[rz 0 -rx] = (R - RT)/2 [ry rx 0 ]回転ベクトルは,わずか3自由度の行列で回転行列を表すことができる便利な表 記である.この表記は cvFindExtrinsicCameraParams2 や cvCalibrateCamera2 において最適化を行う際に用いられる.
Undistort2
レンズ歪みを補正するため画像を変換する
void cvUndistort2( const CvArr* src, CvArr* dst,
const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs );
- src
- 入力画像(歪みあり).
- dst
- 出力画像(補正済み).
- intrinsic_matrix
- カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数のベクトル,4x1, 1x4, 5x1, 1x5.
関数 cvUndistort2は,半径方向や円周方向のレンズ歪みを補正する ために画像を変換する.カメラ行列や歪みパラメータは, cvCalibrateCamera2 を用いて決定 することができる.このセクションの最初の式を用いて,出力画像のすべての ピクセルについて,入力画像中の対応する座標を計算する.そして,各ピクセ ル値がバイリニア補間を用いて計算される.キャリブレーションを行った画像 と入力画像の解像度が異なる場合は,歪み係数はそのままの値で問題ないが, fx, fy, cx,cy は適切な調整が必要である.
歪み補正さた画像の主点(光学中心)は,画像の画像の中心になる.
InitUndistortMap
歪み補正マップの計算
void cvInitUndistortMap( const CvMat* camera_matrix,
const CvMat* distortion_coeffs,
CvArr* mapx, CvArr* mapy );
- camera_matrix
- カメラ行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数のベクトル,4x1,1x4,5x1,1x5.
- mapx
- 補正マップのx座標の出力配列.
- mapy
- 補正マップのy座標の出力配列.
関数 cvInitUndistortMap は,事前に歪み補正マップ(補正画 像のすべてのピクセルについて,それぞれ対応する歪み画像のピクセル座標値 をもつマップ)を計算する.その後,マップは入力画像および出力画像と共に, 関数 cvRemap に渡すことができる.
歪み補正さた画像の主点(光学中心)は,画像の画像の中心になる.
InitUndistortRectifyMap
ステレオカメラの歪み補正+平行化の変換マップの計算を行う
void cvInitUndistortRectifyMap( const CvMat* camera_matrix,
const CvMat* dist_coeffs,
const CvMat* R,
const CvMat* new_camera_matrix,
CvArr* mapx, CvArr* mapy );
- camera_matrix
- カメラ行列 A=[fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数のベクトル,4x1, 1x4, 5x1, 1x5.
- R
- オブジェクト空間における平行化変換(3x3 行列). cvStereoRectify で計算された値, R1 あるいは R2 が渡される. このパラメータが NULL の場合,単位行列が用いられる.
- new_camera_matrix
- 新しいカメラ行列 A'=[fx' 0 cx'; 0 fy' cy'; 0 0 1].
- mapx
- 出力配列.マップの x-座標.
- mapy
- 出力配列.マップの y-座標.
関数 cvInitUndistortRectifyMap は, cvInitUndistortMap の拡張版である. つまりこの間数は,レンズの歪み補正に加えて, 新しいカメラ行列に従った任意の透視投影変換 R,およびスケーリングと並進を行う. この変換は以下の擬似コードで表現できる:
// (u,v) は,入力点. // camera_matrix=[fx 0 cx; 0 fy cy; 0 0 1] // new_camera_matrix=[fx' 0 cx'; 0 fy' cy'; 0 0 1] x = (u - cx')/fx' y = (v - cy')/fy' [X,Y,W]T = R-1*[x y 1]T x' = X/W, y' = Y/W x" = x'*(1 + k1r2 + k2r4 + k3r6) + 2*p1x'*y' + p2(r2+2*x'2) y" = y'*(1 + k1r2 + k2r4 + k3r6) + p1(r2+2*y'2) + 2*p2*x'*y' mapx(u,v) = x"*fx + cx mapy(u,v) = y"*fy + cyこのコードは,ターゲット画像(つまり,歪み補正および平行化を行った理想画像)から, カメラから取得したオリジナルの「生」画像への逆変換を行っている事に注意する. バイリニア補完により隙間なく画像の全ての画素を埋めるためには, cvRemap を用いる.
通常,この関数は,cvStereoRectify の後に, (ステレオカメラの各カメラに対して2度)呼ばれる. しかし, 例えば,cvStereoRectifyUncalibrated を用いることで,基礎行列から直接,平行化変換を計算することもできる. この関数は,ピクセルに作用し,3次元空間内の回転行列 R ではなく, 平行化変換を行うホモグラフィ行列を作成する. この場合は,以下のように, ホモグラフィ行列 H から R を計算することができる:
R = inv(camera_matrix)*H*camera_matrix
UndistortPoints
観測された点座標から理想的な点座標を計算する
void cvUndistortPoints( const CvMat* src, CvMat* dst,
const CvMat* camera_matrix,
const CvMat* dist_coeffs,
const CvMat* R=NULL,
const CvMat* P=NULL);
- src
- カメラで観測された点座標の集合.
- dst
- 歪み補正後に逆透視投影を行った理想的な点座標.
- camera_matrix
- 歪み補正後に逆透視投影を行った理想的な点座標.
- カメラ行列 A=[fx 0 cx; 0 fy cy; 0 0 1]
- distortion_coeffs
- 歪み係数のベクトル,4x1, 1x4, 5x1, 1x5.
- R
- オブジェクト空間での平行化変換(3x3 行列). cvStereoRectify で計算された値, R1 あるいは R2 が渡される. このパラメータが NULL の場合,単位行列が用いられる.
- P
- 新しいカメラ行列(3x3),あるいは,新しい投影行列(3x4). cvStereoRectify で計算された値, P1 あるいは P2 が渡される. このパラメータが NULL の場合,単位行列が用いられる.
関数 cvUndistortPoints は, cvInitUndistortRectifyMap と類似しているが,それと同時に逆の性質も持つ. これら関数は,どちらもレンズ歪みを補正するために用いられ,オプションとし て透視投影(平行化)変換を行う,という点で似ている. 一方で,関数 cvInitUndistortRectifyMap は,マップを適切に初期化するために実際に逆変換を行うが,この関数は順変換を行う. つまり,これは以下の疑似コードで表すことができる:
// (u,v) は入力ポイント,(u', v') は出力ポイント // camera_matrix=[fx 0 cx; 0 fy cy; 0 0 1] // P=[fx' 0 cx' tx; 0 fy' cy' ty; 0 0 1 tz] x" = (u - cx)/fx y" = (v - cy)/fy (x',y') = undistort(x",y",dist_coeffs) [X,Y,W]T = R*[x' y' 1]T x = X/W, y = Y/W u' = x*fx' + cx' v' = y*fy' + cy',ここで,undistort() は 正規化された歪んだ点座標から正規化された正しい点座標を推定する繰り返しア ルゴリズムを表している(「正規化された」とは,座標値がカメラ行列に依存しないことを意味する).
この関数は,ステレオカメラに対して用いることも,R=NULLとして一つのカメラに用いることもできる.
FindChessboardCorners
チェスボード内のコーナーを求める
int cvFindChessboardCorners( const void* image, CvSize pattern_size,
CvPoint2D32f* corners, int* corner_count=NULL,
int flags=CV_CALIB_CB_ADAPTIVE_THRESH );
- image
- 入力のチェスボード画像.8ビットのグレースケールまたはカラー画像.
- pattern_size
- チェスボードの行と列ごとのコーナーの数.
- corners
- 検出されたコーナーの配列.
- corner_count
- コーナーの数.NULLでない場合,検出したコーナーの数が保存される.
- flags
- 処理フラグ.0または以下の値の組み合わせ.
CV_CALIB_CB_ADAPTIVE_THRESH - 画像を2値化する際に,固定の閾値を使うのではなく,(画像の平均輝度値から計算される)適応的な閾値を用いる.
CV_CALIB_CB_NORMALIZE_IMAGE - 固定閾値処理または適応的閾値処理を行う前に,cvNormalizeHistを用いて画像を正規化する.
CV_CALIB_CB_FILTER_QUADS - 輪郭の探索 段階で抽出される間違った四角形を無視するために,追加基準(輪郭面積,周囲長,形は正方形など)を使用する.
関数 cvFindChessboardCorners は,入力画像がチェ スボードパターンであるかどうかを確認し,チェスボードの各コーナーの位置 検出を試みる.すべてのコーナーが検出され,正しい順番(行順で,かつ各行 は左から右に並ぶ)でそれらが配置されている場合には,この関数は0以外の数 値を返す.そうでない場合,例えば関数がコーナー検出やそれらの順番付けに 失敗した場合などは0を返す.例えば,標準のチェスボードは8×8の正方形 と,7×7の内部コーナー(黒色の正方形が互いに接する点)を持っている.検出 された座標値は近似値であるので,位置の高精度化のためには関数 cvFindCornerSubPixを使用する.
DrawChessBoardCorners
検出されたチェスボードのコーナーを表示する
void cvDrawChessboardCorners( CvArr* image, CvSize pattern_size,
CvPoint2D32f* corners, int count,
int pattern_was_found );
- image
- コーナー点を表示する画像.8ビットカラー画像.
- pattern_size
- チェスボードの各行と各列の内部コーナーの数.
- corners
- 検出されたコーナーの配列.
- count
- コーナーの数.
- pattern_was_found
- チェスボードからコーナーが完全に発見された (≠0)か,そうでない(=0)かを示す.この値は関数 cvFindChessboardCorners からの戻り値を渡すだけでよい.
関数 cvDrawChessboardCorners は,チェスボードからコーナー が完全に検出されていない場合(pattern_was_found=0)は,検 出されたコーナーそれぞれに赤色の円を描く.また完全に検出されている場合 (pattern_was_found≠0)は,色付けされた各コーナを線分で 接続して表示する.