VCCC  2024.05
VisualCamp Common C++ library
cv_point.hpp
Go to the documentation of this file.
1 # /*
2 # * Created by YongGyu Lee on 2020/12/08.
3 # */
4 #
5 # ifndef VCCC_TYPE_SUPPORT_OPENCV_CV_POINT_HPP
6 # define VCCC_TYPE_SUPPORT_OPENCV_CV_POINT_HPP
7 #
8 # include <tuple>
9 # include <type_traits>
10 # include <utility>
11 #
12 # include "opencv2/opencv.hpp"
13 
14 namespace vccc {
15 namespace internal {
16 
17 template<size_t I>
18 struct get_cv_point;
19 
20 template<>
21 struct get_cv_point<0> {
22  template<typename T> static constexpr T& get( cv::Point_<T>& p) noexcept { return p.x; }
23  template<typename T> static constexpr const T& get(const cv::Point_<T>& p) noexcept { return p.x; }
24  template<typename T> static constexpr T&& get( cv::Point_<T>&& p) noexcept { return std::move(p.x); }
25  template<typename T> static constexpr const T&& get(const cv::Point_<T>&& p) noexcept { return std::move(p.x); }
26 
27  template<typename T> static constexpr T& get( cv::Point3_<T>& p) noexcept { return p.x; }
28  template<typename T> static constexpr const T& get(const cv::Point3_<T>& p) noexcept { return p.x; }
29  template<typename T> static constexpr T&& get( cv::Point3_<T>&& p) noexcept { return std::move(p.x); }
30  template<typename T> static constexpr const T&& get(const cv::Point3_<T>&& p) noexcept { return std::move(p.x); }
31 };
32 
33 template<>
34 struct get_cv_point<1> {
35  template<typename T> static constexpr T& get( cv::Point_<T>& p) noexcept { return p.y; }
36  template<typename T> static constexpr const T& get(const cv::Point_<T>& p) noexcept { return p.y; }
37  template<typename T> static constexpr T&& get( cv::Point_<T>&& p) noexcept { return std::move(p.y); }
38  template<typename T> static constexpr const T&& get(const cv::Point_<T>&& p) noexcept { return std::move(p.y); }
39 
40  template<typename T> static constexpr T& get( cv::Point3_<T>& p) noexcept { return p.y; }
41  template<typename T> static constexpr const T& get(const cv::Point3_<T>& p) noexcept { return p.y; }
42  template<typename T> static constexpr T&& get( cv::Point3_<T>&& p) noexcept { return std::move(p.y); }
43  template<typename T> static constexpr const T&& get(const cv::Point3_<T>&& p) noexcept { return std::move(p.y); }
44 };
45 
46 template<>
47 struct get_cv_point<2> {
48  template<typename T> static constexpr T& get( cv::Point3_<T>& p) noexcept { return p.z; }
49  template<typename T> static constexpr const T& get(const cv::Point3_<T>& p) noexcept { return p.z; }
50  template<typename T> static constexpr T&& get( cv::Point3_<T>&& p) noexcept { return std::move(p.z); }
51  template<typename T> static constexpr const T&& get(const cv::Point3_<T>&& p) noexcept { return std::move(p.z); }
52 };
53 
54 } // namespace internal
55 } // namespace vccc
56 
57 namespace std {
58 
66 template<typename T>
67 struct tuple_size<cv::Point_<T>> : std::integral_constant<size_t, 2> {};
68 
69 
70 template<typename T>
71 struct tuple_size<cv::Point3_<T>> : std::integral_constant<size_t, 3> {};
72 
74 
75 
83 template<typename T> struct tuple_element<0, cv::Point_<T>> { using type = T; };
84 template<typename T> struct tuple_element<1, cv::Point_<T>> { using type = T; };
86 
87 
92 template<typename T> struct tuple_element<0, cv::Point3_<T>> { using type = T; };
93 template<typename T> struct tuple_element<1, cv::Point3_<T>> { using type = T; };
94 template<typename T> struct tuple_element<2, cv::Point3_<T>> { using type = T; };
97 
98 
99 
100 
108 template<std::size_t i, typename T>
109 constexpr inline tuple_element_t<i, cv::Point_<T>>&
110 get(cv::Point_<T>& p) noexcept {
112 }
113 
114 template<std::size_t i, typename T>
115 constexpr inline const tuple_element_t<i, cv::Point_<T>>&
116 get(const cv::Point_<T>& p) noexcept {
118 }
119 
120 template<std::size_t i, typename T>
121 constexpr inline tuple_element_t<i, cv::Point_<T>>&&
122 get(cv::Point_<T>&& p) noexcept {
123  return std::move(vccc::internal::get_cv_point<i>::get(std::move(p)));
124 }
125 
126 template<std::size_t i, typename T>
127 constexpr inline const tuple_element_t<i, cv::Point_<T>>&&
128 get(const cv::Point_<T>&& p) noexcept {
129  return std::move(vccc::internal::get_cv_point<i>::get(std::move(p)));
130 }
132 
133 
138 template<std::size_t i, typename T>
139 constexpr inline tuple_element_t<i, cv::Point3_<T>>&
140 get(cv::Point3_<T>& p) noexcept {
142 }
143 
144 template<std::size_t i, typename T>
145 constexpr inline const tuple_element_t<i, cv::Point3_<T>>&
146 get(const cv::Point3_<T>& p) noexcept {
148 }
149 
150 template<std::size_t i, typename T>
151 constexpr inline tuple_element_t<i, cv::Point3_<T>>&&
152 get(cv::Point3_<T>&& p) noexcept {
153  return std::move(vccc::internal::get_cv_point<i>::get(std::move(p)));
154 }
155 
156 template<std::size_t i, typename T>
157 constexpr inline const tuple_element_t<i, cv::Point3_<T>>&&
158 get(const cv::Point3_<T>&& p) noexcept {
159  return std::move(vccc::internal::get_cv_point<i>::get(std::move(p)));
160 }
164 
165 } // namespace std
166 
167 namespace vccc {
168 
171 template<typename T, typename N>
172 cv::Point_<T> add(const cv::Point_<T>& point2, N n) {
173  return cv::Point_<T>(point2.x + n, point2.y + n);
174 }
175 
176 template<typename T, typename N>
177 inline cv::Point3_<T> add(const cv::Point3_<T>& point3, N n) {
178  return cv::Point3_<T>(point3.x + n, point3.y + n, point3.z + n);
179 }
180 
183 template<int new_size, typename T, std::enable_if_t<new_size == 2, int> = 0>
184 auto resize(const cv::Point_<T>& from) {
185  return from;
186 }
187 
188 template<int new_size, typename T, std::enable_if_t<new_size==3, int> = 0>
189 auto resize(const cv::Point_<T>& from) {
190  return cv::Point3_<T>(from.x, from.y, 0);
191 }
192 
193 template<int new_size, typename T, std::enable_if_t<new_size == 2, int> = 0>
194 inline auto resize(const cv::Point3_<T>& from){
195  return cv::Point_<T>(from.x, from.y);
196 }
197 
198 template<int new_size, typename T, std::enable_if_t<new_size == 3, int> = 0>
199 inline auto resize(const cv::Point3_<T>& from){
200  return from;
201 }
202 
203 } // namespace vccc
204 
205 # endif // VCCC_TYPE_SUPPORT_OPENCV_CV_POINT_HPP
constexpr const tuple_element_t< i, cv::Point3_< T > > && get(const cv::Point3_< T > &&p) noexcept
Definition: cv_point.hpp:158
constexpr variant_alternative_t< I, variant< Types... > > & get(variant< Types... > &v)
Definition: variant.hpp:770
Definition: matrix.hpp:495
constexpr std::enable_if_t<(I< m *n), typename vccc::Matrix< T, m, n >::value_type & > get(vccc::Matrix< T, m, n > &matrix)
Definition: matrix.hpp:499
Definition: directory.h:12
auto resize(const cv::Point_< T > &from)
Definition: cv_point.hpp:184
cv::Matx< T, m, n > add(const cv::Matx< T, m, n > &matx, N n_)
Definition: cv_mat.hpp:150
T type
Definition: cv_point.hpp:92
T type
Definition: cv_point.hpp:83
T type
Definition: cv_point.hpp:93
T type
Definition: cv_point.hpp:84
T type
Definition: cv_point.hpp:94