私は OpenCV (findChessboard など) でカメラを調整したので、次のようにしました。
これらの 2D ポイントを、世界を指す 3D 単位ベクトルに変換するにはどうすればよいですか? 私は cv::undistortPoints を使用してみましたが、それはうまくいかないようです (2D リマップ ポイントのみを返します)。
私は OpenCV (findChessboard など) でカメラを調整したので、次のようにしました。
これらの 2D ポイントを、世界を指す 3D 単位ベクトルに変換するにはどうすればよいですか? 私は cv::undistortPoints を使用してみましたが、それはうまくいかないようです (2D リマップ ポイントのみを返します)。
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 座標を見つけるために最初に使用する必要があります。その時の手順は