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)
- (ピンホールカメラモデル, 歪み(Pinhole Camera Model, Distortion))
- カメラキャリブレーション(Camera Calibration)
- 姿勢推定(Pose Estimation)
- エピポーラ幾何(Epipolar Geometry)
- 参考文献
カメラキャリブレーションと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) + 2*p1x'*y' + p2(r2+2*x'2) y" = y'*(1 + k1r2 + k2r4) + p1(r2+2*y'2) + 2*p2*x'*y' ここで r2 = x'2+y'2 u = fx*x" + cx v = fy*y" + cyk1, k2 は半径方向の歪み係数, p1, p2 は円周方向の歪み係数である.高次の係数は OpenCVでは考慮されない.歪み係数はビューに依存しないので,内部パラメー タとなる.またキャプチャした画像の解像度にかかわらず同じである.
このセクションの関数は,以下の目的で使用される.
- 内部パラメータ,外部パラメータによって3次元座標を画像上に投影するため.
- 外部パラメータを,内部パラメータと少数の3次元座標およびそれらの画像上への投影を用いて推定するため.
- カメラパラメータ(内部パラメータおよび外部パラメータ)を複数のキャ リブレーションパターンから推定するため (すべてのビューは対応のとれた3次 元位置と画像座標からなる).
カメラキャリブレーション(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 );
- 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 [k1, k2, p1, p2]. NULLの場合,すべての歪み係数を0とする.
- image_points
- 画像平面上の点の出力配列で,その大きさは2xNまたはNx2である.ここでNはビュー上の点の数.
- dpdrot
- オプション:画像平面上の点の回転ベクトルの各要素に関する微分係数を表す2Nx3行列.
- dpdt
- オプション:画像平面上の点の並進ベクトルの各要素に関する微分係数を表す2Nx3行列.
- dpdf
- オプション:画像平面上の点のfx と fyに関する微分係数を表す2Nx2行列.
- dpdc
- オプション:画像平面上の点のcx とcyに関する微分係数を表す2Nx2行列.
- dpddist
- オプション:画像平面上の点の歪み係数に関する微分係数を表す2Nx4行列.
関数 cvProjectPoints2 は,3次元空間中の点を画像平面上に投 影した際の座標を,内部パラメータと外部パラメータを用いて計算する.オプ ションとして,この関数は画像中の投影点の偏微分係数行列であるヤコビアン を求める.これは,各パラメータ(内部,外部パラメータ)に関連する全ての 入力パラメータの関数として計算される.ヤコビアンは関 数 cvCalibrateCamera2と関 数 cvFindExtrinsicCameraParams2 に おいて,最適化を行うときに用いられる.この関数自身も,現在の内部/外部パ ラメータの逆投影誤差を計算するために利用される.
注釈: 内部パラメータ及び/または外部パラメータを特別な値に設定 すると,この関数を外部変換のみ,あるいは内部変換のみ(つまり,疎な点集 合の歪みを考慮したものに変換する)を計算するために利用することができる.
FindHomography
2枚の画像間の射影変換を求める
void cvFindHomography( const CvMat* src_points,
const CvMat* dst_points,
CvMat* homography );
- src_points
- 1枚目の画像上の座標. 2xN,Nx2,3xN または Nx3の配列 (後ろ二つは同次座標系表記である).ここで N は点の数.
- dst_points
- 2枚目の画像上の座標.2xN,Nx2,3xN または Nx3の配列 (後ろ二つは同次座標系表記である).
- homography
- 出力される3x3ホモグラフィ行列(平面射影変換行列).
関数 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この関数は,内部行列及び外部行列の初期値を求めるために用いられる.ホモ グラフィ行列(平面射影変換行列)はスケールに依存するので,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_RATION が指定され た場合,fx, fy, cx, cyのパラメータのうち いくつか,またはすべてを初期化する必要がある.
- distortion_coeffs
- 出力される4x1または1x4のひずみ係数ベクトル [k1, k2, p1, p2].
- 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_ASPECT_RATIO - fx と fy のうちのどちらか一方だけが独立変数であるとし,アスペクト比 fx/fy が intrinsic_matrix の初期値として与えられた値か ら変わらないように最適化処理を行う.この場合,実際に用いられる(fx, fy)の初期値は,行列から与えられる (CV_CALIB_USE_INTRINSIC_GUESSがセットされている場合)か,何らかの方法で推定される(後者の場合は, fx, fy は任意の値にセットされ,それらの比率だけが用いられる).
CV_CALIB_ZERO_TANGENT_DIST - 円周方向の歪み係数は0にセットされ,最適化中は変化しない.
関数 cvCalibrateCamera2は,内部パラメータと各画像に対する 外部パラメータを推定する.3次元のオブジェクトポイントの座標と,それらに対応する画像上に投影された点を指定する必要がある. これらは,幾何学的に既知で,容易に特徴点が発見できるオブジェクトを使用することで得られる. そのようなオブジェクトは,キャリブレーション装置やキャリブレーションパターンと呼ばれ, OpenCVはキャリブレーションの道具としてチェスパターンをサポートしている (cvFindChessboardCorners を参照). 現在,内部パラメータの初期化(CV_CALIB_USE_INTRINSIC_GUESS がセットされていない場合)手法は,平面キャリブレーションパターン(オブジェクト上の点のz座標がすべて0または1である)を用いたもののみが実装されている. 初期値 intrinsic_matrix が与えられさえすれば,3次元のキャリブレーション装置を用いることもできる.内部パラメータと外部パラメータの初期値が計算された後, 逆投影誤差の総和(実際の画像上の座標と cvProjectPoints2 で画像上に投影した座標の差の二乗の総和)が最小になるように各パラメータが最適化される.
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 [k1, k2, p1, p2].NULLの場合,歪み係数はすべて0 であるとする.
- rotation_vector
- 出力される3x1 または 1x3の回転ベクトル(コンパク トな回転行列の表記についてはcvRodrigues2 を参照).
- translation_vector
- 出力される3x1 または 1x3の並進ベクトル.
関数 cvFindExtrinsicCameraParams2 は,既知の内部パラメータ を用いて,それぞれのビューにおける外部パラメータを推定する.3次元のオブジェクトの点とそれに対応する2次元投影点が指定されなければならない. この関数も逆投影誤差の最小化を行う.
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 [k1, k2, p1, p2].
関数 cvUndistort2は,半径方向や円周方向のレンズ歪みを補正する ために画像を変換する.カメラ行列や歪みパラメータは, cvCalibrateCamera2 を用いて決定 することができる.このセクションの最初の式を用いて,出力画像のすべての ピクセルについて,入力画像中の対応する座標を計算する.そして,各ピクセ ル値がバイリニア補間を用いて計算される.キャリブレーションを行った画像 と入力画像の解像度が異なる場合は,歪み係数はそのままの値で問題ないが, fx, fy, cx,cy は適切な調整が必要である.
InitUndistortMap
歪み補正マップの計算
void cvInitUndistortMap( const CvMat* intrinsic_matrix,
const CvMat* distortion_coeffs,
CvArr* mapx, CvArr* mapy );
- intrinsic_matrix
- カメラ内部行列 (A) [fx 0 cx; 0 fy cy; 0 0 1].
- distortion_coeffs
- 歪み係数ベクトル.4x1 または 1x4 [k1, k2, p1, p2].
- mapx
- 補正マップのx座標の出力配列.
- mapy
- 補正マップのy座標の出力配列.
関数 cvInitUndistortMap は,事前に歪み補正マップ(補正画 像のすべてのピクセルについて,それぞれ対応する歪み画像のピクセル座標値 をもつマップ)を計算する.その後,マップは入力画像および出力画像と共に, 関数 cvRemap に渡すことができる.
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)は,色付けされた各コーナを線分で 接続して表示する.