#include #include #include #include #include #include #include #include #include namespace msckf_vio { namespace image_handler { void undistortPoints( const std::vector& pts_in, const cv::Vec4d& intrinsics, const std::string& distortion_model, const cv::Vec4d& distortion_coeffs, std::vector& pts_out, const cv::Matx33d &rectification_matrix, const cv::Vec4d &new_intrinsics) { if (pts_in.size() == 0) return; const cv::Matx33d K( intrinsics[0], 0.0, intrinsics[2], 0.0, intrinsics[1], intrinsics[3], 0.0, 0.0, 1.0); const cv::Matx33d K_new( new_intrinsics[0], 0.0, new_intrinsics[2], 0.0, new_intrinsics[1], new_intrinsics[3], 0.0, 0.0, 1.0); if (distortion_model == "radtan") { cv::undistortPoints(pts_in, pts_out, K, distortion_coeffs, rectification_matrix, K_new); } else if (distortion_model == "equidistant") { cv::fisheye::undistortPoints(pts_in, pts_out, K, distortion_coeffs, rectification_matrix, K_new); } else { ROS_WARN_ONCE("The model %s is unrecognized, use radtan instead...", distortion_model.c_str()); cv::undistortPoints(pts_in, pts_out, K, distortion_coeffs, rectification_matrix, K_new); } return; } std::vector distortPoints( const std::vector& pts_in, const cv::Vec4d& intrinsics, const std::string& distortion_model, const cv::Vec4d& distortion_coeffs) { const cv::Matx33d K(intrinsics[0], 0.0, intrinsics[2], 0.0, intrinsics[1], intrinsics[3], 0.0, 0.0, 1.0); std::vector pts_out; if (distortion_model == "radtan") { std::vector homogenous_pts; cv::convertPointsToHomogeneous(pts_in, homogenous_pts); cv::projectPoints(homogenous_pts, cv::Vec3d::zeros(), cv::Vec3d::zeros(), K, distortion_coeffs, pts_out); } else if (distortion_model == "equidistant") { cv::fisheye::distortPoints(pts_in, pts_out, K, distortion_coeffs); } else { ROS_WARN_ONCE("The model %s is unrecognized, using radtan instead...", distortion_model.c_str()); std::vector homogenous_pts; cv::convertPointsToHomogeneous(pts_in, homogenous_pts); cv::projectPoints(homogenous_pts, cv::Vec3d::zeros(), cv::Vec3d::zeros(), K, distortion_coeffs, pts_out); } return pts_out; } cv::Point2f distortPoint( const cv::Point2f& pt_in, const cv::Vec4d& intrinsics, const std::string& distortion_model, const cv::Vec4d& distortion_coeffs) { std::vector pts_in; pts_in.push_back(pt_in); const cv::Matx33d K(intrinsics[0], 0.0, intrinsics[2], 0.0, intrinsics[1], intrinsics[3], 0.0, 0.0, 1.0); std::vector pts_out; if (distortion_model == "radtan") { std::vector homogenous_pts; cv::convertPointsToHomogeneous(pts_in, homogenous_pts); cv::projectPoints(homogenous_pts, cv::Vec3d::zeros(), cv::Vec3d::zeros(), K, distortion_coeffs, pts_out); } else if (distortion_model == "equidistant") { cv::fisheye::distortPoints(pts_in, pts_out, K, distortion_coeffs); } else { ROS_WARN_ONCE("The model %s is unrecognized, using radtan instead...", distortion_model.c_str()); std::vector homogenous_pts; cv::convertPointsToHomogeneous(pts_in, homogenous_pts); cv::projectPoints(homogenous_pts, cv::Vec3d::zeros(), cv::Vec3d::zeros(), K, distortion_coeffs, pts_out); } return pts_out[0]; } } // namespace image_handler } // namespace msckf_vio