VCCC  2024.05
VisualCamp Common C++ library
cv_mat.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_MAT_HPP
6 # define VCCC_TYPE_SUPPORT_OPENCV_CV_MAT_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, typename CVMatX, bool v>
18 struct tuple_element_impl;
19 
20 template<size_t I, typename T, int m, int n>
21 struct tuple_element_impl<I, cv::Matx<T, m, n>, true> {
22  using type = T;
23 };
24 
25 } // namespace internal
26 } // namespace vccc
27 
28 namespace std {
29 
30 //template<typename T, int m, int n> struct internal::cv_size<cv::Matx<T, m, n>>;
31 //template<std::size_t i, std::size_t j, typename T, int m, int n> constexpr T& at(cv::Matx<T, m, n>& matx);
32 //template<std::size_t i, std::size_t j, typename T, int m, int n> constexpr const T& at(const cv::Matx<T, m, n>& matx);
33 //template<std::size_t i, std::size_t j, typename T, int m, int n> constexpr T&& at(cv::Matx<T, m, n>&& matx);
34 //template<std::size_t i, std::size_t j, typename T, int m, int n> constexpr const T&& at(const cv::Matx<T, m, n>&& matx);
35 
45 template<typename T, int m, int n>
46 struct tuple_size<cv::Matx<T, m, n>> : std::integral_constant<size_t, m * n> {};
49 
56 template<size_t I, typename T, int m, int n>
57 struct tuple_element<I, cv::Matx<T, m, n>> :
58  vccc::internal::tuple_element_impl<I, cv::Matx<T, m, n>, (I < m * n)> {};
61 
62 
63 
71 template<std::size_t i, typename T, int m, int n>
72 constexpr inline tuple_element_t<i, cv::Matx<T, m, n>>&
73 get(cv::Matx<T, m, n>& matx) noexcept {
74  return matx(i);
75 }
76 
77 template<std::size_t i, typename T, int m, int n>
78 constexpr inline const tuple_element_t<i, cv::Matx<T, m, n>>&
79 get(const cv::Matx<T, m, n>& matx) noexcept {
80  return matx(i);
81 }
82 
83 template<std::size_t i, typename T, int m, int n>
84 constexpr inline tuple_element_t<i, cv::Matx<T, m, n>>&&
85 get(cv::Matx<T, m, n>&& matx) noexcept {
86  return std::move(matx(i));
87 }
88 
89 template<std::size_t i, typename T, int m, int n>
90 constexpr inline const tuple_element_t<i, cv::Matx<T, m, n>>&&
91 get(const cv::Matx<T, m, n>&& matx) noexcept {
92  return std::move(matx(i));
93 }
94 
98 
99 } // namespace std
100 
101 namespace vccc {
113 template<std::size_t i, std::size_t j, typename T, int m, int n>
114 constexpr inline T&
115 at(cv::Matx<T, m, n>& matx) {
116  static_assert(i < m && j < n, "Index out of bounds in vccc::at<> (cv::Matx)");
117  static_assert(m > 1 && n > 1, "Invalid size (cv::Matx)");
118  return matx(i, j);
119 }
120 
121 template<std::size_t i, std::size_t j, typename T, int m, int n>
122 constexpr inline const T&
123 at(const cv::Matx<T, m, n>& matx) {
124  static_assert(i < m && j < n, "Index out of bounds in vccc::at<> (const cv::Matx)");
125  static_assert(m > 1 && n > 1, "Invalid size (const cv::Matx)");
126  return matx(i, j);
127 }
128 
129 template<std::size_t i, std::size_t j, typename T, int m, int n>
130 constexpr inline T&&
131 at(cv::Matx<T, m, n>&& matx) {
132  static_assert(i < m && j < n, "Index out of bounds in vccc::at<> (cv::Matx&&)");
133  static_assert(m > 1 && n > 1, "Invalid size (cv::Matx&&)");
134  return std::move(matx(i, j));
135 }
136 
137 template<std::size_t i, std::size_t j, typename T, int m, int n>
138 constexpr inline const T&&
139 at(const cv::Matx<T, m, n>&& matx) {
140  static_assert(i < m && j < n, "Index out of bounds in vccc::at<> (const cv::Matx&&)");
141  static_assert(m > 1 && n > 1, "Invalid size (const cv::Matx&&)");
142  return std::move(matx(i, j));
143 }
144 
146 
149 template<typename T, int m, int n, typename N>
150 cv::Matx<T, m, n> add(const cv::Matx<T, m, n>& matx, N n_)
151 {
152  return matx + cv::Matx<T, m, n>::all(n_);
153 }
154 
155 } // namespace vccc
156 
157 # endif // VCCC_TYPE_SUPPORT_OPENCV_CV_MAT_HPP
Definition: matrix.hpp:495
Definition: directory.h:12