Path: blob/master/modules/gapi/test/gapi_array_tests.cpp
16337 views
// This file is part of OpenCV project.1// It is subject to the license terms in the LICENSE file found in the top-level directory2// of this distribution and at http://opencv.org/license.html.3//4// Copyright (C) 2018 Intel Corporation567#include "test_precomp.hpp"89#include <vector>10#include <ade/util/algorithm.hpp>1112namespace opencv_test13{1415namespace ThisTest16{17using GPointArray = cv::GArray<cv::Point>;18G_TYPED_KERNEL(GeneratePoints, <GPointArray(GMat)>, "test.array.out_const")19{20static GArrayDesc outMeta(const GMatDesc&) { return empty_array_desc(); }21};22G_TYPED_KERNEL(FindCorners, <GPointArray(GMat)>, "test.array.out")23{24static GArrayDesc outMeta(const GMatDesc&) { return empty_array_desc(); }25};26G_TYPED_KERNEL(CountCorners, <GScalar(GPointArray)>, "test.array.in")27{28static GScalarDesc outMeta(const GArrayDesc &) { return empty_scalar_desc(); }29};30} // namespace ThisTest3132namespace33{34GAPI_OCV_KERNEL(OCVGeneratePoints, ThisTest::GeneratePoints)35{36static void run(cv::Mat, std::vector<cv::Point> &out)37{38for (int i = 0; i < 10; i++)39out.emplace_back(i, i);40}41};4243GAPI_OCV_KERNEL(OCVFindCorners, ThisTest::FindCorners)44{45static void run(cv::Mat in, std::vector<cv::Point> &out)46{47cv::goodFeaturesToTrack(in, out, 1024, 0.01, 3);48}49};5051GAPI_OCV_KERNEL(OCVCountCorners, ThisTest::CountCorners)52{53static void run(const std::vector<cv::Point> &in, cv::Scalar &out)54{55out[0] = static_cast<double>(in.size());56}57};5859cv::Mat cross(int w, int h)60{61cv::Mat mat = cv::Mat::eye(h, w, CV_8UC1)*255;62cv::Mat yee;63cv::flip(mat, yee, 0); // X-axis64mat |= yee; // make an "X" matrix;65return mat;66}67} // (anonymous namespace)6869TEST(GArray, TestReturnValue)70{71// FIXME: Make .apply() able to take compile arguments72cv::GComputationT<ThisTest::GPointArray(cv::GMat)> c(ThisTest::FindCorners::on);73auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},74cv::compile_args(cv::gapi::kernels<OCVFindCorners>()));7576// Prepare input matrix77cv::Mat input = cross(32, 32);7879std::vector<cv::Point> points;80cc(input, points);8182// OCV goodFeaturesToTrack should find 5 points here (with these settings)83EXPECT_EQ(5u, points.size());84EXPECT_TRUE(ade::util::find(points, cv::Point(16,16)) != points.end());85EXPECT_TRUE(ade::util::find(points, cv::Point(30,30)) != points.end());86EXPECT_TRUE(ade::util::find(points, cv::Point( 1,30)) != points.end());87EXPECT_TRUE(ade::util::find(points, cv::Point(30, 1)) != points.end());88EXPECT_TRUE(ade::util::find(points, cv::Point( 1, 1)) != points.end());89}9091TEST(GArray, TestInputArg)92{93cv::GComputationT<cv::GScalar(ThisTest::GPointArray)> c(ThisTest::CountCorners::on);94auto cc = c.compile(cv::empty_array_desc(),95cv::compile_args(cv::gapi::kernels<OCVCountCorners>()));9697const std::vector<cv::Point> arr = {cv::Point(1,1), cv::Point(2,2)};98cv::Scalar out;99cc(arr, out);100EXPECT_EQ(2, out[0]);101}102103TEST(GArray, TestPipeline)104{105cv::GComputationT<cv::GScalar(cv::GMat)> c([](cv::GMat in)106{107return ThisTest::CountCorners::on(ThisTest::FindCorners::on(in));108});109auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},110cv::compile_args(cv::gapi::kernels<OCVFindCorners, OCVCountCorners>()));111112cv::Mat input = cross(32, 32);113cv::Scalar out;114cc(input, out);115EXPECT_EQ(5, out[0]);116}117118TEST(GArray, NoAggregationBetweenRuns)119{120cv::GComputationT<cv::GScalar(cv::GMat)> c([](cv::GMat in)121{122return ThisTest::CountCorners::on(ThisTest::GeneratePoints::on(in));123});124auto cc = c.compile(cv::GMatDesc{CV_8U,1,{32,32}},125cv::compile_args(cv::gapi::kernels<OCVGeneratePoints, OCVCountCorners>()));126127cv::Mat input = cv::Mat::eye(32, 32, CV_8UC1);128cv::Scalar out;129130cc(input, out);131EXPECT_EQ(10, out[0]);132133// Last kernel in the graph counts number of elements in array, returned by the previous kernel134// (in this test, this variable is constant).135// After 10 executions, this number MUST remain the same - 1st kernel is adding new values on every136// run, but it is graph's responsibility to reset internal object state.137cv::Scalar out2;138for (int i = 0; i < 10; i++)139{140cc(input, out2);141}142EXPECT_EQ(10, out2[0]);143}144145TEST(GArray, TestIntermediateOutput)146{147using Result = std::tuple<ThisTest::GPointArray, cv::GScalar>;148cv::GComputationT<Result(cv::GMat)> c([](cv::GMat in)149{150auto corners = ThisTest::GeneratePoints::on(in);151return std::make_tuple(corners, ThisTest::CountCorners::on(corners));152});153154cv::Mat in_mat = cv::Mat::eye(32, 32, CV_8UC1);155std::vector<cv::Point> out_points;156cv::Scalar out_count;157158auto cc = c.compile(cv::descr_of(in_mat),159cv::compile_args(cv::gapi::kernels<OCVGeneratePoints, OCVCountCorners>()));160cc(in_mat, out_points, out_count);161162EXPECT_EQ(10u, out_points.size());163EXPECT_EQ(10, out_count[0]);164}165} // namespace opencv_test166167168