24 enum class VisualizationOptions : uint8_t {
31 UndistortMap(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
33 UndistortMap(
const std::vector<double> &intrinsics,
const std::vector<double> &dist_coeff,
const cv::Size &sz);
36 UndistortMap(
const std::vector<cv::Point_<T>> &data,
const cv::Size &sz) {
37 logger::error(
"UndistortMap: Data size does not match frame size", data.size() ==
static_cast<std::size_t
>(sz.area()));
38 cv::Mat_<cv::Point_<double>>::create(sz);
39 cv::Mat_<cv::Point_<double>>::iterator it = cv::Mat_<cv::Point_<double>>::begin();
40 std::for_each(data.begin(), data.end(), [&it](
const cv::Point_<T> &p) { *it++ = cv::Point_<double>(p.x, p.y); });
44 inline bool operator()(cv::Point_<T> &p)
const {
45 return (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)])).inside(UndistortMap::operator cv::Rect());
48 inline cv::Mat operator()(
const cv::Mat &src) {
50 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
54 inline void operator()(
const cv::Mat &src, cv::Mat &dst) {
55 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
58 [[nodiscard]]
inline explicit operator cv::Rect()
const {
59 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
62 [[nodiscard]]
inline explicit operator cv::Size()
const {
63 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
66 [[nodiscard]] cv::Mat visualize(
const VisualizationOptions options = VisualizationOptions::COLOR)
const;
69 void init(
const cv::Mat &cam_matrix,
const cv::Mat &dist_coeff,
const cv::Size &sz);
70 std::array<cv::Mat, 2> cvUndistortionMap_;