私は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/
あなたが観察ポイントの3D世界座標を知っていればそれは上記明確ではありません異なる画像でこの場合、これはPerspective-n-point-problemです。ここで利用可能なEPnPアルゴリズム(http://cvlab.epfl.ch/software/EPnP/index.php)を使用して各カメラのパラメータを調整することができます。それ以外の場合は、下の私の答えを見てください。 – Rulle
撮影されたオブジェクトの3次元座標は不明です。 –
オブジェクト上のポイントの3次元ワールド座標が_unknown_の場合、オブジェクトポイントが_known_であると思われるので、cv :: calibrateCameraは機能しません。 – Rulle