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
26class UndistortMap : public cv::Mat_<cv::Point_<double>> {
27public:
28 enum class VisualizationOptions : uint8_t {
29 COLOR,
30 NET
31 };
32
33 UndistortMap() = default;
34
35 UndistortMap(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
36
37 UndistortMap(const std::vector<double> &intrinsics, const std::vector<double> &dist_coeff, const cv::Size &sz);
38
39 template <typename T>
40 UndistortMap(const std::vector<cv::Point_<T>> &data, const cv::Size &sz) {
41 static_assert(std::is_arithmetic_v<T>, "ev::UndistortMap: the point type must be arithmetic.");
42 if(data.size() != static_cast<std::size_t>(sz.area())) {
43 CV_Error(cv::Error::StsBadSize, "ev::UndistortMap: Data size does not match frame size.");
44 }
45 cv::Mat_<cv::Point_<double>>::create(sz);
46 cv::Mat_<cv::Point_<double>>::iterator it = cv::Mat_<cv::Point_<double>>::begin();
47 std::for_each(data.begin(), data.end(), [&it](const cv::Point_<T> &p) { *it++ = cv::Point_<double>(p.x, p.y); });
48 }
49
50 template <typename T>
51 inline bool operator()(cv::Point_<T> &p) const {
52 static_assert(std::is_arithmetic_v<T>, "ev::UndistortMap: the point type must be arithmetic.");
53 if(!cv::Point(static_cast<int>(p.x), static_cast<int>(p.y)).inside(UndistortMap::operator cv::Rect())) {
54 return false;
55 }
56 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)]);
57 return true;
58 }
59
60 template <typename T, std::size_t N>
61 inline void operator()(Array_<T, N> &array) const {
62 for(std::size_t i = 0; i < N; i++) {
63 UndistortMap::operator()(array[i]);
64 }
65 }
66
67 template <typename T>
68 inline void operator()(Vector_<T> &vector) const {
69 for(std::size_t i = 0; i < vector.size(); i++) {
70 UndistortMap::operator()(vector[i]);
71 }
72 }
73
74 inline void operator()(const cv::Mat &src, cv::Mat &dst) {
75 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
76 }
77
78 [[nodiscard]] inline explicit operator cv::Rect() const {
79 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
80 }
81
82 [[nodiscard]] inline explicit operator cv::Size() const {
83 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
84 }
85
86 [[nodiscard]] cv::Mat visualize(const VisualizationOptions options = VisualizationOptions::COLOR) const;
87
88private:
89 void init(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
90 std::array<cv::Mat, 2> cvUndistortionMap_;
91};
92
93} // namespace ev
94
95#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.