12

私は OpenCV (findChessboard など) でカメラを調整したので、次のようにしました。

これらの 2D ポイントを、世界を指す 3D 単位ベクトルに変換するにはどうすればよいですか? 私は cv::undistortPoints を使用してみましたが、それはうまくいかないようです (2D リマップ ポイントのみを返します)。

4

1 に答える 1

20

2d 点を同次点に変換し (1 に等しい 3 番目の座標を指定)、カメラの組み込み行列の逆数を掛けます。例えば

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);

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

  1. 歪み係数を使用して 2 次元座標を歪ませない
  2. 光線に変換 (上図参照)
  3. その光線を好きな座標系に移動します。
于 2012-10-19T16:14:43.163 に答える