外部パラメータと内部パラメータのキャリブレーションを行う
- double calibrateCamera( InputArrayOfArrays _objectPoints, InputArrayOfArrays _imagePoints, Size imageSize, InputOutputArray _cameraMatrix, InputOutputArray _distCoeffs, OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs, int flags, TermCriteria criteria );
- void cvCalibrateCamera2( CvMat* world_points, CvMat* image_points, CvMat* counts, CvSize image_size, CvMat* A, CvMat* distortion, CvMat* rotations, CvMat* translations, int flags);
- 解説(C++版)
- 解説(C版)
- その他
- サンプルコード
- 実体ファイル
- 注意
複数フレームで求められた平面パターンの座標からキャリブレーションを行う
- _objectPoints:Mat型のパターンの世界座標。入力
- _imagePoints:Mat型のパターンの画像座標。入力
- imageSize:Size型の撮影画像の画像サイズ。入力
- _cameraMatrix:Mat型のカメラ行列(内部行列)。出力
- _distCoeffs:Mat型の歪計数ベクトル。出力
- _rvecs:Mat型の回転ベクトルの集合。出力
- _tvecs:Mat型の並進ベクトルの集合。出力
- flags:int型の処理フラグ。入力。省略可
- criteria:TermCriteria型の収束条件。入力。省略可
返り値†
double型の再投影誤差
void cvCalibrateCamera2( CvMat* world_points, CvMat* image_points, CvMat* counts, CvSize image_size, CvMat* A, CvMat* distortion, CvMat* rotations, CvMat* translations, int flags);†
複数フレームで求められた平面パターンの座標からキャリブレーションを行う(注意!このCインタフェースの関数はOpenCV 1.0 に準拠した記述です)
- world_points:CvMat*型のパターンの世界座標
- image_points:CvMat*型のパターンの画像座標
- counts:CvMat*型の各フレームにおいて求められたパターンの個数
- image_size:CvSize型の画像サイズ
- A:CvMat*型の内部パラメータ行列
- distortion:CvMat*型の歪み係数ベクトル
- rotation:CvMat*型の回転ベクトルの集合.省略可能
- translation:CvMat*型の並進ベクトルの集合.省略可能
- flags:int型の処理フラグ.省略可能
返り値†
- void型なのでなし(OpenCV 1.0時点)
- 再投影誤差を表すdouble型(OpenCV 2.2以降)
解説(C++版)†
- _objectPointsのサイズは3xNか2xN
- Nはフレーム数x点の数
- 必ずしも各フレームで同じ点の数である必要は無いが,便宜上そう説明する
- 世界座標は3次元だが,内部パラメータを推定する場合平面パターンの必要があり,立体パターンを渡すと文句を言われる.
- image_pointsのサイズは2xN
- 当然world_pointsとimage_pointsでサイズと型の整合性が取れてる必要がある
- countsのサイズは1xMかMx1
- image_sizeはCvSize型の画像サイズ
- Aは3x3の内部パラメータ行列
- 内部パラメータの推定を行ってくれるが,flagsの指定次第では初期値を渡す必要がある
- distortionには歪み係数ベクトルが返って来る
- 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版)†
- world_pointsのサイズは3xNか2xN
- Nはフレーム数x点の数
- 必ずしも各フレームで同じ点の数である必要は無いが,便宜上そう説明する
- 世界座標は3次元だが,内部パラメータを推定する場合平面パターンの必要があり,立体パターンを渡すと文句を言われる.
- image_pointsのサイズは2xN
- 当然world_pointsとimage_pointsでサイズと型の整合性が取れてる必要がある
- countsのサイズは1xMかMx1
- image_sizeはCvSize型の画像サイズ
- Aは3x3の内部パラメータ行列
- 内部パラメータの推定を行ってくれるが,flagsの指定次第では初期値を渡す必要がある
- distortionには歪み係数ベクトルが返って来る
- rotationsのサイズは3xMか9xMで回転ベクトルの集合が返って来る
- 省略するとNULLが渡され,回転ベクトルの推定が行われない
- サイズが3xMの場合はQuaternion表記で,9xMの場合は回転行列のパラメータが各行に入る
- translationsのサイズは3xMで並進ベクトルの集合が返って来る
- 省略するとNULLが渡され,並進ベクトルの推定が行われない
- flagsは省略可能.下記のフラグ,もしくはそれらの組み合わせとなる
- CV_CALIB_USE_INTRINSIC_GUESS(1):渡した内部パラメータを利用する
- CV_CALIB_FIX_ASPECT_RATIO(2):fxとfyの比率を固定したまま最適化を行う
- CV_CALIB_FIX_PRINCIPAL_POINT(4):光学中心位置だけを固定したまま最適化を行う
- CV_CALIB_ZERO_TANGENT_DIST(8):円周方向の歪み方向が0に固定される
その他†
- OpenCV 2.4.8 時点では、 C++ はC実装のラッパー。
- OpenCV 2.2 では遅くとも再投影誤差の返り値があったが、OpenCV 1.0 時点では無い。
サンプルコード†
#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);
}}
実体ファイル†
- 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
- 基本的にデータは転置してもOKなOpenCVなのに,world_points, image_points, translations, rotationsは高さがフレーム数とか点の数とか,幅が次元数でないとエラーになる.
- 上記には無いが,マルチチャンネルの1xNもNx1も利用できる
ジャンル:OpenCV:OpenCV 1.0:OpenCV 2.4準拠