mirror of
https://github.com/opencv/opencv.git
synced 2024-12-04 16:59:12 +08:00
85fad1504a
* G-API: First steps with tutorial * G-API Tutorial: First iteration * G-API port of anisotropic image segmentation tutorial; * Currently works via OpenCV only; * Some new kernels have been required. * G-API Tutorial: added chapters on execution code, inspection, and profiling * G-API Tutorial: make Fluid kernel headers public For some reason, these headers were not moved to the public headers subtree during the initial development. Somehow it even worked for the existing workloads. * G-API Tutorial: Fix a couple of issues found during the work * Introduced Phase & Sqrt kernels, OCV & Fluid versions * Extended GKernelPackage to allow kernel removal & policies on include() All the above stuff needs to be tested, tests will be added later * G-API Tutorial: added chapter on running Fluid backend * G-API Tutorial: fix a number of issues in the text * G-API Tutorial - some final updates - Fixed post-merge issues after Sobel kernel renaming; - Simplified G-API code a little bit; - Put a conclusion note in text. * G-API Tutorial - fix build issues in test/perf targets Public headers were refactored but tests suites were not updated in time * G-API Tutorial: Added tests & reference docs on new kernels * Phase * Sqrt * G-API Tutorial: added link to the tutorial from the main module doc * G-API Tutorial: Added tests on new GKernelPackage functionality * G-API Tutorial: Extended InRange tests to cover 32F * G-API Tutorial: Misc fixes * Avoid building examples when gapi module is not there * Added a volatile API disclaimer to G-API root documentation page * G-API Tutorial: Fix perf tests build issue This change came from master where Fluid kernels are still used incorrectly. * G-API Tutorial: Fixed channels support in Sqrt/Phase fluid kernels Extended tests to cover this case * G-API Tutorial: Fix text problems found on team review
285 lines
8.0 KiB
C++
285 lines
8.0 KiB
C++
// This file is part of OpenCV project.
|
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
|
// of this distribution and at http://opencv.org/license.html.
|
|
//
|
|
// Copyright (C) 2018 Intel Corporation
|
|
|
|
|
|
#include "test_precomp.hpp"
|
|
#include "opencv2/gapi/cpu/gcpukernel.hpp"
|
|
#include "gapi_mock_kernels.hpp"
|
|
|
|
namespace opencv_test
|
|
{
|
|
|
|
namespace
|
|
{
|
|
G_TYPED_KERNEL(GClone, <GMat(GMat)>, "org.opencv.test.clone")
|
|
{
|
|
static GMatDesc outMeta(GMatDesc in) { return in; }
|
|
|
|
};
|
|
|
|
GAPI_OCV_KERNEL(GCloneImpl, GClone)
|
|
{
|
|
static void run(const cv::Mat& in, cv::Mat &out)
|
|
{
|
|
out = in.clone();
|
|
}
|
|
};
|
|
}
|
|
|
|
TEST(KernelPackage, Create)
|
|
{
|
|
namespace J = Jupiter;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
EXPECT_EQ(3u, pkg.size());
|
|
}
|
|
|
|
TEST(KernelPackage, Includes)
|
|
{
|
|
namespace J = Jupiter;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
EXPECT_TRUE (pkg.includes<J::Foo>());
|
|
EXPECT_TRUE (pkg.includes<J::Bar>());
|
|
EXPECT_TRUE (pkg.includes<J::Baz>());
|
|
EXPECT_FALSE(pkg.includes<J::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, IncludesAPI)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, S::Bar>();
|
|
EXPECT_TRUE (pkg.includesAPI<I::Foo>());
|
|
EXPECT_TRUE (pkg.includesAPI<I::Bar>());
|
|
EXPECT_FALSE(pkg.includesAPI<I::Baz>());
|
|
EXPECT_FALSE(pkg.includesAPI<I::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, IncludesAPI_Overlapping)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, S::Foo, S::Bar>();
|
|
EXPECT_TRUE (pkg.includesAPI<I::Foo>());
|
|
EXPECT_TRUE (pkg.includesAPI<I::Bar>());
|
|
EXPECT_FALSE(pkg.includesAPI<I::Baz>());
|
|
EXPECT_FALSE(pkg.includesAPI<I::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, Include_Add)
|
|
{
|
|
namespace J = Jupiter;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
EXPECT_FALSE(pkg.includes<J::Qux>());
|
|
|
|
pkg.include<J::Qux>();
|
|
EXPECT_TRUE(pkg.includes<J::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, Include_KEEP)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar>();
|
|
EXPECT_FALSE(pkg.includes<S::Foo>());
|
|
EXPECT_FALSE(pkg.includes<S::Bar>());
|
|
|
|
pkg.include<S::Bar>(); // default (KEEP)
|
|
EXPECT_TRUE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Bar>());
|
|
|
|
pkg.include<S::Foo>(cv::unite_policy::KEEP); // explicit (KEEP)
|
|
EXPECT_TRUE(pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(pkg.includes<S::Foo>());
|
|
}
|
|
|
|
TEST(KernelPackage, Include_REPLACE)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar>();
|
|
EXPECT_FALSE(pkg.includes<S::Bar>());
|
|
|
|
pkg.include<S::Bar>(cv::unite_policy::REPLACE);
|
|
EXPECT_FALSE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Bar>());
|
|
}
|
|
|
|
TEST(KernelPackage, RemoveBackend)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, S::Foo>();
|
|
EXPECT_TRUE(pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Foo>());
|
|
|
|
pkg.remove(J::backend());
|
|
EXPECT_FALSE(pkg.includes<J::Foo>());
|
|
EXPECT_FALSE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Foo>());
|
|
};
|
|
|
|
TEST(KernelPackage, RemoveAPI)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, S::Foo, S::Bar>();
|
|
EXPECT_TRUE(pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Foo>());
|
|
|
|
pkg.remove<I::Foo>();
|
|
EXPECT_TRUE(pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(pkg.includes<S::Bar>());
|
|
EXPECT_FALSE(pkg.includes<J::Foo>());
|
|
EXPECT_FALSE(pkg.includes<S::Foo>());
|
|
};
|
|
|
|
TEST(KernelPackage, CreateHetero)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz, S::Qux>();
|
|
EXPECT_EQ(4u, pkg.size());
|
|
}
|
|
|
|
TEST(KernelPackage, IncludesHetero)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz, S::Qux>();
|
|
EXPECT_TRUE (pkg.includes<J::Foo>());
|
|
EXPECT_TRUE (pkg.includes<J::Bar>());
|
|
EXPECT_TRUE (pkg.includes<J::Baz>());
|
|
EXPECT_FALSE(pkg.includes<J::Qux>());
|
|
EXPECT_TRUE (pkg.includes<S::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, IncludeHetero)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
EXPECT_FALSE(pkg.includes<J::Qux>());
|
|
EXPECT_FALSE(pkg.includes<S::Qux>());
|
|
|
|
pkg.include<S::Qux>();
|
|
EXPECT_FALSE(pkg.includes<J::Qux>());
|
|
EXPECT_TRUE (pkg.includes<S::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, Combine_REPLACE_Full)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto j_pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
auto s_pkg = cv::gapi::kernels<S::Foo, S::Bar, S::Baz>();
|
|
auto u_pkg = cv::gapi::combine(j_pkg, s_pkg, cv::unite_policy::REPLACE);
|
|
|
|
EXPECT_EQ(3u, u_pkg.size());
|
|
EXPECT_FALSE(u_pkg.includes<J::Foo>());
|
|
EXPECT_FALSE(u_pkg.includes<J::Bar>());
|
|
EXPECT_FALSE(u_pkg.includes<J::Baz>());
|
|
EXPECT_TRUE (u_pkg.includes<S::Foo>());
|
|
EXPECT_TRUE (u_pkg.includes<S::Bar>());
|
|
EXPECT_TRUE (u_pkg.includes<S::Baz>());
|
|
}
|
|
|
|
TEST(KernelPackage, Combine_REPLACE_Partial)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto j_pkg = cv::gapi::kernels<J::Foo, J::Bar>();
|
|
auto s_pkg = cv::gapi::kernels<S::Bar>();
|
|
auto u_pkg = cv::gapi::combine(j_pkg, s_pkg, cv::unite_policy::REPLACE);
|
|
|
|
EXPECT_EQ(2u, u_pkg.size());
|
|
EXPECT_TRUE (u_pkg.includes<J::Foo>());
|
|
EXPECT_FALSE(u_pkg.includes<J::Bar>());
|
|
EXPECT_TRUE (u_pkg.includes<S::Bar>());
|
|
}
|
|
|
|
TEST(KernelPackage, Combine_REPLACE_Append)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto j_pkg = cv::gapi::kernels<J::Foo, J::Bar>();
|
|
auto s_pkg = cv::gapi::kernels<S::Qux>();
|
|
auto u_pkg = cv::gapi::combine(j_pkg, s_pkg, cv::unite_policy::REPLACE);
|
|
|
|
EXPECT_EQ(3u, u_pkg.size());
|
|
EXPECT_TRUE(u_pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(u_pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(u_pkg.includes<S::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, Combine_KEEP_AllDups)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto j_pkg = cv::gapi::kernels<J::Foo, J::Bar, J::Baz>();
|
|
auto s_pkg = cv::gapi::kernels<S::Foo, S::Bar, S::Baz>();
|
|
auto u_pkg = cv::gapi::combine(j_pkg ,s_pkg, cv::unite_policy::KEEP);
|
|
|
|
EXPECT_EQ(6u, u_pkg.size());
|
|
EXPECT_TRUE(u_pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(u_pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(u_pkg.includes<J::Baz>());
|
|
EXPECT_TRUE(u_pkg.includes<S::Foo>());
|
|
EXPECT_TRUE(u_pkg.includes<S::Bar>());
|
|
EXPECT_TRUE(u_pkg.includes<S::Baz>());
|
|
}
|
|
|
|
TEST(KernelPackage, Combine_KEEP_Append_NoDups)
|
|
{
|
|
namespace J = Jupiter;
|
|
namespace S = Saturn;
|
|
auto j_pkg = cv::gapi::kernels<J::Foo, J::Bar>();
|
|
auto s_pkg = cv::gapi::kernels<S::Qux>();
|
|
auto u_pkg = cv::gapi::combine(j_pkg, s_pkg, cv::unite_policy::KEEP);
|
|
|
|
EXPECT_EQ(3u, u_pkg.size());
|
|
EXPECT_TRUE(u_pkg.includes<J::Foo>());
|
|
EXPECT_TRUE(u_pkg.includes<J::Bar>());
|
|
EXPECT_TRUE(u_pkg.includes<S::Qux>());
|
|
}
|
|
|
|
TEST(KernelPackage, TestWithEmptyLHS)
|
|
{
|
|
namespace J = Jupiter;
|
|
auto lhs = cv::gapi::kernels<>();
|
|
auto rhs = cv::gapi::kernels<J::Foo>();
|
|
auto pkg = cv::gapi::combine(lhs, rhs, cv::unite_policy::KEEP);
|
|
|
|
EXPECT_EQ(1u, pkg.size());
|
|
EXPECT_TRUE(pkg.includes<J::Foo>());
|
|
}
|
|
|
|
TEST(KernelPackage, TestWithEmptyRHS)
|
|
{
|
|
namespace J = Jupiter;
|
|
auto lhs = cv::gapi::kernels<J::Foo>();
|
|
auto rhs = cv::gapi::kernels<>();
|
|
auto pkg = cv::gapi::combine(lhs, rhs, cv::unite_policy::KEEP);
|
|
|
|
EXPECT_EQ(1u, pkg.size());
|
|
EXPECT_TRUE(pkg.includes<J::Foo>());
|
|
}
|
|
|
|
TEST(KernelPackage, Can_Use_Custom_Kernel)
|
|
{
|
|
cv::GMat in[2];
|
|
auto out = GClone::on(cv::gapi::add(in[0], in[1]));
|
|
const auto in_meta = cv::GMetaArg(cv::GMatDesc{CV_8U,1,cv::Size(32,32)});
|
|
|
|
auto pkg = cv::gapi::kernels<GCloneImpl>();
|
|
|
|
EXPECT_NO_THROW(cv::GComputation(cv::GIn(in[0], in[1]), cv::GOut(out)).
|
|
compile({in_meta, in_meta}, cv::compile_args(pkg)));
|
|
}
|
|
|
|
} // namespace opencv_test
|