github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/opencv4/include/opencv2/gapi/gtransform.hpp (about) 1 // This file is part of OpenCV project. 2 // It is subject to the license terms in the LICENSE file found in the top-level directory 3 // of this distribution and at http://opencv.org/license.html. 4 // 5 // Copyright (C) 2019 Intel Corporation 6 7 #ifndef OPENCV_GAPI_GTRANSFORM_HPP 8 #define OPENCV_GAPI_GTRANSFORM_HPP 9 10 #include <functional> 11 #include <type_traits> 12 #include <utility> 13 14 #include <opencv2/gapi/gcommon.hpp> 15 #include <opencv2/gapi/util/util.hpp> 16 #include <opencv2/gapi/garg.hpp> 17 #include <opencv2/gapi/gtype_traits.hpp> 18 #include <opencv2/gapi/util/compiler_hints.hpp> 19 #include <opencv2/gapi/gcomputation.hpp> 20 21 namespace cv 22 { 23 24 struct GAPI_EXPORTS GTransform 25 { 26 // FIXME: consider another simplified 27 // class instead of GComputation 28 using F = std::function<GComputation()>; 29 30 std::string description; 31 F pattern; 32 F substitute; 33 34 GTransform(const std::string& d, const F &p, const F &s) : description(d), pattern(p), substitute(s){}; 35 }; 36 37 namespace detail 38 { 39 40 template <typename, typename, typename> 41 struct TransHelper; 42 43 template <typename K, typename... Ins, typename Out> 44 struct TransHelper<K, std::tuple<Ins...>, Out> 45 { 46 template <typename Callable, int... IIs, int... OIs> 47 static GComputation invoke(Callable f, Seq<IIs...>, Seq<OIs...>) 48 { 49 const std::tuple<Ins...> ins; 50 const auto r = tuple_wrap_helper<Out>::get(f(std::get<IIs>(ins)...)); 51 return GComputation(cv::GIn(std::get<IIs>(ins)...), 52 cv::GOut(std::get<OIs>(r)...)); 53 } 54 55 static GComputation get_pattern() 56 { 57 return invoke(K::pattern, typename MkSeq<sizeof...(Ins)>::type(), 58 typename MkSeq<std::tuple_size<typename tuple_wrap_helper<Out>::type>::value>::type()); 59 } 60 static GComputation get_substitute() 61 { 62 return invoke(K::substitute, typename MkSeq<sizeof...(Ins)>::type(), 63 typename MkSeq<std::tuple_size<typename tuple_wrap_helper<Out>::type>::value>::type()); 64 } 65 }; 66 } // namespace detail 67 68 template <typename, typename> 69 class GTransformImpl; 70 71 template <typename K, typename R, typename... Args> 72 class GTransformImpl<K, std::function<R(Args...)>> : public cv::detail::TransHelper<K, std::tuple<Args...>, R>, 73 public cv::detail::TransformTag 74 { 75 public: 76 // FIXME: currently there is no check that transformations' signatures are unique 77 // and won't be any intersection in graph compilation stage 78 using API = K; 79 80 static GTransform transformation() 81 { 82 return GTransform(K::descr(), &K::get_pattern, &K::get_substitute); 83 } 84 }; 85 } // namespace cv 86 87 #define G_DESCR_HELPER_CLASS(Class) Class##DescrHelper 88 89 #define G_DESCR_HELPER_BODY(Class, Descr) \ 90 namespace detail \ 91 { \ 92 struct G_DESCR_HELPER_CLASS(Class) \ 93 { \ 94 static constexpr const char *descr() { return Descr; }; \ 95 }; \ 96 } 97 98 #define GAPI_TRANSFORM(Class, API, Descr) \ 99 G_DESCR_HELPER_BODY(Class, Descr) \ 100 struct Class final : public cv::GTransformImpl<Class, std::function API>, \ 101 public detail::G_DESCR_HELPER_CLASS(Class) 102 103 #endif // OPENCV_GAPI_GTRANSFORM_HPP