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
9#include "openev/containers/array.hpp"
10#include "openev/containers/vector.hpp"
12#include <algorithm>
13#include <array>
14#include <cstddef>
15#include <opencv2/core/mat.hpp>
16#include <opencv2/core/mat.inl.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 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)]);
49 return p.inside(UndistortMap::operator cv::Rect());
50 }
51
52 template <typename T, std::size_t N>
53 inline void operator()(Array_<T, N> &array) const {
54 for(std::size_t i = 0; i < N; i++) {
55 array[i] = static_cast<cv::Point_<T>>(cv::Mat_<cv::Point_<double>>::ptr<cv::Point_<double>>(static_cast<int>(array[i].y))[static_cast<int>(array[i].x)]);
56 }
57 }
58
59 template <typename T>
60 inline void operator()(Vector_<T> &vector) const {
61 for(std::size_t i = 0; i < vector.size(); i++) {
62 vector[i] = static_cast<cv::Point_<T>>(cv::Mat_<cv::Point_<double>>::ptr<cv::Point_<double>>(static_cast<int>(vector[i].y))[static_cast<int>(vector[i].x)]);
63 }
64 }
65
66 inline void operator()(const cv::Mat &src, cv::Mat &dst) {
67 cv::remap(src, dst, cvUndistortionMap_[0], cvUndistortionMap_[1], cv::INTER_LINEAR);
68 }
69
70 [[nodiscard]] inline explicit operator cv::Rect() const {
71 return {0, 0, cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
72 }
73
74 [[nodiscard]] inline explicit operator cv::Size() const {
75 return {cv::Mat_<cv::Point_<double>>::cols, cv::Mat_<cv::Point_<double>>::rows};
76 }
77
78 [[nodiscard]] cv::Mat visualize(const VisualizationOptions options = VisualizationOptions::COLOR) const;
79
80private:
81 void init(const cv::Mat &cam_matrix, const cv::Mat &dist_coeff, const cv::Size &sz);
82 std::array<cv::Mat, 2> cvUndistortionMap_;
83};
84
85} // namespace ev
86
87#endif // OPENEV_EVPROC_UNDISTORTION_HPP
This class extends std::array to implement event arrays. For more information, please refer here.
Definition array.hpp:22
This class extends std::vector to implement event vectors. For more information, please refer here.
Definition vector.hpp:20
Logger utility.
void error(const char *message, const bool assert_condition=false)
Log message at error level.
Definition logger.hpp:38