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.
5 // Copyright (C) 2018-2019 Intel Corporation
8 #include "test_precomp.hpp"
10 #include "opencv2/gapi/cpu/gcpukernel.hpp"
17 G_TYPED_KERNEL(KTest, <cv::GScalar(cv::GScalar)>, "org.opencv.test.scalar_kernel") {
18 static cv::GScalarDesc outMeta(cv::GScalarDesc in) { return in; }
20 GAPI_OCV_KERNEL(GOCVScalarTest, KTest)
22 static void run(const cv::Scalar &in, cv::Scalar &out) { out = in+cv::Scalar(1); }
26 TEST(GAPI_MetaDesc, MatDesc)
28 cv::Mat m1(240, 320, CV_8U);
29 const auto desc1 = cv::descr_of(m1);
30 EXPECT_EQ(CV_8U, desc1.depth);
31 EXPECT_EQ(1, desc1.chan);
32 EXPECT_EQ(320, desc1.size.width);
33 EXPECT_EQ(240, desc1.size.height);
35 cv::Mat m2(480, 640, CV_8UC3);
36 const auto desc2 = cv::descr_of(m2);
37 EXPECT_EQ(CV_8U, desc2.depth);
38 EXPECT_EQ(3, desc2.chan);
39 EXPECT_EQ(640, desc2.size.width);
40 EXPECT_EQ(480, desc2.size.height);
43 TEST(GAPI_MetaDesc, VecMatDesc)
45 std::vector<cv::Mat> vec1 = {
46 cv::Mat(240, 320, CV_8U)};
48 const auto desc1 = cv::descr_of(vec1);
49 EXPECT_EQ((GMatDesc{CV_8U, 1, {320, 240}}), get<GMatDesc>(desc1[0]));
51 std::vector<cv::UMat> vec2 = {
52 cv::UMat(480, 640, CV_8UC3)};
54 const auto desc2 = cv::descr_of(vec2);
55 EXPECT_EQ((GMatDesc{CV_8U, 3, {640, 480}}), get<GMatDesc>(desc2[0]));
58 TEST(GAPI_MetaDesc, VecOwnMatDesc)
60 std::vector<cv::gapi::own::Mat> vec = {
61 cv::gapi::own::Mat(240, 320, CV_8U, nullptr),
62 cv::gapi::own::Mat(480, 640, CV_8UC3, nullptr)};
64 const auto desc = cv::gapi::own::descr_of(vec);
65 EXPECT_EQ((GMatDesc{CV_8U, 1, {320, 240}}), get<GMatDesc>(desc[0]));
66 EXPECT_EQ((GMatDesc{CV_8U, 3, {640, 480}}), get<GMatDesc>(desc[1]));
69 TEST(GAPI_MetaDesc, AdlVecOwnMatDesc)
71 std::vector<cv::gapi::own::Mat> vec = {
72 cv::gapi::own::Mat(240, 320, CV_8U, nullptr),
73 cv::gapi::own::Mat(480, 640, CV_8UC3, nullptr)};
75 const auto desc = descr_of(vec);
76 EXPECT_EQ((GMatDesc{CV_8U, 1, {320, 240}}), get<GMatDesc>(desc[0]));
77 EXPECT_EQ((GMatDesc{CV_8U, 3, {640, 480}}), get<GMatDesc>(desc[1]));
80 TEST(GAPI_MetaDesc, Compare_Equal_MatDesc)
82 const auto desc1 = cv::GMatDesc{CV_8U, 1, {64, 64}};
83 const auto desc2 = cv::GMatDesc{CV_8U, 1, {64, 64}};
85 EXPECT_TRUE(desc1 == desc2);
88 TEST(GAPI_MetaDesc, Compare_Not_Equal_MatDesc)
90 const auto desc1 = cv::GMatDesc{CV_8U, 1, {64, 64}};
91 const auto desc2 = cv::GMatDesc{CV_32F, 1, {64, 64}};
93 EXPECT_TRUE(desc1 != desc2);
96 TEST(GAPI_MetaDesc, Compile_MatchMetaNumber_1)
99 cv::GComputation cc(in, in+in);
101 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
102 const auto desc2 = cv::GMatDesc{CV_32F,1,{128,128}};
104 EXPECT_NO_THROW(cc.compile(desc1));
105 EXPECT_NO_THROW(cc.compile(desc2));
107 // FIXME: custom exception type?
108 // It is worth checking if compilation fails with different number
109 // of meta parameters
110 EXPECT_THROW(cc.compile(desc1, desc1), std::logic_error);
111 EXPECT_THROW(cc.compile(desc1, desc2, desc2), std::logic_error);
114 TEST(GAPI_MetaDesc, Compile_MatchMetaNumber_2)
117 cv::GComputation cc(cv::GIn(a, b), cv::GOut(a+b));
119 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
120 EXPECT_NO_THROW(cc.compile(desc1, desc1));
122 const auto desc2 = cv::GMatDesc{CV_32F,1,{128,128}};
123 EXPECT_NO_THROW(cc.compile(desc2, desc2));
125 // FIXME: custom exception type?
126 EXPECT_THROW(cc.compile(desc1), std::logic_error);
127 EXPECT_THROW(cc.compile(desc2), std::logic_error);
128 EXPECT_THROW(cc.compile(desc2, desc2, desc2), std::logic_error);
131 TEST(GAPI_MetaDesc, Compile_MatchMetaType_Mat)
134 cv::GComputation cc(in, in+in);
136 EXPECT_NO_THROW(cc.compile(cv::GMatDesc{CV_8U,1,{64,64}}));
138 // FIXME: custom exception type?
139 EXPECT_THROW(cc.compile(cv::empty_scalar_desc()), std::logic_error);
142 TEST(GAPI_MetaDesc, Compile_MatchMetaType_Scalar)
145 cv::GComputation cc(cv::GIn(in), cv::GOut(KTest::on(in)));
147 const auto desc1 = cv::descr_of(cv::Scalar(128));
148 const auto desc2 = cv::GMatDesc{CV_8U,1,{64,64}};
149 const auto pkg = cv::gapi::kernels<GOCVScalarTest>();
150 EXPECT_NO_THROW(cc.compile(desc1, cv::compile_args(pkg)));
152 // FIXME: custom exception type?
153 EXPECT_THROW(cc.compile(desc2, cv::compile_args(pkg)), std::logic_error);
156 TEST(GAPI_MetaDesc, Compile_MatchMetaType_Mixed)
160 cv::GComputation cc(cv::GIn(a, v), cv::GOut(cv::gapi::addC(a, v)));
162 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
163 const auto desc2 = cv::descr_of(cv::Scalar(4));
165 EXPECT_NO_THROW(cc.compile(desc1, desc2));
167 // FIXME: custom exception type(s)?
168 EXPECT_THROW(cc.compile(desc1), std::logic_error);
169 EXPECT_THROW(cc.compile(desc2), std::logic_error);
170 EXPECT_THROW(cc.compile(desc2, desc1), std::logic_error);
171 EXPECT_THROW(cc.compile(desc1, desc1, desc1), std::logic_error);
172 EXPECT_THROW(cc.compile(desc1, desc2, desc1), std::logic_error);
175 TEST(GAPI_MetaDesc, Typed_Compile_MatchMetaNumber_1)
177 cv::GComputationT<cv::GMat(cv::GMat)> cc([](cv::GMat in)
182 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
183 const auto desc2 = cv::GMatDesc{CV_32F,1,{128,128}};
185 EXPECT_NO_THROW(cc.compile(desc1));
186 EXPECT_NO_THROW(cc.compile(desc2));
189 TEST(GAPI_MetaDesc, Typed_Compile_MatchMetaNumber_2)
191 cv::GComputationT<cv::GMat(cv::GMat,cv::GMat)> cc([](cv::GMat a, cv::GMat b)
196 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
197 EXPECT_NO_THROW(cc.compile(desc1, desc1));
199 const auto desc2 = cv::GMatDesc{CV_32F,1,{128,128}};
200 EXPECT_NO_THROW(cc.compile(desc2, desc2));
203 TEST(GAPI_MetaDesc, Typed_Compile_MatchMetaType_Mat)
205 cv::GComputationT<cv::GMat(cv::GMat)> cc([](cv::GMat in)
210 EXPECT_NO_THROW(cc.compile(cv::GMatDesc{CV_8U,1,{64,64}}));
213 TEST(GAPI_MetaDesc, Typed_Compile_MatchMetaType_Scalar)
215 cv::GComputationT<cv::GScalar(cv::GScalar)> cc([](cv::GScalar in)
217 return KTest::on(in);
220 const auto desc1 = cv::descr_of(cv::Scalar(128));
221 const auto pkg = cv::gapi::kernels<GOCVScalarTest>();
222 // EXPECT_NO_THROW(cc.compile(desc1, cv::compile_args(pkg)));
223 cc.compile(desc1, cv::compile_args(pkg));
226 TEST(GAPI_MetaDesc, Typed_Compile_MatchMetaType_Mixed)
228 cv::GComputationT<cv::GMat(cv::GMat,cv::GScalar)> cc([](cv::GMat a, cv::GScalar v)
230 return cv::gapi::addC(a, v);
233 const auto desc1 = cv::GMatDesc{CV_8U,1,{64,64}};
234 const auto desc2 = cv::descr_of(cv::Scalar(4));
236 EXPECT_NO_THROW(cc.compile(desc1, desc2));
239 } // namespace opencv_test