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"
11 #include <ade/util/algorithm.hpp>
18 using GPointArray = cv::GArray<cv::Point>;
19 G_TYPED_KERNEL(GeneratePoints, <GPointArray(GMat)>, "test.array.out_const")
21 static GArrayDesc outMeta(const GMatDesc&) { return empty_array_desc(); }
23 G_TYPED_KERNEL(FindCorners, <GPointArray(GMat)>, "test.array.out")
25 static GArrayDesc outMeta(const GMatDesc&) { return empty_array_desc(); }
27 G_TYPED_KERNEL(CountCorners, <GScalar(GPointArray)>, "test.array.in")
29 static GScalarDesc outMeta(const GArrayDesc &) { return empty_scalar_desc(); }
31 } // namespace ThisTest
35 GAPI_OCV_KERNEL(OCVGeneratePoints, ThisTest::GeneratePoints)
37 static void run(cv::Mat, std::vector<cv::Point> &out)
39 for (int i = 0; i < 10; i++)
40 out.emplace_back(i, i);
44 GAPI_OCV_KERNEL(OCVFindCorners, ThisTest::FindCorners)
46 static void run(cv::Mat in, std::vector<cv::Point> &out)
48 cv::goodFeaturesToTrack(in, out, 1024, 0.01, 3);
52 GAPI_OCV_KERNEL(OCVCountCorners, ThisTest::CountCorners)
54 static void run(const std::vector<cv::Point> &in, cv::Scalar &out)
56 out[0] = static_cast<double>(in.size());
60 cv::Mat cross(int w, int h)
62 cv::Mat mat = cv::Mat::eye(h, w, CV_8UC1)*255;
64 cv::flip(mat, yee, 0); // X-axis
65 mat |= yee; // make an "X" matrix;
68 } // (anonymous namespace)
70 TEST(GArray, TestReturnValue)
72 // FIXME: Make .apply() able to take compile arguments
73 cv::GComputationT<ThisTest::GPointArray(cv::GMat)> c(ThisTest::FindCorners::on);
74 auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},
75 cv::compile_args(cv::gapi::kernels<OCVFindCorners>()));
77 // Prepare input matrix
78 cv::Mat input = cross(32, 32);
80 std::vector<cv::Point> points;
83 // OCV goodFeaturesToTrack should find 5 points here (with these settings)
84 EXPECT_EQ(5u, points.size());
85 EXPECT_TRUE(ade::util::find(points, cv::Point(16,16)) != points.end());
86 EXPECT_TRUE(ade::util::find(points, cv::Point(30,30)) != points.end());
87 EXPECT_TRUE(ade::util::find(points, cv::Point( 1,30)) != points.end());
88 EXPECT_TRUE(ade::util::find(points, cv::Point(30, 1)) != points.end());
89 EXPECT_TRUE(ade::util::find(points, cv::Point( 1, 1)) != points.end());
92 TEST(GArray, TestInputArg)
94 cv::GComputationT<cv::GScalar(ThisTest::GPointArray)> c(ThisTest::CountCorners::on);
95 auto cc = c.compile(cv::empty_array_desc(),
96 cv::compile_args(cv::gapi::kernels<OCVCountCorners>()));
98 const std::vector<cv::Point> arr = {cv::Point(1,1), cv::Point(2,2)};
101 EXPECT_EQ(2, out[0]);
104 TEST(GArray, TestPipeline)
106 cv::GComputationT<cv::GScalar(cv::GMat)> c([](cv::GMat in)
108 return ThisTest::CountCorners::on(ThisTest::FindCorners::on(in));
110 auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},
111 cv::compile_args(cv::gapi::kernels<OCVFindCorners, OCVCountCorners>()));
113 cv::Mat input = cross(32, 32);
116 EXPECT_EQ(5, out[0]);
119 TEST(GArray, NoAggregationBetweenRuns)
121 cv::GComputationT<cv::GScalar(cv::GMat)> c([](cv::GMat in)
123 return ThisTest::CountCorners::on(ThisTest::GeneratePoints::on(in));
125 auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},
126 cv::compile_args(cv::gapi::kernels<OCVGeneratePoints, OCVCountCorners>()));
128 cv::Mat input = cv::Mat::eye(32, 32, CV_8UC1);
132 EXPECT_EQ(10, out[0]);
134 // Last kernel in the graph counts number of elements in array, returned by the previous kernel
135 // (in this test, this variable is constant).
136 // After 10 executions, this number MUST remain the same - 1st kernel is adding new values on every
137 // run, but it is graph's responsibility to reset internal object state.
139 for (int i = 0; i < 10; i++)
143 EXPECT_EQ(10, out2[0]);
146 TEST(GArray, TestIntermediateOutput)
148 using Result = std::tuple<ThisTest::GPointArray, cv::GScalar>;
149 cv::GComputationT<Result(cv::GMat)> c([](cv::GMat in)
151 auto corners = ThisTest::GeneratePoints::on(in);
152 return std::make_tuple(corners, ThisTest::CountCorners::on(corners));
155 cv::Mat in_mat = cv::Mat::eye(32, 32, CV_8UC1);
156 std::vector<cv::Point> out_points;
157 cv::Scalar out_count;
159 auto cc = c.compile(cv::descr_of(in_mat),
160 cv::compile_args(cv::gapi::kernels<OCVGeneratePoints, OCVCountCorners>()));
161 cc(in_mat, out_points, out_count);
163 EXPECT_EQ(10u, out_points.size());
164 EXPECT_EQ(10, out_count[0]);
166 } // namespace opencv_test