OpenEV
Extending OpenCV to event-based vision
Loading...
Searching...
No Matches
undistortion.hpp
Go to the documentation of this file.
1
6#ifndef OPENEV_CORE_UNDISTORTION_HPP
7#define OPENEV_CORE_UNDISTORTION_HPP
8
10#include <cstddef>
11#include <opencv2/calib3d.hpp>
12#include <opencv2/core/mat.hpp>
13#include <opencv2/core/mat.inl.hpp>
14#include <opencv2/core/matx.hpp>
15#include <opencv2/core/types.hpp>
16#include <opencv2/imgproc.hpp>
17#include <stdint.h>
18#include <vector>
19
20namespace ev {
21
22class UndistortMap : public cv::Mat_<cv::Point_<double>> {
23public:
24 enum class VisualizationOptions : uint8_t {
25 COLOR,
26 NET
27 };
28
29 UndistortMap() = default;
30
31 UndistortMap(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
32
33 UndistortMap(const std::vector<double> &intrinsics, const std::vector<double> &dist_coeff, const cv::Size &sz);
34
35 template <typename T>
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); });
41 }
42
43 template <typename T>
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());
46 }
47
48 inline cv::Mat operator()(const cv::Mat &src) {
49 cv::Mat dst;
50 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
51 return dst;
52 }
53
54 inline void operator()(const cv::Mat &src, cv::Mat &dst) {
55 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
56 }
57
58 [[nodiscard]] inline explicit operator cv::Rect() const {
59 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
60 }
61
62 [[nodiscard]] inline explicit operator cv::Size() const {
63 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
64 }
65
66 [[nodiscard]] cv::Mat visualize(const VisualizationOptions options = VisualizationOptions::COLOR) const;
67
68private:
69 void init(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
70 std::array<cv::Mat, 2> cvUndistortionMap_;
71};
72
73} // namespace ev
74
75#endif // OPENEV_CORE_UNDISTORTION_HPP
Definition undistortion.hpp:22
Logger utility.