4

私は、画像の対応に基づいて 2 つ以上のカメラ間の相対的なカメラ ポーズを見つける必要がある状況にいます (そのため、カメラは同じポイントにありません)。これを解決するために、ここで説明したのと同じアプローチを試しました(以下のコード)。

cv::Mat calibration_1 = ...;
cv::Mat calibration_2 = ...;
cv::Mat calibration_target = calibration_1;
calibration_target.at<float>(0, 2) = 0.5f * frame_width;  // principal point
calibration_target.at<float>(1, 2) = 0.5f * frame_height; // principal point

auto fundamental_matrix = cv::findFundamentalMat(left_matches, right_matches, CV_RANSAC);
fundamental_matrix.convertTo(fundamental_matrix, CV_32F);
cv::Mat essential_matrix = calibration_2.t() * fundamental_matrix * calibration_1;
cv::SVD svd(essential_matrix);
cv::Matx33f w(0,-1,0,
    1,0,0,
    0,0,1);
cv::Matx33f w_inv(0,1,0,
    -1,0,0,
    0,0,1);
cv::Mat rotation_between_cameras = svd.u * cv::Mat(w) * svd.vt; //HZ 9.19

しかし、ほとんどの場合、非常に奇妙な結果が得られます。それで、私の次の考えは、本格的なバンドルアジャスターを使用することでした(これは私が探していることをするはずです?!)。現在、私の唯一の大きな依存関係は OpenCV であり、文書化されていないバンドル調整の実装しかありません。

質問は次のとおりです。

  • 依存関係がなく、商用利用可能なライセンスを使用するバンドル アジャスターはありますか?
  • extrinsics を見つける他の簡単な方法はありますか?
  • カメラまでの距離が大きく異なるオブジェクトは問題になりますか? (重視差)

前もって感謝します

4

2 に答える 2

1

私も同じ問題に取り組んでおり、よりスリムな問題に直面しています。ここにいくつかの提案があります -

  1. 分解前のエッセンシャル マトリックスの変更: 分解前のエッセンシャル マトリックスの変更 [UW Vt] = SVD(E)、および新しい E' = diag(s,s,0) ここで、s = W(0,0) + W(1,1) / 2

  2. 2 段階の基本行列推定: RANSAC インライアを使用して基本行列を再計算します。

これらの手順により、Rotation 推定がノイズの影響を受けやすくなります。

于 2012-12-03T02:10:48.053 に答える
0

4 つの異なる解を取得し、正の Z 座標を持つ # ポイントが最も多いものを選択する必要があります。解は基本行列の符号を反転し、w を w_inv で置換することによって生成されます。これは、w_inv を計算しましたが、実行しませんでした。他の誰かのコードを再利用していますか?

于 2014-02-24T06:20:49.400 に答える