OpenCv を使用して画像の歪みを修正し、ピクセル座標を指定して実世界の座標を計算しようとしています。これを行う方法の例をオンラインまたはOpenCvブックで見つけることができません。
チェス盤の画像でカメラのキャリブレーションを行いました。ここで必要なのは、カメラ マトリックス、歪み係数、回転および並進ベクトルに基づいて実世界の座標を取得する、ピクセル座標を指定できる基本関数だけです。
誰もこれを行う方法を知っていますか?
OpenCv を使用して画像の歪みを修正し、ピクセル座標を指定して実世界の座標を計算しようとしています。これを行う方法の例をオンラインまたはOpenCvブックで見つけることができません。
チェス盤の画像でカメラのキャリブレーションを行いました。ここで必要なのは、カメラ マトリックス、歪み係数、回転および並進ベクトルに基づいて実世界の座標を取得する、ピクセル座標を指定できる基本関数だけです。
誰もこれを行う方法を知っていますか?
findHomography()
関数を見てみましょう。一連の点の実世界での位置がわかっている場合は、この関数を使用して、関数で使用できる変換行列を作成できます。perspectiveTransform()
std::vector<Point2f> worldPoints;
std::vector<Point2f> cameraPoints;
//insert somepoints in both vectors
Mat perspectiveMat_= findHomography(cameraPoints, worldPoints, CV_RANSAC);
//use perspective transform to translate other points to real word coordinates
std::vector<Point2f> camera_corners;
//insert points from your camera image here
std::vector<Point2f> world_corners;
perspectiveTransform(camera_corners, world_corners, perspectiveMat_);
関数の詳細については、こちらを参照してください
私が正しく理解しているように、イメージポイントからワールドポイントが必要です。単眼カメラでは、この問題は解決できません。現実世界の点からカメラまでの深度 (距離) を決定することはできません。
世界地図を作成し、ビデオからカメラの軌跡を計算する視覚的同時位置推定およびマッピング (SLAM) アルゴリズムがありますが、それらはまったく別のものです。
2Dピクセル座標で表現された単一の画像とその上の点を考えると、現実世界には無数の3D点があり、すべて線に属し、画像内の点にマッピングされます... 1つだけではありません点。
ただし、カメラからのオブジェクトの距離がピクセル (x、y) でわかっている場合は、その位置を 3D で計算できます。