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

double calibrateCamera( InputArrayOfArrays _objectPoints, InputArrayOfArrays _imagePoints, Size imageSize, InputOutputArray _cameraMatrix, InputOutputArray _distCoeffs, OutputArrayOfArrays _rvecs, OutputArrayOfArrays _tvecs, int flags, TermCriteria criteria );

複数フレームで求められた平面パターンの座標からキャリブレーションを行う

引数

  • _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
    • 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版)

  • 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に固定される

その他

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

サンプルコード

  1.  int M = 50;                                        // フレーム数
  2.  int N = M * patternX * patternY;                   // 総点数
  3.  CvMat *world_points = cvCreateMat(N, 3, CV_32FC1); // 世界座標
  4.  CvMat *image_points = cvCreateMat(N, 2, CV_32FC1); // 画像座標
  5.  CvMat *counts       = cvCreateMat(M, 1, CV_32SC1); // 各フレームの点の数
  6.  CvMat *A            = cvCreateMat(3, 3, CV_32FC1); // 内部パラメータ
  7.  CvMat *distortion   = cvCreateMat(4, 1, CV_32FC1); // 歪みベクトル
  8.  CvMat *rotation     = cvCreateMat(M, 3, CV_32FC1); // 回転ベクトルs
  9.  CvMat *translation  = cvCreateMat(M, 3, CV_32FC1); // 並進ベクトルs
  10.  CvSize image_size   = cvSize(width, height);
  11.  
  12.  setPoints(world_points, image_points, counts, M, N); // ここで点をセットする
  13.  // キャリブレーションを行う
  14.  cvCalibrateCamera2( world_points, image_points, counts, image_size, A, distortion, rotations, translations);
  15.  
  16.  cvReleaseMat(&world_points);
  17.  cvReleaseMat(&image_points);
  18.  cvReleaseMat(&counts);
  19.  cvReleaseMat(&A);
  20.  cvReleaseMat(&distortion);
  21.  cvReleaseMat(&rotation);
  22.  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準拠


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-07-07 (月) 17:46:52 (1236d)