外部パラメータと内部パラメータのキャリブレーションを行う

#contents

*double calibrateCamera( InputArrayOfArrays _objectPoints, InputArrayOfArrays _imagePoints, Size imageSize, InputOutputArray _cameraMatrix, InputOutputArray _distCoeffs, OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs, int flags, TermCriteria criteria ); [#nef192b4]
複数フレームで求められた平面パターンの座標からキャリブレーションを行う
**引数 [#t2c89261]
-_objectPoints:Mat型のパターンの世界座標。入力
-_imagePoints:Mat型のパターンの画像座標。入力
-imageSize:Size型の撮影画像の画像サイズ。入力
-_cameraMatrix:Mat型のカメラ行列(内部行列)。出力
-_distCoeffs:Mat型の歪計数ベクトル。出力
-_rvecs:Mat型の回転ベクトルの集合。出力
-_tvecs:Mat型の並進ベクトルの集合。出力
-flags:int型の処理フラグ。入力。省略可
-criteria:TermCriteria型の収束条件。入力。省略可

**返り値 [#a508323c]
double型の再投影誤差

*void cvCalibrateCamera2( CvMat* world_points, CvMat* image_points, CvMat* counts, CvSize image_size, CvMat* A, CvMat* distortion, CvMat* rotations, CvMat* translations, int flags); [#d0d4c3f1]

複数フレームで求められた平面パターンの座標からキャリブレーションを行う(注意!このCインタフェースの関数はOpenCV 1.0 に準拠した記述です)

**引数 [#w942b4bb]
-world_points:CvMat*型のパターンの世界座標
-image_points:CvMat*型のパターンの画像座標
-counts:CvMat*型の各フレームにおいて求められたパターンの個数
-image_size:CvSize型の画像サイズ
-A:CvMat*型の内部パラメータ行列
-distortion:CvMat*型の歪み係数ベクトル
-rotation:CvMat*型の回転ベクトルの集合.省略可能
-translation:CvMat*型の並進ベクトルの集合.省略可能
-flags:int型の処理フラグ.省略可能

**返り値 [#e2b5e811]
-void型なのでなし(OpenCV 1.0時点)
-再投影誤差を表すdouble型(OpenCV 2.2以降)

*解説(C++版) [#lefe27e0]
-_objectPointsのサイズは3xNか2xN
--Nはフレーム数x点の数
--必ずしも各フレームで同じ点の数である必要は無いが,便宜上そう説明する
--世界座標は3次元だが,内部パラメータを推定する場合平面パターンの必要があり,立体パターンを渡すと文句を言われる.
-image_pointsのサイズは2xN
-当然world_pointsとimage_pointsでサイズと型の整合性が取れてる必要がある
-countsのサイズは1xMかMx1
--Mはフレーム数
-image_sizeはCvSize型の画像サイズ
-Aは3x3の内部パラメータ行列
--内部パラメータの推定を行ってくれるが,flagsの指定次第では初期値を渡す必要がある
-distortionには歪み係数ベクトルが返って来る
--OpenCVで4次元の歪みパラメータを扱える
-rotationsのサイズは3xMか9xMで回転ベクトルの集合が返って来る
--サイズが3xMの場合はQuaternion表記で,9xMの場合は回転行列のパラメータが各行に入る
-translationsのサイズは3xMで並進ベクトルの集合が返って来る
-flagsは省略可能.下記のフラグ,もしくはそれらの組み合わせとなる
--CV_CALIB_USE_INTRINSIC_GUESS(1):渡した内部パラメータを利用する
---実際,内部パラメータが既知の場合,cvFindExtrinsicCameraParams2を利用するべし
---このフラグが指定された無かった場合,cx,cyは画像サイズの中心が,fx,fyは最小二乗法で計算された値が初期値として利用される
--CV_CALIB_FIX_ASPECT_RATIO(2):fxとfyの比率を固定したまま最適化を行う
--CV_CALIB_FIX_PRINCIPAL_POINT(4):光学中心位置だけを固定したまま最適化を行う
--CV_CALIB_ZERO_TANGENT_DIST(8):円周方向の歪み方向が0に固定される
--CV_CALIB_FIX_FOCAL_LENGTH(16):
--CV_CALIB_FIX_K1(32):
--CV_CALIB_FIX_K2(64):
--CV_CALIB_FIX_K3(128):
--CV_CALIB_FIX_K4(2048):
--CV_CALIB_FIX_K5(4096):
--CV_CALIB_FIX_K6(8192):
--CV_CALIB_RATIONAL_MODEL(16384):

*解説(C版) [#ge3f0297]
-world_pointsのサイズは3xNか2xN
--Nはフレーム数x点の数
--必ずしも各フレームで同じ点の数である必要は無いが,便宜上そう説明する
--世界座標は3次元だが,内部パラメータを推定する場合平面パターンの必要があり,立体パターンを渡すと文句を言われる.
-image_pointsのサイズは2xN
-当然world_pointsとimage_pointsでサイズと型の整合性が取れてる必要がある
-countsのサイズは1xMかMx1
--Mはフレーム数
-image_sizeはCvSize型の画像サイズ
-Aは3x3の内部パラメータ行列
--内部パラメータの推定を行ってくれるが,flagsの指定次第では初期値を渡す必要がある
-distortionには歪み係数ベクトルが返って来る
--OpenCVで4次元の歪みパラメータを扱える
-rotationsのサイズは3xMか9xMで回転ベクトルの集合が返って来る
--省略するとNULLが渡され,回転ベクトルの推定が行われない
--サイズが3xMの場合はQuaternion表記で,9xMの場合は回転行列のパラメータが各行に入る
-translationsのサイズは3xMで並進ベクトルの集合が返って来る
--省略するとNULLが渡され,並進ベクトルの推定が行われない
-flagsは省略可能.下記のフラグ,もしくはそれらの組み合わせとなる
--CV_CALIB_USE_INTRINSIC_GUESS(1):渡した内部パラメータを利用する
---実際,内部パラメータが既知の場合,[[cvFindExtrinsicCameraParams2>カメラキャリブレーション(外部のみ)]]を利用するべし
---このフラグが指定された無かった場合,cx,cyは画像サイズの中心が,fx,fyは最小二乗法で計算された値が初期値として利用される
--CV_CALIB_FIX_ASPECT_RATIO(2):fxとfyの比率を固定したまま最適化を行う
--CV_CALIB_FIX_PRINCIPAL_POINT(4):光学中心位置だけを固定したまま最適化を行う
--CV_CALIB_ZERO_TANGENT_DIST(8):円周方向の歪み方向が0に固定される

*その他 [#cc938933]
-OpenCV 2.4.8 時点では、 C++ はC実装のラッパー。
-OpenCV 2.2 では遅くとも再投影誤差の返り値があったが、OpenCV 1.0 時点では無い。


*サンプルコード [#sfdf20cb]
#geshi(c++,number){{
 int M = 50;                                        // フレーム数
 int N = M * patternX * patternY;                   // 総点数
 CvMat *world_points = cvCreateMat(N, 3, CV_32FC1); // 世界座標
 CvMat *image_points = cvCreateMat(N, 2, CV_32FC1); // 画像座標
 CvMat *counts       = cvCreateMat(M, 1, CV_32SC1); // 各フレームの点の数
 CvMat *A            = cvCreateMat(3, 3, CV_32FC1); // 内部パラメータ
 CvMat *distortion   = cvCreateMat(4, 1, CV_32FC1); // 歪みベクトル
 CvMat *rotation     = cvCreateMat(M, 3, CV_32FC1); // 回転ベクトルs
 CvMat *translation  = cvCreateMat(M, 3, CV_32FC1); // 並進ベクトルs
 CvSize image_size   = cvSize(width, height);
 
 setPoints(world_points, image_points, counts, M, N); // ここで点をセットする
 // キャリブレーションを行う
 cvCalibrateCamera2( world_points, image_points, counts, image_size, A, distortion, rotations, translations);
 
 cvReleaseMat(&world_points);
 cvReleaseMat(&image_points);
 cvReleaseMat(&counts);
 cvReleaseMat(&A);
 cvReleaseMat(&distortion);
 cvReleaseMat(&rotation);
 cvReleaseMat(&translation);
}}

*実体ファイル [#gb46f406]
-C++インタフェース(2.4.8)
--modules/calib3d/src/calibration.cpp
--modules/calib3d/include/opencv2/calib3d/calib3d.hpp
-Cインタフェース(2.4.8)
--modules/calib3d/src/calibration.cpp
--modules/calib3d/include/opencv2/calib3d/calib3d.hpp
-Cインタフェース(1.0)
--cv/src/cvcalibration.cpp
--cv/include/cv.h

*注意 [#w7d39168]
-基本的にデータは転置してもOKなOpenCVなのに,world_points, image_points, translations, rotationsは高さがフレーム数とか点の数とか,幅が次元数でないとエラーになる.
-上記には無いが,マルチチャンネルの1xNもNx1も利用できる

ジャンル[[:OpenCV]][[:OpenCV 1.0]][[:OpenCV 2.4]]準拠

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS