5

opencvを使用して2台のカメラ(LとRと名付けましょう)のステレオキャリブレーションを行っています。20ペアのチェッカーボード画像を使用し、Lに対するRの変換を計算します。新しいペアの画像を使用し、画像Lの2Dチェッカーボードコーナーを計算し、キャリブレーションに従ってそれらのポイントを変換して、画像Rの対応する変換されたポイントは、その画像のチェッカーボードの角と一致することを期待しています。

2Dポイントを[x、y]から[x、y、1]に変換し、3x3回転行列を乗算し、回転ベクトルを追加してからzで除算するという単純な方法を試しましたが、結果が間違っているため、それほど単純ではないと思います(?)

編集(いくつかのことを明確にするため):

これを実行したい理由は、基本的に、新しいペアの画像でステレオキャリブレーションを検証するためです。したがって、実際には2つの画像間で新しい2D変換を取得したくないので、見つけた3D変換が正しいかどうかを確認したいと思います。

これが私の設定です:

設定

2台のカメラ(E)に関連する回転と平行移動がありますが、各カメラ(E_R、E_L)に関連するオブジェクトの回転と平行移動はありません。

理想的には私がやりたいこと:

  1. カメラLからの画像の2Dコーナーを選択します(ピクセル単位、たとえば[100,200]など)。
  2. 私が見つけた行列Eに基づいて、2次元点に対してある種の変換を行います。
  3. カメラRから画像内の対応する2Dポイントを取得し、それらを描画します。うまくいけば、実際のコーナーと一致します。

しかし、考えれば考えるほど、これは間違っている/できないと確信しています。

私が今試していること:

  1. カメラの固有パラメーター(たとえば、I_RとI_L)を使用して、2つの最小二乗システムを解いてE_RとE_Lを見つけます。
  2. カメラLからの画像の2Dコーナーを選択します。
  3. それらのコーナーを対応する3Dポイント(3d_points_L)に投影します。
  4. 実行:3d_points_R =(E_L).inverse * E * E_R * 3d_points_L
  5. 3d_points_Rから2d_points_Rを取得し、それらを描画します。

何か新しいものがあれば更新します

4

1 に答える 1

2

それを行うのは実際には簡単ですが、いくつかの間違いを犯しています。ステレオ キャリブレーション後、R と L は、2 番目のカメラの位置と方向を最初のカメラの 3D 座標系で最初のカメラに関連付けます。また、位置を三角測量するために必要なカメラのペアによってポイントの 3D 位置を見つけることも忘れないでください。z コンポーネントを 1 に設定すると、2 つの間違いを犯しています。まず、一般的な OpenCV ステレオ キャリブレーション コードを使用し、チェッカー ボードの角間の距離を cm で指定した可能性があります。したがって、z=1 はカメラの中心から 1 cm 離れていることを意味し、カメラに非常に近いことを意味します。次に、すべての点に同じ z を設定することで、チェッカー ボードが主軸 (別名、光軸または主光線) に対して垂直であると言っています。おそらくあなたのイメージではそうではありません。つまり、最初にいくつかの仮想 3D ポイントを 2 番目のカメラの座標系に変換してから、それらをイメージ プレーンに投影しています。

平面点だけを変換したい場合は、2 つのカメラ間のホモグラフィを見つけて (OpenCV には機能があります)、それを使用できます。

于 2012-08-17T10:47:29.867 に答える