私はチェス盤に相当するカメラを持っています。ポイントの世界の3D位置と、カメラ画像上の対応する投影ポイントの2D位置を知っています。すべてのワールド ポイントは同じ平面に属します。私はsolvePnPを使用しています:
Matx33d camMat;
Matx41d distCoeffs;
Matx31d rvec;
Matx31d tvec;
std::vector<Point3f> objPoints;
std::vector<Point2f> imgPoints;
solvePnP(objPoints, imgPoints, camMat, distCoeffs, rvec, tvec);
次に、projectPoints を使用して 3D ワールド ポイントから 2D イメージ ポイントに移動できます。
std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);
projPoints は imgPoints に非常に近いです。
同じ平面に属する 3D ワールド ポイントに対応するスクリーン ポイントで逆を行うにはどうすればよいですか。単一のビューから 3 次元の位置を再構築することはできないことはわかっていますが、ここでは同じ平面にいるので、実際には 2 次元の問題です。逆回転行列と逆平行移動ベクトルを計算できますが、どうすればよいですか?
Matx33d rot;
Rodrigues(rvec, rot);
Matx33d camera_rotation_vector;
Rodrigues(rot.t(), camera_rotation_vector);
Matx31d camera_translation_vector = -rot.t() * tvec;