Commit b2b6f52d authored by Dmitry Matveev's avatar Dmitry Matveev Committed by Alexander Alekhin

Merge pull request #16050 from dmatveev:dm/ocv42_gapi_doc_fixup

* G-API: Addressed various documentation issues

- Fixed various typos and missing references;
- Added brief documentaion on G_TYPED_KERNEL and G_COMPOUND_KERNEL macros;
- Briefly described GComputationT<>;
- Briefly described G-API data objects (in a group section).

* G-API: Some clean-ups in doxygen, also a chapter on Render API

* G-API: Expose more graph compilation arguments in the documentation

* G-API: Address documentation review comments
parent 15621532
...@@ -157,7 +157,7 @@ Now this file can be visalized with a `dot` command like this: ...@@ -157,7 +157,7 @@ Now this file can be visalized with a `dot` command like this:
$ dot segm.dot -Tpng -o segm.png $ dot segm.dot -Tpng -o segm.png
or viewed instantly with `xdot` command (please refer to your or viewed interactively with `xdot` (please refer to your
distribution/operating system documentation on how to install these distribution/operating system documentation on how to install these
packages). packages).
......
...@@ -64,7 +64,7 @@ included explicitly. The first four lines of `main()` create and ...@@ -64,7 +64,7 @@ included explicitly. The first four lines of `main()` create and
initialize OpenCV's standard video capture object, which fetches initialize OpenCV's standard video capture object, which fetches
video frames from either an attached camera or a specified file. video frames from either an attached camera or a specified file.
G-API pipelie is constructed next. In fact, it is a series of G-API G-API pipeline is constructed next. In fact, it is a series of G-API
operation calls on cv::GMat data. The important aspect of G-API is operation calls on cv::GMat data. The important aspect of G-API is
that this code block is just a declaration of actions, but not the that this code block is just a declaration of actions, but not the
actions themselves. No processing happens at this point, G-API only actions themselves. No processing happens at this point, G-API only
......
# High-level design overview {#gapi_hld} # High-level design overview {#gapi_hld}
# G-API High-level design overview
[TOC] [TOC]
G-API is a heterogeneous framework and provides single API to program # G-API High-level design overview
image processing pipelines with a number of supported backends.
G-API is a heterogeneous framework and provides an unified API to
program image processing pipelines with a number of supported
backends.
The key design idea is to keep pipeline code itself platform-neutral The key design idea is to keep pipeline code itself platform-neutral
while specifying which kernels to use and which devices to utilize while specifying which kernels to use and which devices to utilize
...@@ -54,7 +55,7 @@ their own kernels easily using a special macro G_TYPED_KERNEL(). ...@@ -54,7 +55,7 @@ their own kernels easily using a special macro G_TYPED_KERNEL().
API layer is also responsible for marshalling and storing operation API layer is also responsible for marshalling and storing operation
parameters on pipeline creation. In addition to the aforementioned parameters on pipeline creation. In addition to the aforementioned
G-API dynamic objects, operations may also accept arbitrary G-API dynamic objects, operations may also accept arbitrary
parameters (more on this [below](@ref gapi_detail_params)), so API parameters (more on this [here](@ref gapi_detail_params)), so API
layer captures its values and stores internally upon the moment of layer captures its values and stores internally upon the moment of
execution. execution.
...@@ -143,7 +144,7 @@ Both methods are polimorphic and take a variadic number of arguments, ...@@ -143,7 +144,7 @@ Both methods are polimorphic and take a variadic number of arguments,
with validity checks performed in runtime. If a number, shapes, and with validity checks performed in runtime. If a number, shapes, and
formats of passed data objects differ from expected, a run-time formats of passed data objects differ from expected, a run-time
exception is thrown. G-API also provides _typed_ wrappers to move exception is thrown. G-API also provides _typed_ wrappers to move
these checks to the compile time -- see cv::GComputationT<>. these checks to the compile time -- see `cv::GComputationT<>`.
G-API graph execution is declared stateless -- it means that a G-API graph execution is declared stateless -- it means that a
compiled functor (cv::GCompiled) acts like a pure C++ function and compiled functor (cv::GCompiled) acts like a pure C++ function and
...@@ -154,6 +155,6 @@ number of inputs, and \f$M\f$ is a number of outputs on which a ...@@ -154,6 +155,6 @@ number of inputs, and \f$M\f$ is a number of outputs on which a
cv::GComputation is defined. Note that while G-API types (cv::GMat, cv::GComputation is defined. Note that while G-API types (cv::GMat,
etc) are used in definition, the execution methods accept OpenCV's etc) are used in definition, the execution methods accept OpenCV's
traditional data types (like cv::Mat) which hold actual data -- see traditional data types (like cv::Mat) which hold actual data -- see
table in [parameter marshalling](@#gapi_detail_params). table in [parameter marshalling](@ref gapi_detail_params).
@sa @ref gapi_impl, @ref gapi_kernel_api @sa @ref gapi_impl, @ref gapi_kernel_api
...@@ -54,10 +54,10 @@ handled in a special way. All other types are opaque to G-API and ...@@ -54,10 +54,10 @@ handled in a special way. All other types are opaque to G-API and
passed to kernel in `outMeta()` or in execution callbacks as-is. passed to kernel in `outMeta()` or in execution callbacks as-is.
Kernel's return value can _only_ be of G-API dynamic type -- cv::GMat, Kernel's return value can _only_ be of G-API dynamic type -- cv::GMat,
cv::GScalar, or cv::GArray<T>. If an operation has more than one output, cv::GScalar, or `cv::GArray<T>`. If an operation has more than one
it should be wrapped into an `std::tuple<>` (which can contain only output, it should be wrapped into an `std::tuple<>` (which can contain
mentioned G-API types). Arbitrary-output-number operations are not only mentioned G-API types). Arbitrary-output-number operations are
supported. not supported.
Once a kernel is defined, it can be used in pipelines with special, Once a kernel is defined, it can be used in pipelines with special,
G-API-supplied method "::on()". This method has the same signature as G-API-supplied method "::on()". This method has the same signature as
...@@ -141,7 +141,7 @@ just follow the signature conventions defined by the plugin. G-API ...@@ -141,7 +141,7 @@ just follow the signature conventions defined by the plugin. G-API
will call this method during execution and supply all the necessary will call this method during execution and supply all the necessary
information (and forward the original opaque data as-is). information (and forward the original opaque data as-is).
# Compound kernels # Compound kernels {#gapi_kernel_compound}
Sometimes kernel is a single thing only on API level. It is convenient Sometimes kernel is a single thing only on API level. It is convenient
for users, but on a particular implementation side it would be better to for users, but on a particular implementation side it would be better to
......
...@@ -2,26 +2,28 @@ ...@@ -2,26 +2,28 @@
[TOC] [TOC]
# G-API Implementation details {#gapi_impl_header} # G-API Implementation details
## Api layer details {#gapi_detail_api} Note -- this section is still in progress.
### Expression unrolling {#gapi_detail_expr} # API layer {#gapi_detail_api}
### Parameter marshalling {#gapi_detail_params} ## Expression unrolling {#gapi_detail_expr}
### Operations representation {#gapi_detail_operations} ## Parameter marshalling {#gapi_detail_params}
## Graph compiler details {#gapi_detail_compiler} ## Operations representation {#gapi_detail_operations}
### ADE basics {#gapi_detail_ade} # Graph compiler {#gapi_detail_compiler}
### Graph model representation {#gapi_detail_gmodel} ## ADE basics {#gapi_detail_ade}
### G-API metadata and passes {#gapi_detail_meta} ## Graph model representation {#gapi_detail_gmodel}
## Backends details {#gapi_detail_backends} ## G-API metadata and passes {#gapi_detail_meta}
### Backend scope of work {#gapi_backend_scope} # Backends {#gapi_detail_backends}
### Graph transformation {#gapi_backend_pass} ## Backend scope of work {#gapi_backend_scope}
## Graph transformation {#gapi_backend_pass}
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
/** \defgroup gapi G-API framework /** \defgroup gapi G-API framework
@{ @{
@defgroup gapi_main_classes G-API Main Classes @defgroup gapi_main_classes G-API Main Classes
@defgroup gapi_data_objects G-API Data Objects @defgroup gapi_data_objects G-API Data Types
@{ @{
@defgroup gapi_meta_args G-API Metadata Descriptors @defgroup gapi_meta_args G-API Metadata Descriptors
@} @}
@defgroup gapi_std_backends G-API Standard backends @defgroup gapi_std_backends G-API Standard Backends
@defgroup gapi_compile_args G-API Graph Compilation Arguments @defgroup gapi_compile_args G-API Graph Compilation Arguments
@} @}
*/ */
......
...@@ -18,12 +18,12 @@ ...@@ -18,12 +18,12 @@
#include <opencv2/gapi/gscalar.hpp> #include <opencv2/gapi/gscalar.hpp>
#include <opencv2/gapi/gkernel.hpp> #include <opencv2/gapi/gkernel.hpp>
/** \defgroup gapi_core G-API core (basic) functionality /** \defgroup gapi_core G-API Core functionality
@{ @{
@defgroup gapi_math Graph API: Math operations @defgroup gapi_math Graph API: Math operations
@defgroup gapi_pixelwise Graph API: Pixelwise operations @defgroup gapi_pixelwise Graph API: Pixelwise operations
@defgroup gapi_matrixop Graph API: Operations on matrices @defgroup gapi_matrixop Graph API: Operations on matrices
@defgroup gapi_transform Graph API: Geometric, depth and LUT-like image transformations @defgroup gapi_transform Graph API: Image and channel composition functions
@} @}
*/ */
namespace cv { namespace gapi { namespace cv { namespace gapi {
......
...@@ -29,7 +29,7 @@ namespace gapi ...@@ -29,7 +29,7 @@ namespace gapi
namespace fluid namespace fluid
{ {
/** /**
* \addtogroup gapi_std_backends G-API Standard backends * \addtogroup gapi_std_backends G-API Standard Backends
* @{ * @{
*/ */
/** /**
...@@ -97,16 +97,46 @@ public: ...@@ -97,16 +97,46 @@ public:
// FIXME!!! // FIXME!!!
// This is the temporary and experimental API // This is the temporary and experimental API
// which should be replaced by runtime roi-based scheduling // which should be replaced by runtime roi-based scheduling
/** \addtogroup gapi_compile_args
* @{
*/
/**
* @brief This structure allows to control the output image region
* which Fluid backend will produce in the graph.
*
* This feature is useful for external tiling and parallelism, but
* will be deprecated in the future releases.
*/
struct GFluidOutputRois struct GFluidOutputRois
{ {
std::vector<cv::gapi::own::Rect> rois; std::vector<cv::gapi::own::Rect> rois;
}; };
/**
* @brief This structure forces Fluid backend to generate multiple
* parallel output regions in the graph. These regions execute in parallel.
*
* This feature may be deprecated in the future releases.
*/
struct GFluidParallelOutputRois struct GFluidParallelOutputRois
{ {
std::vector<GFluidOutputRois> parallel_rois; std::vector<GFluidOutputRois> parallel_rois;
}; };
/**
* @brief This structure allows to customize the way how Fluid executes
* parallel regions.
*
* For example, user can utilize his own threading runtime via this parameter.
* The `parallel_for` member functor is called by the Fluid runtime with the
* following arguments:
*
* @param size Size of the parallel range to process
* @param f A function which should be called for every integer index
* in this range by the specified parallel_for implementation.
*
* This feature may be deprecated in the future releases.
*/
struct GFluidParallelFor struct GFluidParallelFor
{ {
//this function accepts: //this function accepts:
...@@ -114,6 +144,7 @@ struct GFluidParallelFor ...@@ -114,6 +144,7 @@ struct GFluidParallelFor
// - and a function to be called on the range items, designated by item index // - and a function to be called on the range items, designated by item index
std::function<void(std::size_t size, std::function<void(std::size_t index)>)> parallel_for; std::function<void(std::size_t size, std::function<void(std::size_t index)>)> parallel_for;
}; };
/** @} gapi_compile_args */
namespace detail namespace detail
{ {
......
...@@ -25,10 +25,6 @@ namespace detail ...@@ -25,10 +25,6 @@ namespace detail
// This is a trait-like structure to mark backend-specific compile arguments // This is a trait-like structure to mark backend-specific compile arguments
// with tags // with tags
template<typename T> struct CompileArgTag; template<typename T> struct CompileArgTag;
template<typename T> struct CompileArgTag
{
static const char* tag() { return ""; };
};
// These structures are tags which separate kernels and transformations // These structures are tags which separate kernels and transformations
struct KernelTag struct KernelTag
...@@ -62,8 +58,8 @@ namespace detail { ...@@ -62,8 +58,8 @@ namespace detail {
/** \addtogroup gapi_compile_args /** \addtogroup gapi_compile_args
* @{ * @{
* *
* @brief Compilation arguments: a set of data structures which can be * @brief Compilation arguments: data structures controlling the
* passed to control compilation process * compilation process
* *
* G-API comes with a number of graph compilation options which can be * G-API comes with a number of graph compilation options which can be
* passed to cv::GComputation::apply() or * passed to cv::GComputation::apply() or
......
...@@ -101,7 +101,18 @@ public: ...@@ -101,7 +101,18 @@ public:
}; };
} // namespace detail } // namespace detail
#define GAPI_COMPOUND_KERNEL(Name, API) struct Name: public cv::detail::GCompoundKernelImpl<Name, API>
/**
* Declares a new compound kernel. See this
* [documentation chapter](@ref gapi_kernel_compound)
* on compound kernels for more details.
*
* @param Name type name for new kernel
* @param API the interface this kernel implements
*/
#define GAPI_COMPOUND_KERNEL(Name, API) \
struct Name: public cv::detail::GCompoundKernelImpl<Name, API>
} // namespace cv } // namespace cv
......
...@@ -39,6 +39,8 @@ namespace detail ...@@ -39,6 +39,8 @@ namespace detail
/** /**
* \addtogroup gapi_main_classes * \addtogroup gapi_main_classes
* @{ * @{
*
* @brief G-API classes for constructed and compiled graphs.
*/ */
/** /**
* @brief GComputation class represents a captured computation * @brief GComputation class represents a captured computation
......
...@@ -239,12 +239,31 @@ public: ...@@ -239,12 +239,31 @@ public:
static constexpr const char * id() {return Id;} \ static constexpr const char * id() {return Id;} \
}; \ }; \
//! @endcond //! @endcond
/**
* Declares a new G-API Operation. See [Kernel API](@ref gapi_kernel_api)
* for more details.
*
* @param Class type name for this operation.
* @param API an `std::function<>`-like signature for the operation;
* return type is a single value.
* @param Id string identifier for the operation. Must be unique.
*/
#define G_TYPED_KERNEL(Class, API, Id) \ #define G_TYPED_KERNEL(Class, API, Id) \
G_ID_HELPER_BODY(Class, Id) \ G_ID_HELPER_BODY(Class, Id) \
struct Class final: public cv::GKernelType<Class, std::function API >, \ struct Class final: public cv::GKernelType<Class, std::function API >, \
public G_ID_HELPER_CLASS(Class) public G_ID_HELPER_CLASS(Class)
// {body} is to be defined by user // {body} is to be defined by user
/**
* Declares a new G-API Operation. See [Kernel API](@ref gapi_kernel_api)
* for more details.
*
* @param Class type name for this operation.
* @param API an `std::function<>`-like signature for the operation;
* return type is a tuple of multiple values.
* @param Id string identifier for the operation. Must be unique.
*/
#define G_TYPED_KERNEL_M(Class, API, Id) \ #define G_TYPED_KERNEL_M(Class, API, Id) \
G_ID_HELPER_BODY(Class, Id) \ G_ID_HELPER_BODY(Class, Id) \
struct Class final: public cv::GKernelTypeM<Class, std::function API >, \ struct Class final: public cv::GKernelTypeM<Class, std::function API >, \
......
...@@ -29,10 +29,24 @@ struct GOrigin; ...@@ -29,10 +29,24 @@ struct GOrigin;
/** \addtogroup gapi_data_objects /** \addtogroup gapi_data_objects
* @{ * @{
* *
* @brief Data-representing objects which can be used to build G-API * @brief G-API data objects used to build G-API expressions.
* expressions. *
* These objects do not own any particular data (except compile-time
* associated values like with cv::GScalar) and are used to construct
* graphs.
*
* Every graph in G-API starts and ends with data objects.
*
* Once constructed and compiled, G-API operates with regular host-side
* data instead. Refer to the below table to find the mapping between
* G-API and regular data types.
*
* G-API data type | I/O data type
* ------------------ | -------------
* cv::GMat | cv::Mat
* cv::GScalar | cv::Scalar
* `cv::GArray<T>` | std::vector<T>
*/ */
class GAPI_EXPORTS GMat class GAPI_EXPORTS GMat
{ {
public: public:
......
...@@ -39,6 +39,46 @@ namespace detail ...@@ -39,6 +39,46 @@ namespace detail
auto make_default()->decltype(T{}) {return {};} auto make_default()->decltype(T{}) {return {};}
}; // detail }; // detail
/**
* @brief This class is a typed wrapper over a regular GComputation.
*
* `std::function<>`-like template parameter specifies the graph
* signature so methods so the object's constructor, methods like
* `apply()` and the derived `GCompiledT::operator()` also become
* typed.
*
* There is no need to use cv::gin() or cv::gout() modifiers with
* objects of this class. Instead, all input arguments are followed
* by all output arguments in the order from the template argument
* signature.
*
* Refer to the following example. Regular (untyped) code is written this way:
*
* @snippet modules/gapi/samples/api_ref_snippets.cpp Untyped_Example
*
* Here:
*
* - cv::GComputation object is created with a lambda constructor
* where it is defined as a two-input, one-output graph.
*
* - Its method `apply()` in fact takes arbitrary number of arguments
* (as vectors) so user can pass wrong number of inputs/outputs
* here. C++ compiler wouldn't notice that since the cv::GComputation
* API is polymorphic, and only a run-time error will be generated.
*
* Now the same code written with typed API:
*
* @snippet modules/gapi/samples/api_ref_snippets.cpp Typed_Example
*
* The key difference is:
*
* - Now the constructor lambda *must take* parameters and *must
* return* values as defined in the `GComputationT<>` signature.
* - Its method `apply()` does not require any extra specifiers to
* separate input arguments from the output ones
* - A `GCompiledT` (compilation product) takes input/output
* arguments with no extra specifiers as well.
*/
template<typename> class GComputationT; template<typename> class GComputationT;
// Single return value implementation // Single return value implementation
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <opencv2/gapi/gscalar.hpp> #include <opencv2/gapi/gscalar.hpp>
/** \defgroup gapi_imgproc G-API image processing functionality /** \defgroup gapi_imgproc G-API Image processing functionality
@{ @{
@defgroup gapi_filters Graph API: Image filters @defgroup gapi_filters Graph API: Image filters
@defgroup gapi_colorconvert Graph API: Converting image from one color space to another @defgroup gapi_colorconvert Graph API: Converting image from one color space to another
......
...@@ -192,6 +192,9 @@ struct GAPI_EXPORTS GNetParam { ...@@ -192,6 +192,9 @@ struct GAPI_EXPORTS GNetParam {
util::any params; // Backend-interpreted parameter structure util::any params; // Backend-interpreted parameter structure
}; };
/** \addtogroup gapi_compile_args
* @{
*/
/** /**
* @brief A container class for network configurations. Similar to * @brief A container class for network configurations. Similar to
* GKernelPackage.Use cv::gapi::networks() to construct this object. * GKernelPackage.Use cv::gapi::networks() to construct this object.
...@@ -204,6 +207,7 @@ struct GAPI_EXPORTS GNetPackage { ...@@ -204,6 +207,7 @@ struct GAPI_EXPORTS GNetPackage {
std::vector<GBackend> backends() const; std::vector<GBackend> backends() const;
std::vector<GNetParam> networks; std::vector<GNetParam> networks;
}; };
/** @} gapi_compile_args */
} // namespace gapi } // namespace gapi
namespace detail { namespace detail {
......
...@@ -32,7 +32,7 @@ namespace gapi ...@@ -32,7 +32,7 @@ namespace gapi
namespace ocl namespace ocl
{ {
/** /**
* \addtogroup gapi_std_backends G-API Standard backends * \addtogroup gapi_std_backends G-API Standard Backends
* @{ * @{
*/ */
/** /**
......
...@@ -18,11 +18,19 @@ namespace gapi ...@@ -18,11 +18,19 @@ namespace gapi
namespace plaidml namespace plaidml
{ {
/** \addtogroup gapi_compile_args
* @{
*/
/**
* @brief This structure represents the basic parameters for the experimental
* PlaidML backend.
*/
struct config struct config
{ {
std::string dev_id; std::string dev_id; //!< Device ID. Refer to PlaidML documentation for details.
std::string trg_id; std::string trg_id; //!< Target ID. Refer to PlaidML documentation for details.
}; };
/** @} gapi_compile_args */
} // namespace plaidml } // namespace plaidml
} // namespace gapi } // namespace gapi
......
// 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) 2019 Intel Corporation
#ifndef OPENCV_GAPI_RENDER_ROOT_HPP
#define OPENCV_GAPI_RENDER_ROOT_HPP
// This file is just a shortcut to render/render.hpp
#include <opencv2/gapi/render/render.hpp>
#endif // OPENCV_GAPI_RENDER_ROOT_HPP
...@@ -18,6 +18,56 @@ ...@@ -18,6 +18,56 @@
#include <opencv2/gapi/own/exports.hpp> #include <opencv2/gapi/own/exports.hpp>
#include <opencv2/gapi/own/scalar.hpp> #include <opencv2/gapi/own/scalar.hpp>
/** \defgroup gapi_draw G-API Drawing and composition functionality
* @{
*
* @brief Functions for in-graph drawing.
*
* @note This is a Work in Progress functionality and APIs may
* change in the future releases.
*
* G-API can do some in-graph drawing with a generic operations and a
* set of [rendering primitives](@ref gapi_draw_prims).
* In contrast with traditional OpenCV, in G-API user need to form a
* *rendering list* of primitives to draw. This list can be built
* manually or generated within a graph. This list is passed to
* [special operations or functions](@ref gapi_draw_api) where all
* primitives are interpreted and applied to the image.
*
* For example, in a complex pipeline a list of detected objects
* can be translated in-graph to a list of cv::gapi::wip::draw::Rect
* primitives to highlight those with bounding boxes, or a list of
* detected faces can be translated in-graph to a list of
* cv::gapi::wip::draw::Mosaic primitives to hide sensitive content
* or protect privacy.
*
* Like any other operations, rendering in G-API can be reimplemented
* by different backends. Currently only an OpenCV-based backend is
* available.
*
* In addition to the graph-level operations, there are also regular
* (immediate) OpenCV-like functions are available -- see
* cv::gapi::wip::draw::render(). These functions are just wrappers
* over regular G-API and build the rendering graphs on the fly, so
* take compilation arguments as parameters.
*
* Currently this API is more machine-oriented than human-oriented.
* The main purpose is to translate a set of domain-specific objects
* to a list of primitives to draw. For example, in order to generate
* a picture like this:
*
* ![](modules/gapi/doc/pics/render_example.png)
*
* Rendering list needs to be generated as follows:
*
* @include modules/gapi/samples/draw_example.cpp
*
* @defgroup gapi_draw_prims Drawing primitives
* @defgroup gapi_draw_api Drawing operations and functions
* @}
*/
namespace cv namespace cv
{ {
namespace gapi namespace gapi
...@@ -28,17 +78,21 @@ namespace draw ...@@ -28,17 +78,21 @@ namespace draw
{ {
/** /**
* A structure allows using freetype library for text rendering * @brief This structure specifies which FreeType font to use by FText primitives.
*/ */
struct freetype_font struct freetype_font
{ {
/*@{*/ /*@{*/
std::string path; //!< The path to font file (.ttf) std::string path; //!< The path to the font file (.ttf)
/*@{*/ /*@{*/
}; };
//! @addtogroup gapi_draw_prims
//! @{
/** /**
* A structure to represent parameters for drawing a text string. * @brief This structure represents a text string to draw.
*
* Parameters match cv::putText().
*/ */
struct Text struct Text
{ {
...@@ -55,7 +109,11 @@ struct Text ...@@ -55,7 +109,11 @@ struct Text
}; };
/** /**
* A structure to represent parameters for drawing a text string using FreeType library * @brief This structure represents a text string to draw using
* FreeType renderer.
*
* If OpenCV is built without FreeType support, this primitive will
* fail at the execution stage.
*/ */
struct FText struct FText
{ {
...@@ -68,7 +126,9 @@ struct FText ...@@ -68,7 +126,9 @@ struct FText
}; };
/** /**
* A structure to represent parameters for drawing a rectangle * @brief This structure represents a rectangle to draw.
*
* Parameters match cv::rectangle().
*/ */
struct Rect struct Rect
{ {
...@@ -80,7 +140,9 @@ struct Rect ...@@ -80,7 +140,9 @@ struct Rect
}; };
/** /**
* A structure to represent parameters for drawing a circle * @brief This structure represents a circle to draw.
*
* Parameters match cv::circle().
*/ */
struct Circle struct Circle
{ {
...@@ -93,7 +155,9 @@ struct Circle ...@@ -93,7 +155,9 @@ struct Circle
}; };
/** /**
* A structure to represent parameters for drawing a line * @brief This structure represents a line to draw.
*
* Parameters match cv::line().
*/ */
struct Line struct Line
{ {
...@@ -106,17 +170,21 @@ struct Line ...@@ -106,17 +170,21 @@ struct Line
}; };
/** /**
* A structure to represent parameters for drawing a mosaic * @brief This structure represents a mosaicing operation.
*
* Mosaicing is a very basic method to obfuscate regions in the image.
*/ */
struct Mosaic struct Mosaic
{ {
cv::Rect mos; //!< Coordinates of the mosaic cv::Rect mos; //!< Coordinates of the mosaic
int cellSz; //!< Cell size (same for X, Y). Note: mos size must be multiple of cell size int cellSz; //!< Cell size (same for X, Y). Note: mosaic size must be a multiple of cell size
int decim; //!< Decimation (0 stands for no decimation) int decim; //!< Decimation (0 stands for no decimation)
}; };
/** /**
* A structure to represent parameters for drawing an image * @brief This structure represents an image to draw.
*
* Image is blended on a frame using the specified mask.
*/ */
struct Image struct Image
{ {
...@@ -126,7 +194,7 @@ struct Image ...@@ -126,7 +194,7 @@ struct Image
}; };
/** /**
* A structure to represent parameters for drawing a polygon * @brief This structure represents a polygon to draw.
*/ */
struct Poly struct Poly
{ {
...@@ -149,9 +217,14 @@ using Prim = util::variant ...@@ -149,9 +217,14 @@ using Prim = util::variant
>; >;
using Prims = std::vector<Prim>; using Prims = std::vector<Prim>;
//! @} gapi_draw_prims
using GMat2 = std::tuple<cv::GMat,cv::GMat>; using GMat2 = std::tuple<cv::GMat,cv::GMat>;
using GMatDesc2 = std::tuple<cv::GMatDesc,cv::GMatDesc>; using GMatDesc2 = std::tuple<cv::GMatDesc,cv::GMatDesc>;
//! @addtogroup gapi_draw_api
//! @{
/** @brief The function renders on the input image passed drawing primitivies /** @brief The function renders on the input image passed drawing primitivies
@param bgr input image: 8-bit unsigned 3-channel image @ref CV_8UC3. @param bgr input image: 8-bit unsigned 3-channel image @ref CV_8UC3.
...@@ -211,6 +284,7 @@ uv image must be 8-bit unsigned planar 2-channel image @ref CV_8UC2 ...@@ -211,6 +284,7 @@ uv image must be 8-bit unsigned planar 2-channel image @ref CV_8UC2
GAPI_EXPORTS GMat2 renderNV12(const GMat& y, GAPI_EXPORTS GMat2 renderNV12(const GMat& y,
const GMat& uv, const GMat& uv,
const GArray<Prim>& prims); const GArray<Prim>& prims);
//! @} gapi_draw_api
} // namespace draw } // namespace draw
} // namespace wip } // namespace wip
...@@ -224,6 +298,15 @@ namespace ocv ...@@ -224,6 +298,15 @@ namespace ocv
} // namespace ocv } // namespace ocv
} // namespace render } // namespace render
} // namespace gapi } // namespace gapi
namespace detail
{
template<> struct CompileArgTag<cv::gapi::wip::draw::freetype_font>
{
static const char* tag() { return "gapi.freetype_font"; }
};
} // namespace detail
} // namespace cv } // namespace cv
#endif // OPENCV_GAPI_RENDER_HPP #endif // OPENCV_GAPI_RENDER_HPP
...@@ -9,6 +9,44 @@ ...@@ -9,6 +9,44 @@
#include <opencv2/gapi/fluid/core.hpp> #include <opencv2/gapi/fluid/core.hpp>
#include <opencv2/gapi/fluid/imgproc.hpp> #include <opencv2/gapi/fluid/imgproc.hpp>
static void typed_example()
{
const cv::Size sz(32, 32);
cv::Mat
in_mat1 (sz, CV_8UC1),
in_mat2 (sz, CV_8UC1),
out_mat_untyped(sz, CV_8UC1),
out_mat_typed1 (sz, CV_8UC1),
out_mat_typed2 (sz, CV_8UC1);
cv::randu(in_mat1, cv::Scalar::all(0), cv::Scalar::all(255));
cv::randu(in_mat2, cv::Scalar::all(0), cv::Scalar::all(255));
//! [Untyped_Example]
// Untyped G-API ///////////////////////////////////////////////////////////
cv::GComputation cvtU([]()
{
cv::GMat in1, in2;
cv::GMat out = cv::gapi::add(in1, in2);
return cv::GComputation({in1, in2}, {out});
});
std::vector<cv::Mat> u_ins = {in_mat1, in_mat2};
std::vector<cv::Mat> u_outs = {out_mat_untyped};
cvtU.apply(u_ins, u_outs);
//! [Untyped_Example]
//! [Typed_Example]
// Typed G-API /////////////////////////////////////////////////////////////
cv::GComputationT<cv::GMat (cv::GMat, cv::GMat)> cvtT([](cv::GMat m1, cv::GMat m2)
{
return m1+m2;
});
cvtT.apply(in_mat1, in_mat2, out_mat_typed1);
auto cvtTC = cvtT.compile(cv::descr_of(in_mat1), cv::descr_of(in_mat2));
cvtTC(in_mat1, in_mat2, out_mat_typed2);
//! [Typed_Example]
}
G_TYPED_KERNEL(IAdd, <cv::GMat(cv::GMat)>, "test.custom.add") { G_TYPED_KERNEL(IAdd, <cv::GMat(cv::GMat)>, "test.custom.add") {
static cv::GMatDesc outMeta(const cv::GMatDesc &in) { return in; } static cv::GMatDesc outMeta(const cv::GMatDesc &in) { return in; }
}; };
...@@ -77,5 +115,8 @@ int main(int argc, char *argv[]) ...@@ -77,5 +115,8 @@ int main(int argc, char *argv[])
, CustomRGB2YUV , CustomRGB2YUV
>(); >();
//! [kernels_snippet] //! [kernels_snippet]
// Just call typed example with no input/output
typed_example();
return 0; return 0;
} }
#include <opencv2/imgproc.hpp> // cv::FONT*, cv::LINE*, cv::FILLED
#include <opencv2/highgui.hpp> // imwrite
#include <opencv2/gapi.hpp>
#include <opencv2/gapi/render.hpp>
int main(int argc, char *argv[])
{
if (argc < 2) {
std::cerr << "Filename requried" << std::endl;
return 1;
}
const auto font = cv::FONT_HERSHEY_DUPLEX;
const auto blue = cv::Scalar{ 255, 0, 0}; // B/G/R
const auto green = cv::Scalar{ 0, 255, 0};
const auto coral = cv::Scalar{0x81,0x81,0xF1};
const auto white = cv::Scalar{ 255, 255, 255};
cv::Mat test(cv::Size(480, 160), CV_8UC3, white);
namespace draw = cv::gapi::wip::draw;
std::vector<draw::Prim> prims;
prims.emplace_back(draw::Circle{ // CIRCLE primitive
{400,72}, // Position (a cv::Point)
32, // Radius
coral, // Color
cv::FILLED, // Thickness/fill type
cv::LINE_8, // Line type
0 // Shift
});
prims.emplace_back(draw::Text{ // TEXT primitive
"Hello from G-API!", // Text
{64,96}, // Position (a cv::Point)
font, // Font
1.0, // Scale (size)
blue, // Color
2, // Thickness
cv::LINE_8, // Line type
false // Bottom left origin flag
});
prims.emplace_back(draw::Rect{ // RECTANGLE primitive
{16,48,400,72}, // Geometry (a cv::Rect)
green, // Color
2, // Thickness
cv::LINE_8, // Line type
0 // Shift
});
prims.emplace_back(draw::Mosaic{ // MOSAIC primitive
{320,96,128,32}, // Geometry (a cv::Rect)
16, // Cell size
0 // Decimation
});
draw::render(test, prims);
cv::imwrite(argv[1], test);
return 0;
}
...@@ -57,28 +57,16 @@ void cv::gapi::wip::draw::cvtNV12ToYUV(const cv::Mat& y, ...@@ -57,28 +57,16 @@ void cv::gapi::wip::draw::cvtNV12ToYUV(const cv::Mat& y,
cv::merge(std::vector<cv::Mat>{y, upsample_uv}, yuv); cv::merge(std::vector<cv::Mat>{y, upsample_uv}, yuv);
} }
namespace cv cv::GMat cv::gapi::wip::draw::render3ch(const cv::GMat& src,
{ const cv::GArray<cv::gapi::wip::draw::Prim>& prims)
namespace detail
{
template<> struct CompileArgTag<cv::gapi::wip::draw::freetype_font>
{
static const char* tag() { return "gapi.freetype_font"; }
};
} // namespace detail
GMat cv::gapi::wip::draw::render3ch(const GMat& src,
const GArray<cv::gapi::wip::draw::Prim>& prims)
{ {
return cv::gapi::wip::draw::GRenderBGR::on(src, prims); return cv::gapi::wip::draw::GRenderBGR::on(src, prims);
} }
std::tuple<GMat, GMat> cv::gapi::wip::draw::renderNV12(const GMat& y, std::tuple<cv::GMat, cv::GMat>
const GMat& uv, cv::gapi::wip::draw::renderNV12(const cv::GMat& y,
const GArray<cv::gapi::wip::draw::Prim>& prims) const cv::GMat& uv,
const cv::GArray<cv::gapi::wip::draw::Prim>& prims)
{ {
return cv::gapi::wip::draw::GRenderNV12::on(y, uv, prims); return cv::gapi::wip::draw::GRenderNV12::on(y, uv, prims);
} }
} // namespace cv
...@@ -23,8 +23,9 @@ namespace gapi { ...@@ -23,8 +23,9 @@ namespace gapi {
namespace ie { namespace ie {
namespace util { namespace util {
// NB: These functions are EXPORTed to make them accessible by the
// test suite only.
GAPI_EXPORTS std::vector<int> to_ocv(const InferenceEngine::SizeVector &dims); GAPI_EXPORTS std::vector<int> to_ocv(const InferenceEngine::SizeVector &dims);
GAPI_EXPORTS cv::Mat to_ocv(InferenceEngine::Blob::Ptr blob); GAPI_EXPORTS cv::Mat to_ocv(InferenceEngine::Blob::Ptr blob);
GAPI_EXPORTS InferenceEngine::Blob::Ptr to_ie(cv::Mat &blob); GAPI_EXPORTS InferenceEngine::Blob::Ptr to_ie(cv::Mat &blob);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment