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

#contents

*void cvFindExtrinsicCameraParams2( CvMat* world_points, CvMat* image_points, CvMat* A, CvMat* distortion, CvMat* rotation, CvMat* translation); [#pb109409]
座標の対応から外部パラメータのみを推定する

**引数 [#sbbbdb76]
-world_points:CvMat*型のパターンの世界座標
-image_points:CvMat*型のパターンの画像座標
-A:CvMat*型の内部パラメータ行列
-distortion:CvMat*型の歪み係数ベクトル
-rotation:CvMat*型の回転ベクトル(4元数表記)
-translation:CvMat*型の並進ベクトル

**返り値 [#i5d8e16b]
-void型なのでなし

*解説 [#c1d1e1d5]
-外部パラメータのキャリブレーションなので内部パラメータは既知の必要がある
-world_pointsのサイズは3xNかNx3
-image_pointsのサイズは2xNかNx2
-当然world_pointsとimage_pointsでサイズと型の整合性が取れてる必要がある
-Aは3x3の内部パラメータ行列
--fx, cx, fy, cy しかパラメータとして利用できない
-distortionには歪み係数ベクトルを入れる
--OpenCVで4次元の歪みパラメータを扱える
--分からなければNULLで省略可能
-rotationのサイズは3xNかNx3で回転ベクトルが返って来る
-translationサイズは3xNかNx3で並進ベクトルが返って来る

*サンプルコード [#h1f6ae3e]
#geshi(c++,number){{
 const int patternX = 4;
 const int patternY = 5;
 CvCapture *camera;
 IplImage *image;
 CvPoint2D32f *corners;

 camera  = cvCaptureFromCAM(-1);  // カメラ初期化
 image   = cvQueryFrame(camera);  // 画像取得
 corners = new CvPoint2D32f [patternX*patternY];
                                  // 座標格納用配列
 cvFindChessboardCorners(image, cvSize(patternX, patternY), corners);
                                  // 点検出
 // 画像座標行列を作成
 for(int i = 0;i < patternX*patternY;i++){
  cvSetReal2D(pointsMatrix, i, 0, corners[i].x);
  cvSetReal2D(pointsMatrix, i, 1, corners[i].y);
 }
 cvFindExtrinsicCameraParams2(world_points, pointsMatrix, intrinsicParameters, distortionParameters, rotationParameters, translationParameters);
                                  // 外部パラメータ計算
 cvReleaseCapture(&camera);       // 解放
 delete [] corners;               // 解放
}}

*実体ファイル [#f99e540b]
-cv/src/cvcalibration.cpp
-cv/include/cv.h

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

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