12

OpenCVを使用して、各カメラのビューからオブジェクトの画像を取得すると、回転行列、平行移動ベクトル、および各カメラのスケーリング係数を取得するにはどうすればよいですか?すべての画像について、私はいくつかの特徴点の画像座標を持っています。すべての画像にすべての特徴点が表示されるわけではありません。 私は、オブジェクトの特徴点の計算された3D座標をわずかに異なるオブジェクトにマッピングして、第2のオブジェクトの形状を第1のオブジェクトに整列させたいと思います。特徴点からのOpenCV外部カメラ

私はそれがcv::calibrateCamera(...)を使用して可能である聞いたが、私は

誰かが問題のようなものの経験を持っています...かなりそれを介して取得することはできませんか?

+0

あなたが観察ポイントの3D世界座標を知っていればそれは上記明確ではありません異なる画像でこの場合、これはPerspective-n-point-problemです。ここで利用可能なEPnPアルゴリズム(http://cvlab.epfl.ch/software/EPnP/index.php)を使用して各カメラのパラメータを調整することができます。それ以外の場合は、下の私の答えを見てください。 – Rulle

+1

撮影されたオブジェクトの3次元座標は不明です。 –

+0

オブジェクト上のポイントの3次元ワールド座標が_unknown_の場合、オブジェクトポイントが_known_であると思われるので、cv :: calibrateCameraは機能しません。 – Rulle

答えて

11

私はOpenCVであなたと同じ問題に直面していました。ステレオ画像のペアがあり、カメラの外部パラメータと観測されたすべての点のワールド座標を計算したかったのです。この問題はここで扱われました:

Berthold K. P. Horn。相対的方向性が再考される。 Berthold K. P. Horn。人工知能研究所、マサチューセッツ工科大学、545テクノロジー...

http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.64.4700

はしかし、私は(おそらくあなたがものを見つけるでしょう)この問題の適切な実装を見つけることができませんでした。時間の制約のために、私はこのペーパーのすべての数学を理解し、それを自分で実装する時間がありませんでしたので、私にとっては速くて汚い解決策を思いつきました。

最初のカメラに外部パラメータRT = Matx :: eye()があると仮定します。今は、第2カメラの回転Rについて、と推測してください。両方の画像で観測された画像点のすべてのペアについて、対応する光線の方向を世界座標で計算し、2次元配列dirsに保存します(EDIT:内部カメラパラメータは既知と仮定しています)。すべてのカメラの向きを知っていると仮定しているので、これを行うことができます。 AC = 0ここで、Cは2番目のカメラの中心です。私は計算する機能をご提供します。そして、

Mat buildA(Matx<double, 3, 3> &R, Array<Vec3d, 2> dirs) 
{ 
    CV_Assert(dirs.size(0) == 2); 
    int pointCount = dirs.size(1); 
    Mat A(pointCount, 3, DataType<double>::type); 
    Vec3d *a = (Vec3d *)A.data; 
    for (int i = 0; i < pointCount; i++) 
    { 
     a[i] = dirs(0, i).cross(toVec(R*dirs(1, i))); 
     double length = norm(a[i]); 
     if (length == 0.0) 
     { 
      CV_Assert(false); 
     } 
     else 
     { 
      a[i] *= (1.0/length); 
     } 
    } 
    return A; 
} 

CV :: SVD :: solveZ(A)がこのシステムにあなたの規範1の最小二乗解を与えるを呼び出します。この方法で、2番目のカメラの回転と平行移動を取得します。しかし、私はちょうど2番目のカメラの回転について推測したので、私はその回転についていくつかの推測を行います(3x1ベクトルオメガを使用してパラメータ化しました。そこからcv :: Rodriguesを使って回転行列を計算します)。数学的なヤコビ行列を持つLevenberg-Marquardtオプティマイザで繰り返しAC = 0の系を解く。それは私のために働くが、それは少し汚れているので、時間があれば、私はあなたが紙で説明されているものを実装することをお勧めします。

EDIT:ここ

は、残基のベクトルを評価するためのレーベンバーグ・マルカートオプティマイザでのルーチンです:

void Stereo::eval(Mat &X, Mat &residues, Mat &weights) 
{ 

     Matx<double, 3, 3> R2Ref = getRot(X); // Map the 3x1 euler angle to a rotation matrix 
     Mat A = buildA(R2Ref, _dirs); // Compute the A matrix that measures the distance between ray pairs 
     Vec3d c; 
     Mat cMat(c, false); 
     SVD::solveZ(A, cMat); // Find the optimum camera centre of the second camera at distance 1 from the first camera 
     residues = A*cMat; // Compute the output vector whose length we are minimizing 
    weights.setTo(1.0); 
} 

ちなみに、私はインターネット上でもう少し検索し、見つかりましたカメラ間の相対的な向きを計算するのに有用な他のコード。私はまだコードを試していないが、それは便利そうです:

http://www9.in.tum.de/praktika/ppbv.WS02/doc/html/reference/cpp/toc_tools_stereo.html

http://lear.inrialpes.fr/people/triggs/src/

http://www.maths.lth.se/vision/downloads/

+0

ありがとうございました。私はあなたが書いたものとコード化されたものを理解していると思うし、私の問題の解決策を探すのに大いに役立つだろう。しかし、 'cv :: calibrateCamera(...)'はあなたが提案したものと非常によく似ています。アルゴリズムは次のように記述されています。 –

+0

1.最初に、最初の組み込みパラメータ(プレーンキャリブレーションパターンでのみ使用可能なオプション)を計算するか、入力パラメータから読み込みます。 CV_CALIB_FIX_K?の一部が指定されていない限り、歪み係数はすべて最初にゼロに設定されます。 2.初期カメラ姿勢は、内在パラメータが既にわかっているかのように見積もられます。これは、FindExtrinsicCameraParams2 –

+0

を使用して行われます。3.その後、再投影誤差、すなわち観測された特徴点imagePointsと投影された(カメラパラメータの現在の推定値を使用した)距離の二乗の総和を最小化するために、Levenberg-Marquardt poses)オブジェクトポイントobjectPoints; ProjectPoints2を参照してください。 –

2

今後、ステレオペアとして使用するためにキャリブレーションを行いたいスタティックカメラはありますか?この場合、cv::stereoCalibrate()関数を使用します。 OpenCVにはいくつかのサンプルコードが含まれています。そのうちの1つはstereo_calib.cppであり、調査する価値があります。

+0

あなたの答えをありがとうが、私はステレオペアを使用することに関心がありません。私は1つのカメラを持っています、それは、異なる側面から同じオブジェクトを見るために使用されます。そして、すべての画像にマークされた特徴点は、わずかに変形される仮想物体の対応点の新たな位置を計算するのに役立つはずである。仮想オブジェクトは、撮影された実際のオブジェクトと正確なジオメトリを持つ必要があります。 BTW 'cv :: calibrateCamera(...)'は、計算の進行中に 'cv :: stereoCalibrate()'を使います。 –

+0

あなたの1台のカメラはキャリブレーションされていますか(つまり、焦点距離、ピクセルスキュー、主点、歪み係数などの固有のパラメータを知っていますか? – Chris

+0

私はそれらを見積もることができましたが、実際の値は不明です。 –

関連する問題