Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/gapi/src/api/gproto.cpp
16339 views
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) 2018 Intel Corporation
6
7
8
#include "precomp.hpp"
9
10
#include <ade/util/algorithm.hpp>
11
#include "opencv2/gapi/util/throw.hpp"
12
#include "opencv2/gapi/garg.hpp"
13
#include "opencv2/gapi/gproto.hpp"
14
15
#include "api/gapi_priv.hpp"
16
#include "api/gproto_priv.hpp"
17
18
// FIXME: it should be a visitor!
19
// FIXME: Reimplement with traits?
20
21
const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GProtoArg &arg)
22
{
23
switch (arg.index())
24
{
25
case cv::GProtoArg::index_of<cv::GMat>():
26
return util::get<cv::GMat>(arg).priv();
27
28
case cv::GProtoArg::index_of<cv::GScalar>():
29
return util::get<cv::GScalar>(arg).priv();
30
31
case cv::GProtoArg::index_of<cv::detail::GArrayU>():
32
return util::get<cv::detail::GArrayU>(arg).priv();
33
34
default:
35
util::throw_error(std::logic_error("Unsupported GProtoArg type"));
36
}
37
}
38
39
const cv::GOrigin& cv::gimpl::proto::origin_of(const cv::GArg &arg)
40
{
41
// Generic, but not very efficient implementation
42
// FIXME: Walking a thin line here!!! Here we rely that GArg and
43
// GProtoArg share the same object and this is true while objects
44
// are reference-counted, so return value is not a reference to a tmp.
45
return origin_of(rewrap(arg));
46
}
47
48
bool cv::gimpl::proto::is_dynamic(const cv::GArg& arg)
49
{
50
// FIXME: refactor this method to be auto-generated from
51
// - GProtoArg variant parameter pack, and
52
// - traits over every type
53
switch (arg.kind)
54
{
55
case detail::ArgKind::GMAT:
56
case detail::ArgKind::GSCALAR:
57
case detail::ArgKind::GARRAY:
58
return true;
59
60
default:
61
return false;
62
}
63
}
64
65
cv::GRunArg cv::value_of(const cv::GOrigin &origin)
66
{
67
switch (origin.shape)
68
{
69
case GShape::GSCALAR: return GRunArg(util::get<cv::gapi::own::Scalar>(origin.value));
70
default: util::throw_error(std::logic_error("Unsupported shape for constant"));
71
}
72
}
73
74
cv::GProtoArg cv::gimpl::proto::rewrap(const cv::GArg &arg)
75
{
76
// FIXME: replace with a more generic any->variant
77
// (or variant<T> -> variant<U>) conversion?
78
switch (arg.kind)
79
{
80
case detail::ArgKind::GMAT: return GProtoArg(arg.get<cv::GMat>());
81
case detail::ArgKind::GSCALAR: return GProtoArg(arg.get<cv::GScalar>());
82
case detail::ArgKind::GARRAY: return GProtoArg(arg.get<cv::detail::GArrayU>());
83
default: util::throw_error(std::logic_error("Unsupported GArg type"));
84
}
85
}
86
87
cv::GMetaArg cv::descr_of(const cv::GRunArg &arg)
88
{
89
switch (arg.index())
90
{
91
#if !defined(GAPI_STANDALONE)
92
case GRunArg::index_of<cv::Mat>():
93
return cv::GMetaArg(descr_of(util::get<cv::Mat>(arg)));
94
95
case GRunArg::index_of<cv::Scalar>():
96
return cv::GMetaArg(descr_of(util::get<cv::Scalar>(arg)));
97
#endif // !defined(GAPI_STANDALONE)
98
99
case GRunArg::index_of<cv::gapi::own::Mat>():
100
return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Mat>(arg)));
101
102
case GRunArg::index_of<cv::gapi::own::Scalar>():
103
return cv::GMetaArg(descr_of(util::get<cv::gapi::own::Scalar>(arg)));
104
105
case GRunArg::index_of<cv::detail::VectorRef>():
106
return cv::GMetaArg(util::get<cv::detail::VectorRef>(arg).descr_of());
107
108
default: util::throw_error(std::logic_error("Unsupported GRunArg type"));
109
}
110
}
111
112
cv::GMetaArgs cv::descr_of(const cv::GRunArgs &args)
113
{
114
cv::GMetaArgs metas;
115
ade::util::transform(args, std::back_inserter(metas), [](const cv::GRunArg &arg){ return descr_of(arg); });
116
return metas;
117
}
118
119
cv::GMetaArg cv::descr_of(const cv::GRunArgP &argp)
120
{
121
switch (argp.index())
122
{
123
#if !defined(GAPI_STANDALONE)
124
case GRunArgP::index_of<cv::Mat*>(): return GMetaArg(descr_of(*util::get<cv::Mat*>(argp)));
125
case GRunArgP::index_of<cv::Scalar*>(): return GMetaArg(descr_of(*util::get<cv::Scalar*>(argp)));
126
#endif // !defined(GAPI_STANDALONE)
127
case GRunArgP::index_of<cv::gapi::own::Mat*>(): return GMetaArg(descr_of(*util::get<cv::gapi::own::Mat*>(argp)));
128
case GRunArgP::index_of<cv::gapi::own::Scalar*>(): return GMetaArg(descr_of(*util::get<cv::gapi::own::Scalar*>(argp)));
129
case GRunArgP::index_of<cv::detail::VectorRef>(): return GMetaArg(util::get<cv::detail::VectorRef>(argp).descr_of());
130
default: util::throw_error(std::logic_error("Unsupported GRunArgP type"));
131
}
132
}
133
134
namespace cv {
135
std::ostream& operator<<(std::ostream& os, const cv::GMetaArg &arg)
136
{
137
// FIXME: Implement via variant visitor
138
switch (arg.index())
139
{
140
case cv::GMetaArg::index_of<util::monostate>():
141
os << "(unresolved)";
142
break;
143
144
case cv::GMetaArg::index_of<cv::GMatDesc>():
145
os << util::get<cv::GMatDesc>(arg);
146
break;
147
148
case cv::GMetaArg::index_of<cv::GScalarDesc>():
149
os << util::get<cv::GScalarDesc>(arg);
150
break;
151
152
case cv::GMetaArg::index_of<cv::GArrayDesc>():
153
os << util::get<cv::GArrayDesc>(arg);
154
break;
155
default:
156
GAPI_Assert(false);
157
}
158
159
return os;
160
}
161
}
162
163