OpenEV
Extending OpenCV to event-based vision
Loading...
Searching...
No Matches
undistortion.hpp
Go to the documentation of this file.
1
6#ifndef OPENEV_EVPROC_UNDISTORTION_HPP
7#define OPENEV_EVPROC_UNDISTORTION_HPP
8
11#include <algorithm>
12#include <array>
13#include <cstddef>
14#include <opencv2/core/mat.hpp>
15#include <opencv2/core/mat.inl.hpp>
16#include <opencv2/core/traits.hpp>
17#include <opencv2/core/types.hpp>
18#include <opencv2/core/utils/logger.hpp>
19#include <opencv2/imgproc.hpp>
20#include <stdint.h>
21#include <type_traits>
22#include <vector>
23
24namespace ev {
25[[maybe_unused]] constexpr bool USING_UNDISTORTION_HPP = true;
26
27class UndistortMap : public cv::Mat_<cv::Point_<double>> {
28public:
29 enum class VisualizationOptions : uint8_t {
30 COLOR,
31 NET
32 };
33
34 UndistortMap() = default;
35
36 UndistortMap(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
37
38 UndistortMap(const std::vector<double> &intrinsics, const std::vector<double> &dist_coeff, const cv::Size &sz);
39
40 template <typename T>
41 UndistortMap(const std::vector<cv::Point_<T>> &data, const cv::Size &sz) {
42 static_assert(std::is_arithmetic_v<T>, "ev::UndistortMap: the point type must be arithmetic.");
43 if(data.size() != static_cast<std::size_t>(sz.area())) {
44 CV_Error(cv::Error::StsBadSize, "ev::UndistortMap: Data size does not match frame size.");
45 }
46 cv::Mat_<cv::Point_<double>>::create(sz);
47 cv::Mat_<cv::Point_<double>>::iterator it = cv::Mat_<cv::Point_<double>>::begin();
48 std::for_each(data.begin(), data.end(), [&it](const cv::Point_<T> &p) { *it++ = cv::Point_<double>(p.x, p.y); });
49 }
50
51 template <typename T>
52 inline bool operator()(cv::Point_<T> &p) const {
53 static_assert(std::is_arithmetic_v<T>, "ev::UndistortMap: the point type must be arithmetic.");
54 if(!cv::Point(static_cast<int>(p.x), static_cast<int>(p.y)).inside(UndistortMap::operator cv::Rect())) {
55 return false;
56 }
57 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)]);
58 return true;
59 }
60
61 template <typename T, std::size_t N>
62 inline void operator()(Array_<T, N> &array) const {
63 for(std::size_t i = 0; i < N; i++) {
64 UndistortMap::operator()(array[i]);
65 }
66 }
67
68 template <typename T>
69 inline void operator()(Vector_<T> &vector) const {
70 for(std::size_t i = 0; i < vector.size(); i++) {
71 UndistortMap::operator()(vector[i]);
72 }
73 }
74
75 inline void operator()(const cv::Mat &src, cv::Mat &dst) {
76 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
77 }
78
79 [[nodiscard]] inline explicit operator cv::Rect() const {
80 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
81 }
82
83 [[nodiscard]] inline explicit operator cv::Size() const {
84 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
85 }
86
87 [[nodiscard]] cv::Mat visualize(const VisualizationOptions options = VisualizationOptions::COLOR) const;
88
89private:
90 void init(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
91 std::array<cv::Mat, 2> cvUndistortionMap_;
92};
93
94} // namespace ev
95
96#endif // OPENEV_EVPROC_UNDISTORTION_HPP
Array container for basic event structures.
This class extends std::array to implement event arrays. For more information, please refer here.
Definition array.hpp:24
This class extends std::vector to implement event vectors. For more information, please refer here.
Definition vector.hpp:23
Vector container for basic event structures.