আপনি এটি 3 টি সহজ পদক্ষেপের সাহায্যে সমাধান করতে পারেন:
ধাপ 1:
ক্যামেরা প্রজেকশন মডেলটি উল্টিয়ে প্রদত্ত 2 ডি চিত্রের পয়েন্টের সাথে রশ্মির সাথে রশ্মির ক্যামের স্থানাঙ্ক ফ্রেমে প্রকাশিত 3 ডি দিকের ভেক্টরটি গণনা করুন:
std::vector<cv::Point2f> imgPt = {{u,v}}; // Input image point
std::vector<cv::Point2f> normPt;
cv::undistortPoints (imgPt, normPt, cameraMatrix, distCoeffs);
cv::Matx31f ray_dir_cam(normPt[0].x, normPt[0].y, 1);
// 'ray_dir_cam' is the 3d direction of the ray in camera coordinate frame
// In camera coordinate frame, this ray originates from the camera center at (0,0,0)
ধাপ ২:
দাবাবোর্ডের সাথে সংযুক্ত স্থানাঙ্ক ফ্রেমে এই রশ্মির ভেক্টরের 3 ডি দিক গণনা করুন, ক্যামেরা এবং দাবা বোর্ডের মধ্যে আপেক্ষিক পোজ ব্যবহার করুন:
// solvePnP typically gives you 'rvec_cam_chessboard' and 'tvec_cam_chessboard'
// Inverse this pose to get the pose mapping camera coordinates to chessboard coordinates
cv::Matx33f R_cam_chessboard;
cv::Rodrigues(rvec_cam_chessboard, R_cam_chessboard);
cv::Matx33f R_chessboard_cam = R_cam_chessboard.t();
cv::Matx31f t_cam_chessboard = tvec_cam_chessboard;
cv::Matx31f pos_cam_wrt_chessboard = -R_chessboard_cam*t_cam_chessboard;
// Map the ray direction vector from camera coordinates to chessboard coordinates
cv::Matx31f ray_dir_chessboard = R_chessboard_cam * ray_dir_cam;
ধাপ 3:
3 ডি রে এবং দাবাবোর্ড বিমানের মধ্যে ছেদটি জেড = 0 দিয়ে ছেদ করে কাঙ্ক্ষিত 3 ডি পয়েন্টটি সন্ধান করুন:
// Expressed in the coordinate frame of the chessboard, the ray originates from the
// 3d position of the camera center, i.e. 'pos_cam_wrt_chessboard', and its 3d
// direction vector is 'ray_dir_chessboard'
// Any point on this ray can be expressed parametrically using its depth 'd':
// P(d) = pos_cam_wrt_chessboard + d * ray_dir_chessboard
// To find the intersection between the ray and the plane of the chessboard, we
// compute the depth 'd' for which the Z coordinate of P(d) is equal to zero
float d_intersection = -pos_cam_wrt_chessboard.val[2]/ray_dir_chessboard.val[2];
cv::Matx31f intersection_point = pos_cam_wrt_chessboard + d_intersection * ray_dir_chessboard;