2017-01-31 8 views
0

2台のカメラの外部較正をお互いに計算したいのですが、これを行うにはcv :: stereoCalibrate()関数を使っています。しかし、結果は現実には対応していない。何が間違っていますか?opencvを使ったマルチカメラ較正:2台のカメラが向き合っている

セットアップ:2台のカメラを高さ7mに取り付け、下を見ながら互いに向き合っています。彼らは視野交差点の多くを持っており、私は校正に使用したチェッカーボード画像をキャプチャしました。

私はイメージを反転していません。

イメージを反転する必要がありますか?カメラが実際に向かい合っていることを伝えるために何か他のことをする必要がありますか?

注:同じ機能は、同じ方向に向いているカメラ同士を完全に較正します(一般的なステレオカメラのように)。

おかげ

+0

較正に使用した画像の数はいくつですか?彼らは十分な回転のバリエーションがありますか? – hiroki

+0

まともな回転と歪みのある50枚の画像を使用しています。 – user3755683

+0

私は何をしますか: 'cv :: calibrateCamera()'を使って各カメラを独立して調整します。 2つのカメラフレーム間の変形を見積もる:それぞれのカメラで表示されるチェス盤のパターン+ 'cv :: solvePnP()'。変換「c1Mc2」は、「c1Mo×(c2Mo)^ -1」として推定することができる。 – Catree

答えて

0

あなたは、一致指数を持つポイントが同じ物理的な位置に対応するように、正しくimagePoints1imagePoints2を指定する必要があり、「カメラが実際にお互いに直面していることを伝える」ために。

カメラが同じ方向を向いていても設定が機能しない場合、関数が完全に機能する場合、ポイントインデックスの間に不一致がある可能性があります(ほとんどの点が縦横に反転します)。

これをデバッグする1つの方法は、各フレームの点の近くにインデックスを描画するか、またはそれらを色分けしてイメージ間で一致させることです。

1つの質問 - なぜcv::stereoCalibrate()を使用しますか?あなたが説明した設定は、そのための良いユースケースではないようです。カメラの外的パラメータを推定する場合は、cv::calibrateCamera()を使用できます。唯一の欠点は、すべての提供されたビュー(すべての画像が同じまたは非常に類似したカメラで撮影されたもの)に固有のパラメータが同じであることを前提としていることです。そうでない場合は、実際にはcv::stereoCalibrate()がより適しています(マニュアルでは、それぞれのカメラ固有のパラメータを個別に推定することを示唆しています)

+0

ポイントとポイントの対応がよく確認されました。それは反転の必要性を示唆していない。 私は、 'cv :: stereoCalibrate()'によって提供される第1カメラと第2カメラの間の回転と平行移動を見たいと思います。そして、私は 'cv :: calibrateCamera()'を使って個々のカメラを較正し、 'cv :: stereoCalibrate()'にカメラ行列を提供しています。 カメラ間の変換を見つけるために 'cv :: calibrateCamera()'の結果を使用することをどうお勧めしますか? – user3755683

+0

docによれば、 'objectPoints'はマーカーの3D点座標のベクトルのベクトルになります、' imagePoints'は検出された2次元点座標のベクトルのベクトルになります、 'rvecs'と' tvecs'はそれぞれの外来語を含みます各ビュー(回転と平行移動)。もしあなたができるならば - 写真のサンプルを提供してください - それは物事を明確にするのに役立ちます。 – alexisrozhkov

関連する問題