2012-10-19 7 views
9

に2D画像点を変換するので、私が持っている: - カメラ歪み係数&組み込みマトリックス - カメラseparatedly計算、(翻訳&ローテーション情報をポーズ他の方法で)& a 4x4 - カメラフレーム内の2D点、私はOpenCVの(findChessboardなど)で自分のカメラを較正した3D世界の単位ベクトル

どのようにこれらの2D点を世界に指し示す3D単位ベクトルに変換できますか?私はcv :: undistortPointsを使ってみましたが、それはしないように思われます(2D再マップされた点を返すだけです)、カメラ組み込み関数を使ってカメラをモデル化するために使用する行列計算の方法は正確にはわかりません。

+0

2次元のポイントは何ですか? –

+0

カメラのフレーム内でキャプチャされた2D画像(ピクセル)座標。基本的に、2D画像座標と上記のデータが与えられた場合、カメラからの2D画像座標を指す3D単位ベクトルを構築できるはずです。 – Yeraze

答えて

14

2dポイントを均等点に変換し(3番目の座標を1にします)、カメラの組み込み関数の逆行列を掛けます。たとえば、

cv::Matx31f hom_pt(point_in_image.x, point_in_image.y, 1); 
hom_pt = camera_intrinsics_mat.inv()*hom_pt; //put in world coordinates 

cv::Point3f origin(0,0,0); 
cv::Point3f direction(hom_pt(0),hom_pt(1),hom_pt(2)); 

//To get a unit vector, direction just needs to be normalized 
direction *= 1/cv::norm(direction); 

ここで、原点と方向は、そのイメージポイントに対応するワールド空間でレイを定義します。ここでは、原点がカメラの中央にあることに注意してください。カメラのポーズを使用して別の原点に変換できます。歪み係数は、実際のカメラからピンホールカメラモデルにマップされ、実際の2次元座標を見つけるために、最初に使用する必要があります。手順は次に

  1. Undistortは
  2. 歪み係数で2D座標(上記のように)、光線何を好きな座標系ことを移動
  3. 光線に変換されます。
+0

あなたはhom_ptを正規化するのを忘れました。 :) –

+0

@IanMedeirosは、それを単位ベクトルにするか、3番目の要素1を作ることを意味しますか?これらの点によって定義されるベクトルは、カメラ行列の逆数を掛けた後に、第3の要素をz座標として解釈することができる。 – Hammer

+0

実際には、私はあなたの答えをupvotedしましたが、今は正しいかどうかは分かりません。私はあなたが話しているホモジナイゼーションを行う前に、内在マトリックスを使って、2D座標をピクセルからワールド座標に変換する必要があると思います。カメラの姿勢情報を使ってそれを変換して、光線の方向を得ることができます。 –

関連する問題