カメラキャリブレーション系の関数

2011年12月10日 17:05

cv::findChessboardCorners(image, patternsize, corners, flags)

imageは入力画像、patternsizeは何か交点の数かな?ただしcvSize(columns,rows)で、二つの引数をもつ変数を指定してやる必要がある。cornersは検出された交点の出力配列。vector型である必要がある。4つ目のflagsは省略可。省略した場合は、flagは0とされ、それ以外の場合は、入力画像を処理する前に2値化するオプション等を指定できる。戻り値は、すべてのコーナーが検出されれば1、それ以外は0。

cv::cornerSubPix(image, corners, win, zero_zone, criteria)

imageは入力画像、cornerの元の配列で、求めた後値を上書きすると思う。winはcvSize型の変数で、求めたい交点のまわりの範囲を指定する。zero_zoneもcvSize型の変数で、探索範囲ないだけどちょっと除きたい範囲があるときにある値を代入する。特にない場合は、cv::Size(-1,-1)などとする。criteriaは、停止判断基準。参考プログラムだと、criteriaっていうかたまりに定義してるね。

cv::drawChessboardCorners(image, patternSize, corners, patternWasFound)

imageは交点を出力する画像、patternSizeは交点の数、cornersは、交点の配列をcv::Mat()でラップする。例えば、次のように使う。

(cv::Mat)(corners)

patternWasFoundとは、交点が全部検出されたかどうかを表すフラッグで、findChessboardCornersの戻り値を使うことができる。

交点を格納する配列のareaというメンバ:patternsize.area()

どうやら交点の数全部を指すらしい。

cv::calibrateCamera(objectpoints, imagepoints, imagesize, cameramatrix, distcoeffs, rvecs, tvecs, flags)

objectpointsはチェッカーサンプルの交点の本当の座標(3次元)、imagepointsは様々な角度から撮影したチェッカーサンプルの交点の画像上での座標(2次元)、imagesizeは画像のサイズで、たぶん640×480とかそういうやつ、cameramatrixはcv::Mat型で、内部パラメータを格納する行列、distcoeffsもcv::Mat型、レンズ歪み行列を格納する、rvecsとtvecsはともにcv::Mat型で、チェッカーサンプルの撮影した状況を表す行列。つまり、撮影したカメラの位置や向きと、チェッカーサンプル間の関係を表す。前者が回転行列、後者が並進行列である。flagsは参考プログラムで無視されてたので、触れない。

サンプルプログラムだと、cameramatrixやdistcoeffsを使って、レンズとかのパラメータに依存しない画像を最終的に計算してた。私は…、とりあえず計算したパラメータをファイルに出力するとか、他のプログラムで利用する方向で動こうかな。とりあえず、計測した内部パラメータを使って撮影した物体の世界座標系での位置を求める方法を勉強しないと。