mirror of
https://gitcode.com/gh_mirrors/ope/OpenFace.git
synced 2026-07-28 15:07:46 +00:00
* Travis OpenCV4 update, testing Ubuntu with new OpenCV * Fix to Ubuntu travis * Another attempt at OpenCV 4.0 for Ubuntu * And another OpenCV attempt. * Simplifying the travis script * Ubuntu OpenCV 4 support. * Updating to OpenCV 4, for x64 windows. * Fixes to move to OpenCV 4 on windows. * Travis fix for OpenCV 4 on OSX * Renaming a lib. * Travis opencv4 fix. * Building OpenCV4 versions using appveyor. * Attempt mac travis fix. * Small travis fix. * Travis fix attempt. * First iteration in boost removal and upgrade to C++17 * Test with ocv 4.0 * Moving filesystem out of stdafx * Some more boost testing with cmake. * More CMAKE options * More compiler flag changes * Another attempt at compiler options. * Another attempt. * More filesystem stuff. * Linking to filesystem. * Cmake fix with target linking. * Attempting travis with g++-8 * Attempting to setup g++8 on travis linux. * Another travis change. * Adding OpenBLAS to travis and removing g++-8 * Fixing typo * More travis experiments. * More travis debugging. * A small directory change. * Adding some more travis changes. * travis typo fix. * Some reordering of travis, for cleaner yml * Removing `using namespace std` in order to avoid clash with byte and to make the code more consistent. * Working towards removing std::filesystem requirement, allow boost::filesystem as well. * Making boost an optional dependency * Fixing std issue. * Fixing cmake issue. * Fixing the precompiled header issue. * Another cmake boost fix. * Including missing files. * Removing unnecessary includes. * Removing more includes. * Changes to appveyor build, proper removal of VS2015 * If boost is present, do not need to link to filesystem. * Removing un-needed link library. * oops * Mac attempt at opencv4 travis. * Upgrading OCV to 4.1 on VS2018 * Downloading OpenCV binaries through a script * Triger an appveyor build. * Upgrading VS version. * Attempting VS2017 build * Adding win-32 libraries for OpenCV 4.1 * Adding OpenCV 32 bit libraries.
252 lines
8.6 KiB
C++
252 lines
8.6 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
|
|
|
|
|
|
#ifndef OPENCV_GAPI_GARRAY_HPP
|
|
#define OPENCV_GAPI_GARRAY_HPP
|
|
|
|
#include <functional>
|
|
#include <ostream>
|
|
#include <vector>
|
|
#include <memory>
|
|
|
|
#include <opencv2/gapi/own/exports.hpp>
|
|
#include <opencv2/gapi/opencv_includes.hpp>
|
|
|
|
#include <opencv2/gapi/util/variant.hpp>
|
|
#include <opencv2/gapi/util/throw.hpp>
|
|
#include "opencv2/gapi/own/assert.hpp"
|
|
|
|
namespace cv
|
|
{
|
|
// Forward declaration; GNode and GOrigin are an internal
|
|
// (user-inaccessible) classes.
|
|
class GNode;
|
|
struct GOrigin;
|
|
|
|
template<typename T> class GArray;
|
|
|
|
/**
|
|
* \addtogroup gapi_meta_args
|
|
* @{
|
|
*/
|
|
struct GArrayDesc
|
|
{
|
|
// FIXME: Body
|
|
// FIXME: Also implement proper operator== then
|
|
bool operator== (const GArrayDesc&) const { return true; }
|
|
};
|
|
template<typename U> GArrayDesc descr_of(const std::vector<U> &) { return {};}
|
|
static inline GArrayDesc empty_array_desc() {return {}; }
|
|
/** @} */
|
|
|
|
std::ostream& operator<<(std::ostream& os, const cv::GArrayDesc &desc);
|
|
|
|
namespace detail
|
|
{
|
|
// ConstructVec is a callback which stores information about T and is used by
|
|
// G-API runtime to construct arrays in host memory (T remains opaque for G-API).
|
|
// ConstructVec is carried into G-API internals by GArrayU.
|
|
// Currently it is suitable for Host (CPU) plugins only, real offload may require
|
|
// more information for manual memory allocation on-device.
|
|
class VectorRef;
|
|
using ConstructVec = std::function<void(VectorRef&)>;
|
|
|
|
|
|
// This class strips type information from GArray<T> and makes it usable
|
|
// in the G-API graph compiler (expression unrolling, graph generation, etc).
|
|
// Part of GProtoArg.
|
|
class GAPI_EXPORTS GArrayU
|
|
{
|
|
public:
|
|
GArrayU(const GNode &n, std::size_t out); // Operation result constructor
|
|
|
|
GOrigin& priv(); // Internal use only
|
|
const GOrigin& priv() const; // Internal use only
|
|
|
|
protected:
|
|
GArrayU(); // Default constructor
|
|
template<class> friend class cv::GArray; // (avialable to GArray<T> only)
|
|
|
|
void setConstructFcn(ConstructVec &&cv); // Store T-aware constructor
|
|
|
|
std::shared_ptr<GOrigin> m_priv;
|
|
};
|
|
|
|
// This class represents a typed STL vector reference.
|
|
// Depending on origins, this reference may be either "just a" reference to
|
|
// an object created externally, OR actually own the underlying object
|
|
// (be value holder).
|
|
class BasicVectorRef
|
|
{
|
|
public:
|
|
std::size_t m_elemSize = 0ul;
|
|
cv::GArrayDesc m_desc;
|
|
virtual ~BasicVectorRef() {}
|
|
};
|
|
|
|
template<typename T> class VectorRefT: public BasicVectorRef
|
|
{
|
|
using empty_t = util::monostate;
|
|
using ro_ext_t = const std::vector<T> *;
|
|
using rw_ext_t = std::vector<T> *;
|
|
using rw_own_t = std::vector<T> ;
|
|
util::variant<empty_t, ro_ext_t, rw_ext_t, rw_own_t> m_ref;
|
|
|
|
inline bool isEmpty() const { return util::holds_alternative<empty_t>(m_ref); }
|
|
inline bool isROExt() const { return util::holds_alternative<ro_ext_t>(m_ref); }
|
|
inline bool isRWExt() const { return util::holds_alternative<rw_ext_t>(m_ref); }
|
|
inline bool isRWOwn() const { return util::holds_alternative<rw_own_t>(m_ref); }
|
|
|
|
void init(const std::vector<T>* vec = nullptr)
|
|
{
|
|
m_elemSize = sizeof(T);
|
|
if (vec) m_desc = cv::descr_of(*vec);
|
|
}
|
|
|
|
public:
|
|
VectorRefT() { init(); }
|
|
virtual ~VectorRefT() {}
|
|
|
|
explicit VectorRefT(const std::vector<T>& vec) : m_ref(&vec) { init(&vec); }
|
|
explicit VectorRefT(std::vector<T>& vec) : m_ref(&vec) { init(&vec); }
|
|
explicit VectorRefT(std::vector<T>&& vec) : m_ref(std::move(vec)) { init(&vec); }
|
|
|
|
// Reset a VectorRefT. Called only for objects instantiated
|
|
// internally in G-API (e.g. temporary GArray<T>'s within a
|
|
// computation). Reset here means both initialization
|
|
// (creating an object) and reset (discarding its existing
|
|
// content before the next execution). Must never be called
|
|
// for external VectorRefTs.
|
|
void reset()
|
|
{
|
|
if (isEmpty())
|
|
{
|
|
std::vector<T> empty_vector;
|
|
m_desc = cv::descr_of(empty_vector);
|
|
m_ref = std::move(empty_vector);
|
|
GAPI_Assert(isRWOwn());
|
|
}
|
|
else if (isRWOwn())
|
|
{
|
|
util::get<rw_own_t>(m_ref).clear();
|
|
}
|
|
else GAPI_Assert(false); // shouldn't be called in *EXT modes
|
|
}
|
|
|
|
// Obtain a WRITE reference to underlying object
|
|
// Used by CPU kernel API wrappers when a kernel execution frame
|
|
// is created
|
|
std::vector<T>& wref()
|
|
{
|
|
GAPI_Assert(isRWExt() || isRWOwn());
|
|
if (isRWExt()) return *util::get<rw_ext_t>(m_ref);
|
|
if (isRWOwn()) return util::get<rw_own_t>(m_ref);
|
|
util::throw_error(std::logic_error("Impossible happened"));
|
|
}
|
|
|
|
// Obtain a READ reference to underlying object
|
|
// Used by CPU kernel API wrappers when a kernel execution frame
|
|
// is created
|
|
const std::vector<T>& rref() const
|
|
{
|
|
// ANY vector can be accessed for reading, even if it declared for
|
|
// output. Example -- a GComputation from [in] to [out1,out2]
|
|
// where [out2] is a result of operation applied to [out1]:
|
|
//
|
|
// GComputation boundary
|
|
// . . . . . . .
|
|
// . .
|
|
// [in] ----> foo() ----> [out1]
|
|
// . . :
|
|
// . . . .:. . .
|
|
// . V .
|
|
// . bar() ---> [out2]
|
|
// . . . . . . . . . . . .
|
|
//
|
|
if (isROExt()) return *util::get<ro_ext_t>(m_ref);
|
|
if (isRWExt()) return *util::get<rw_ext_t>(m_ref);
|
|
if (isRWOwn()) return util::get<rw_own_t>(m_ref);
|
|
util::throw_error(std::logic_error("Impossible happened"));
|
|
}
|
|
};
|
|
|
|
// This class strips type information from VectorRefT<> and makes it usable
|
|
// in the G-API executables (carrying run-time data/information to kernels).
|
|
// Part of GRunArg.
|
|
// Its methods are typed proxies to VectorRefT<T>.
|
|
// VectorRef maintains "reference" semantics so two copies of VectoRef refer
|
|
// to the same underlying object.
|
|
// FIXME: Put a good explanation on why cv::OutputArray doesn't fit this role
|
|
class VectorRef
|
|
{
|
|
std::shared_ptr<BasicVectorRef> m_ref;
|
|
|
|
template<typename T> inline void check() const
|
|
{
|
|
GAPI_DbgAssert(dynamic_cast<VectorRefT<T>*>(m_ref.get()) != nullptr);
|
|
GAPI_Assert(sizeof(T) == m_ref->m_elemSize);
|
|
}
|
|
|
|
public:
|
|
VectorRef() = default;
|
|
template<typename T> explicit VectorRef(const std::vector<T>& vec) : m_ref(new VectorRefT<T>(vec)) {}
|
|
template<typename T> explicit VectorRef(std::vector<T>& vec) : m_ref(new VectorRefT<T>(vec)) {}
|
|
template<typename T> explicit VectorRef(std::vector<T>&& vec) : m_ref(new VectorRefT<T>(vec)) {}
|
|
|
|
template<typename T> void reset()
|
|
{
|
|
if (!m_ref) m_ref.reset(new VectorRefT<T>());
|
|
|
|
check<T>();
|
|
static_cast<VectorRefT<T>&>(*m_ref).reset();
|
|
}
|
|
|
|
template<typename T> std::vector<T>& wref()
|
|
{
|
|
check<T>();
|
|
return static_cast<VectorRefT<T>&>(*m_ref).wref();
|
|
}
|
|
|
|
template<typename T> const std::vector<T>& rref() const
|
|
{
|
|
check<T>();
|
|
return static_cast<VectorRefT<T>&>(*m_ref).rref();
|
|
}
|
|
|
|
cv::GArrayDesc descr_of() const
|
|
{
|
|
return m_ref->m_desc;
|
|
}
|
|
};
|
|
} // namespace detail
|
|
|
|
/** \addtogroup gapi_data_objects
|
|
* @{
|
|
*/
|
|
|
|
template<typename T> class GArray
|
|
{
|
|
public:
|
|
GArray() { putDetails(); } // Empty constructor
|
|
explicit GArray(detail::GArrayU &&ref) // GArrayU-based constructor
|
|
: m_ref(ref) { putDetails(); } // (used by GCall, not for users)
|
|
|
|
detail::GArrayU strip() const { return m_ref; }
|
|
|
|
private:
|
|
static void VCTor(detail::VectorRef& vref) { vref.reset<T>(); }
|
|
void putDetails() {m_ref.setConstructFcn(&VCTor); }
|
|
|
|
detail::GArrayU m_ref;
|
|
};
|
|
|
|
/** @} */
|
|
|
|
} // namespace cv
|
|
|
|
#endif // OPENCV_GAPI_GARRAY_HPP
|