ホモグラフィ行列からカメラポーズを計算する方法は?


13

キャリブレーションされたカメラを1台だけ使用するとします。このカメラから、私は画像AとB IがAとBの間のホモグラフィを知ってもらう、通過計算のOpenCV)(findHomography

画像Aのポーズ(回転行列Rと並進ベクトルt)がわかっているので、画像Bのポーズが必要です。取得したら、後続の画像のすべてのポーズを計算できるようになります。

Bのポーズの計算の実装を知っていますか?ウェブ上でいくつかの記事を見つけましたが、簡単に実装できるソリューションを見つけることができませんでした...


私はあなたのコードの使い方を理解しているかどうかわかりません。OpenCVを使用してHomographyを取得しますが、アルゴリズムを使用してそのHomographyを送信すると、常にこれが返されます。cameraPose [1、0、0、0; 0、1、0、0;
0、0、1、0

回答:


7

私の答えが遅すぎたとしても、他の人がこれを役に立つと思うかもしれません。ホモグラフィのopenCVポーズのコードがあります。この本当に便利なウェブサイトであるeuclideanspaceでメソッドを見つけました。

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

////


私はコードであなたの関数を使用しました。この方法を使用して計算されたポーズ行列は常に[1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]。説明はありますか?
ムハンメットアリアサン

Aのポーズを使用していますか?入力Hのみを使用しているようです
-Guig


0

Opencv 3.0+で実装されたホモグラフィ分解メソッドを使用できます

composeHomographyMat

  • Opencvの関数は、可能な回転、カメラの法線、および変換行列のセットを返します。
  • 最初の画像がキャプチャされたときに、カメラの法線とカメラの法線を比較することにより、それらの中から正しいセットを選択する必要があります
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.