25class UndistortMap :
public cv::Mat_<cv::Point_<double>> {
27 enum class VisualizationOptions : uint8_t {
32 UndistortMap() =
default;
34 UndistortMap(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
36 UndistortMap(
const std::vector<double> &intrinsics,
const std::vector<double> &dist_coeff,
const cv::Size &sz);
39 UndistortMap(
const std::vector<cv::Point_<T>> &data,
const cv::Size &sz) {
40 logger::error(
"UndistortMap: Data size does not match frame size", data.size() ==
static_cast<std::size_t
>(sz.area()));
41 cv::Mat_<cv::Point_<double>>::create(sz);
42 cv::Mat_<cv::Point_<double>>::iterator it = cv::Mat_<cv::Point_<double>>::begin();
43 std::for_each(data.begin(), data.end(), [&it](
const cv::Point_<T> &p) { *it++ = cv::Point_<double>(p.x, p.y); });
47 inline bool operator()(cv::Point_<T> &p)
const {
48 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)]);
49 return p.inside(UndistortMap::operator cv::Rect());
52 template <
typename T, std::
size_t N>
54 for(std::size_t i = 0; i < N; i++) {
55 array[i] =
static_cast<cv::Point_<T>
>(cv::Mat_<cv::Point_<double>>::ptr<cv::Point_<double>>(
static_cast<int>(array[i].y))[
static_cast<int>(array[i].x)]);
60 inline void operator()(
Vector_<T> &vector)
const {
61 for(std::size_t i = 0; i < vector.size(); i++) {
62 vector[i] =
static_cast<cv::Point_<T>
>(cv::Mat_<cv::Point_<double>>::ptr<cv::Point_<double>>(
static_cast<int>(vector[i].y))[
static_cast<int>(vector[i].x)]);
66 inline void operator()(
const cv::Mat &src, cv::Mat &dst) {
67 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
70 [[nodiscard]]
inline explicit operator cv::Rect()
const {
71 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
74 [[nodiscard]]
inline explicit operator cv::Size()
const {
75 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
78 [[nodiscard]] cv::Mat visualize(
const VisualizationOptions options = VisualizationOptions::COLOR)
const;
81 void init(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
82 std::array<cv::Mat, 2> cvUndistortionMap_;