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 <algorithm>
11#include <array>
12#include <cstddef>
13#include <opencv2/calib3d.hpp>
14#include <opencv2/core/mat.hpp>
15#include <opencv2/core/mat.inl.hpp>
16#include <opencv2/core/matx.hpp>
17#include <opencv2/core/traits.hpp>
18#include <opencv2/core/types.hpp>
19#include <opencv2/imgproc.hpp>
20#include <stdint.h>
21#include <vector>
22
23namespace ev {
24
25class UndistortMap : public cv::Mat_<cv::Point_<double>> {
26public:
27 enum class VisualizationOptions : uint8_t {
28 COLOR,
29 NET
30 };
31
32 UndistortMap() = default;
33
34 UndistortMap(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
35
36 UndistortMap(const std::vector<double> &intrinsics, const std::vector<double> &dist_coeff, const cv::Size &sz);
37
38 template <typename T>
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); });
44 }
45
46 template <typename T>
47 inline bool operator()(cv::Point_<T> &p) const {
48 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());
49 }
50
51 inline cv::Mat operator()(const cv::Mat &src) {
52 cv::Mat dst;
53 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
54 return dst;
55 }
56
57 inline void operator()(const cv::Mat &src, cv::Mat &dst) {
58 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
59 }
60
61 [[nodiscard]] inline explicit operator cv::Rect() const {
62 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
63 }
64
65 [[nodiscard]] inline explicit operator cv::Size() const {
66 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
67 }
68
69 [[nodiscard]] cv::Mat visualize(const VisualizationOptions options = VisualizationOptions::COLOR) const;
70
71private:
72 void init(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
73 std::array<cv::Mat, 2> cvUndistortionMap_;
74};
75
76} // namespace ev
77
78#endif // OPENEV_CORE_UNDISTORTION_HPP
Logger utility.
void error(const char *message, const bool assert_condition=false)
Log message at error level.
Definition logger.hpp:39