26class UndistortMap :
public cv::Mat_<cv::Point_<double>> {
28 enum class VisualizationOptions : uint8_t {
33 UndistortMap() =
default;
35 UndistortMap(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
37 UndistortMap(
const std::vector<double> &intrinsics,
const std::vector<double> &dist_coeff,
const cv::Size &sz);
40 UndistortMap(
const std::vector<cv::Point_<T>> &data,
const cv::Size &sz) {
41 static_assert(std::is_arithmetic_v<T>,
"ev::UndistortMap: the point type must be arithmetic.");
42 if(data.size() !=
static_cast<std::size_t
>(sz.area())) {
43 CV_Error(cv::Error::StsBadSize,
"ev::UndistortMap: Data size does not match frame size.");
45 cv::Mat_<cv::Point_<double>>::create(sz);
46 cv::Mat_<cv::Point_<double>>::iterator it = cv::Mat_<cv::Point_<double>>::begin();
47 std::for_each(data.begin(), data.end(), [&it](
const cv::Point_<T> &p) { *it++ = cv::Point_<double>(p.x, p.y); });
51 inline bool operator()(cv::Point_<T> &p)
const {
52 static_assert(std::is_arithmetic_v<T>,
"ev::UndistortMap: the point type must be arithmetic.");
53 if(!cv::Point(
static_cast<int>(p.x),
static_cast<int>(p.y)).inside(UndistortMap::operator cv::Rect())) {
56 p =
static_cast<cv::Point_<T>
>(cv::Mat_<cv::Point_<double>>::ptr<cv::Point_<double>>(
static_cast<int>(p.y))[
static_cast<int>(p.x)]);
60 template <
typename T, std::
size_t N>
62 for(std::size_t i = 0; i < N; i++) {
63 UndistortMap::operator()(array[i]);
68 inline void operator()(
Vector_<T> &vector)
const {
69 for(std::size_t i = 0; i < vector.size(); i++) {
70 UndistortMap::operator()(vector[i]);
74 inline void operator()(
const cv::Mat &src, cv::Mat &dst) {
75 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
78 [[nodiscard]]
inline explicit operator cv::Rect()
const {
79 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
82 [[nodiscard]]
inline explicit operator cv::Size()
const {
83 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
86 [[nodiscard]] cv::Mat visualize(
const VisualizationOptions options = VisualizationOptions::COLOR)
const;
89 void init(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
90 std::array<cv::Mat, 2> cvUndistortionMap_;