OpenEV
Extending OpenCV to event-based vision
 
Loading...
Searching...
No Matches
array.hpp
1
6#ifndef OPENEV_CONTAINERS_ARRAY_HPP
7#define OPENEV_CONTAINERS_ARRAY_HPP
8
10#include <array>
11#include <cstddef>
12#include <numeric>
13#include <opencv2/core/types.hpp>
14
15namespace ev {
21template <typename T, std::size_t N>
22class Array_ : public std::array<Event_<T>, N> {
23 using std::array<Event_<T>, N>::array;
24
25public:
30 [[nodiscard]] inline double duration() const;
31
36 [[nodiscard]] inline double rate() const;
37
42 [[nodiscard]] Eventd mean() const;
43
48 [[nodiscard]] inline cv::Point2d meanPoint() const;
49
54 [[nodiscard]] inline double meanTime() const;
55
60 [[nodiscard]] inline double midTime() const;
61};
62template <std::size_t N>
63using Arrayi = Array_<int, N>;
64template <std::size_t N>
65using Arrayl = Array_<long, N>;
66template <std::size_t N>
67using Arrayf = Array_<float, N>;
68template <std::size_t N>
69using Arrayd = Array_<double, N>;
70template <std::size_t N>
71using Array = Arrayi<N>;
72} // namespace ev
73
74template <typename T, std::size_t N>
75[[nodiscard]] inline double ev::Array_<T, N>::duration() const {
76 return std::array<ev::Event_<T>, N>::back().t - std::array<ev::Event_<T>, N>::front().t;
77}
78
79template <typename T, std::size_t N>
80[[nodiscard]] inline double ev::Array_<T, N>::rate() const {
81 return std::array<ev::Event_<T>, N>::size() / duration();
82}
83
84template <typename T, std::size_t N>
85[[nodiscard]] ev::Eventd ev::Array_<T, N>::mean() const {
86 const double x = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.x; }) / N;
87 const double y = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.y; }) / N;
88 const double t = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.t; }) / N;
89 const double p = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.p; }) / N;
90 return {x, y, t, p > 0.5};
91}
92
93template <typename T, std::size_t N>
94[[nodiscard]] inline cv::Point2d ev::Array_<T, N>::meanPoint() const {
95 const double x = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.x; }) / N;
96 const double y = std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.y; }) / N;
97 return {x, y};
98}
99
100template <typename T, std::size_t N>
101[[nodiscard]] inline double ev::Array_<T, N>::meanTime() const {
102 return std::accumulate(std::array<ev::Event_<T>, N>::begin(), std::array<ev::Event_<T>, N>::end(), 0.0, [](double sum, const Event_<T> &e) { return sum + e.t; }) / N;
103}
104
105template <typename T, std::size_t N>
106[[nodiscard]] inline double ev::Array_<T, N>::midTime() const {
107 return 0.5 * (std::array<ev::Event_<T>, N>::front().t + std::array<ev::Event_<T>, N>::back().t);
108}
109
110#endif // OPENEV_CONTAINERS_ARRAY_HPP
This class extends std::array to implement event arrays. For more information, please refer here.
Definition array.hpp:22
double duration() const
cv::Point2d meanPoint() const
double midTime() const
double meanTime() const
Eventd mean() const
double rate() const
This class extends cv::Point_<T> for event data. For more information, please refer here.
Definition types.hpp:55
bool p
Definition types.hpp:58
double t
Definition types.hpp:57
Basic event-based vision structures based on OpenCV components.
Event_< double > Eventd
Definition types.hpp:207