123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- // 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-2020 Intel Corporation
- #ifndef OPENCV_GAPI_GCOMPILED_HPP
- #define OPENCV_GAPI_GCOMPILED_HPP
- #include <vector>
- #include <opencv2/gapi/opencv_includes.hpp>
- #include <opencv2/gapi/own/assert.hpp>
- #include <opencv2/gapi/garg.hpp>
- namespace cv {
- // This class represents a compiled computation.
- // In theory (and ideally), it can be used w/o the rest of APIs.
- // In theory (and ideally), it can be serialized/deserialized.
- // It can enable scenarious like deployment to an autonomous devince, FuSa, etc.
- //
- // Currently GCompiled assumes all GMats you used to pass data to G-API
- // are valid and not destroyed while you use a GCompiled object.
- //
- // FIXME: In future, there should be a way to name I/O objects and specify it
- // to GCompiled externally (for example, when it is loaded on the target system).
- /**
- * \addtogroup gapi_main_classes
- * @{
- */
- /**
- * @brief Represents a compiled computation (graph). Can only be used
- * with image / data formats & resolutions it was compiled for, with
- * some exceptions.
- *
- * This class represents a product of graph compilation (calling
- * cv::GComputation::compile()). Objects of this class actually do
- * data processing, and graph execution is incapsulated into objects
- * of this class. Execution model itself depends on kernels and
- * backends which were using during the compilation, see @ref
- * gapi_compile_args for details.
- *
- * In a general case, GCompiled objects can be applied to data only in
- * that formats/resolutions they were compiled for (see @ref
- * gapi_meta_args). However, if the underlying backends allow, a
- * compiled object can be _reshaped_ to handle data (images) of
- * different resolution, though formats and types must remain the same.
- *
- * GCompiled is very similar to `std::function<>` in its semantics --
- * running it looks like a function call in the user code.
- *
- * At the moment, GCompiled objects are not reentrant -- generally,
- * the objects are stateful since graph execution itself is a stateful
- * process and this state is now maintained in GCompiled's own memory
- * (not on the process stack).
- *
- * At the same time, two different GCompiled objects produced from the
- * single cv::GComputation are completely independent and can be used
- * concurrently.
- *
- * @sa GStreamingCompiled
- */
- class GAPI_EXPORTS GCompiled
- {
- public:
- /// @private
- class GAPI_EXPORTS Priv;
- /**
- * @brief Constructs an empty object
- */
- GCompiled();
- /**
- * @brief Run the compiled computation, a generic version.
- *
- * @param ins vector of inputs to process.
- * @param outs vector of outputs to produce.
- *
- * Input/output vectors must have the same number of elements as
- * defined in the cv::GComputation protocol (at the moment of its
- * construction). Shapes of elements also must conform to protocol
- * (e.g. cv::Mat needs to be passed where cv::GMat has been
- * declared as input, and so on). Run-time exception is generated
- * otherwise.
- *
- * Objects in output vector may remain empty (like cv::Mat) --
- * G-API will automatically initialize output objects to proper formats.
- *
- * @note Don't construct GRunArgs/GRunArgsP objects manually, use
- * cv::gin()/cv::gout() wrappers instead.
- */
- void operator() (GRunArgs &&ins, GRunArgsP &&outs); // Generic arg-to-arg
- #if !defined(GAPI_STANDALONE)
- /**
- * @brief Execute an unary computation
- *
- * @overload
- * @param in input cv::Mat for unary computation
- * @param out output cv::Mat for unary computation
- * process.
- */
- void operator() (cv::Mat in, cv::Mat &out); // Unary overload
- /**
- * @brief Execute an unary computation
- *
- * @overload
- * @param in input cv::Mat for unary computation
- * @param out output cv::Scalar for unary computation
- * process.
- */
- void operator() (cv::Mat in, cv::Scalar &out); // Unary overload (scalar)
- /**
- * @brief Execute a binary computation
- *
- * @overload
- * @param in1 first input cv::Mat for binary computation
- * @param in2 second input cv::Mat for binary computation
- * @param out output cv::Mat for binary computation
- * process.
- */
- void operator() (cv::Mat in1, cv::Mat in2, cv::Mat &out); // Binary overload
- /**
- * @brief Execute an binary computation
- *
- * @overload
- * @param in1 first input cv::Mat for binary computation
- * @param in2 second input cv::Mat for binary computation
- * @param out output cv::Scalar for binary computation
- * process.
- */
- void operator() (cv::Mat in1, cv::Mat in2, cv::Scalar &out); // Binary overload (scalar)
- /**
- * @brief Execute a computation with arbitrary number of
- * inputs/outputs.
- *
- * @overload
- * @param ins vector of input cv::Mat objects to process by the
- * computation.
- * @param outs vector of output cv::Mat objects to produce by the
- * computation.
- *
- * Numbers of elements in ins/outs vectors must match numbers of
- * inputs/outputs which were used to define the source GComputation.
- */
- void operator() (const std::vector<cv::Mat> &ins, // Compatibility overload
- const std::vector<cv::Mat> &outs);
- #endif // !defined(GAPI_STANDALONE)
- /// @private
- Priv& priv();
- /**
- * @brief Check if compiled object is valid (non-empty)
- *
- * @return true if the object is runnable (valid), false otherwise
- */
- explicit operator bool () const;
- /**
- * @brief Vector of metadata this graph was compiled for.
- *
- * @return Unless _reshape_ is not supported, return value is the
- * same vector which was passed to cv::GComputation::compile() to
- * produce this compiled object. Otherwise, it is the latest
- * metadata vector passed to reshape() (if that call was
- * successful).
- */
- const GMetaArgs& metas() const; // Meta passed to compile()
- /**
- * @brief Vector of metadata descriptions of graph outputs
- *
- * @return vector with formats/resolutions of graph's output
- * objects, auto-inferred from input metadata vector by
- * operations which form this computation.
- *
- * @note GCompiled objects produced from the same
- * cv::GComputiation graph with different input metas may return
- * different values in this vector.
- */
- const GMetaArgs& outMetas() const;
- /**
- * @brief Check if the underlying backends support reshape or not.
- *
- * @return true if supported, false otherwise.
- */
- bool canReshape() const;
- /**
- * @brief Reshape a compiled graph to support new image
- * resolutions.
- *
- * Throws an exception if an error occurs.
- *
- * @param inMetas new metadata to reshape on. Vector size and
- * metadata shapes must match the computation's protocol.
- * @param args compilation arguments to use.
- */
- // FIXME: Why it requires compile args?
- void reshape(const GMetaArgs& inMetas, const GCompileArgs& args);
- /**
- * @brief Prepare inner kernels states for a new video-stream.
- *
- * GCompiled objects may be used to process video streams frame by frame.
- * In this case, a GCompiled is called on every image frame individually.
- * Starting OpenCV 4.4, some kernels in the graph may have their internal
- * states (see GAPI_OCV_KERNEL_ST for the OpenCV backend).
- * In this case, if user starts processing another video stream with
- * this GCompiled, this method needs to be called to let kernels re-initialize
- * their internal states to a new video stream.
- */
- void prepareForNewStream();
- protected:
- /// @private
- std::shared_ptr<Priv> m_priv;
- };
- /** @} */
- }
- #endif // OPENCV_GAPI_GCOMPILED_HPP
|