#define MODULESTR "cv2"
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+
#include <numpy/ndarrayobject.h>
#include "opencv2/core/utils/configuration.private.hpp"
#include "pycompat.hpp"
#include <map>
+#include <type_traits> // std::enable_if
+
#define CV_HAS_CONVERSION_ERROR(x) (((x) == -1) && PyErr_Occurred())
ArgInfo(const char* name_, bool outputarg_) : name(name_), outputarg(outputarg_) {}
private:
- ArgInfo(const ArgInfo&); // = delete
- ArgInfo& operator=(const ArgInfo&); // = delete
+ ArgInfo(const ArgInfo&) = delete;
+ ArgInfo& operator=(const ArgInfo&) = delete;
};
template<typename T, class TEnable = void> // TEnable is used for SFINAE checks
typedef std::vector<UMat> vector_UMat;
typedef std::vector<DMatch> vector_DMatch;
typedef std::vector<String> vector_String;
+typedef std::vector<std::string> vector_string;
typedef std::vector<Scalar> vector_Scalar;
typedef std::vector<std::vector<char> > vector_vector_char;
return u;
}
- UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, int flags, UMatUsageFlags usageFlags) const CV_OVERRIDE
+ UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, AccessFlag flags, UMatUsageFlags usageFlags) const CV_OVERRIDE
{
if( data != 0 )
{
return allocate(o, dims0, sizes, type, step);
}
- bool allocate(UMatData* u, int accessFlags, UMatUsageFlags usageFlags) const CV_OVERRIDE
+ bool allocate(UMatData* u, AccessFlag accessFlags, UMatUsageFlags usageFlags) const CV_OVERRIDE
{
return stdAllocator->allocate(u, accessFlags, usageFlags);
}
return !CV_HAS_CONVERSION_ERROR(value);
}
+// There is conflict between "size_t" and "unsigned int".
+// They are the same type on some 32-bit platforms.
+template<typename T>
+struct PyOpenCV_Converter
+ < T, typename std::enable_if< std::is_same<unsigned int, T>::value && !std::is_same<unsigned int, size_t>::value >::type >
+{
+ static inline PyObject* from(const unsigned int& value)
+ {
+ return PyLong_FromUnsignedLong(value);
+ }
+
+ static inline bool to(PyObject* obj, unsigned int& value, const ArgInfo& info)
+ {
+ CV_UNUSED(info);
+ if(!obj || obj == Py_None)
+ return true;
+ if(PyInt_Check(obj))
+ value = (unsigned int)PyInt_AsLong(obj);
+ else if(PyLong_Check(obj))
+ value = (unsigned int)PyLong_AsLong(obj);
+ else
+ return false;
+ return value != (unsigned int)-1 || !PyErr_Occurred();
+ }
+};
+
template<>
PyObject* pyopencv_from(const uchar& value)
{
break;
}
}
+ if (i != n)
+ {
+ failmsg("Can't convert vector element for '%s', index=%d", info.name, i);
+ }
return i == n;
}
+ failmsg("Can't convert object to vector for '%s', unsupported type", info.name);
return false;
}
return seq;
}
+template<std::size_t I = 0, typename... Tp>
+inline typename std::enable_if<I == sizeof...(Tp), void>::type
+convert_to_python_tuple(const std::tuple<Tp...>&, PyObject*) { }
+
+template<std::size_t I = 0, typename... Tp>
+inline typename std::enable_if<I < sizeof...(Tp), void>::type
+convert_to_python_tuple(const std::tuple<Tp...>& cpp_tuple, PyObject* py_tuple)
+{
+ PyObject* item = pyopencv_from(std::get<I>(cpp_tuple));
+
+ if (!item)
+ return;
+
+ PyTuple_SetItem(py_tuple, I, item);
+ convert_to_python_tuple<I + 1, Tp...>(cpp_tuple, py_tuple);
+}
+
+
+template<typename... Ts>
+PyObject* pyopencv_from(const std::tuple<Ts...>& cpp_tuple)
+{
+ size_t size = sizeof...(Ts);
+ PyObject* py_tuple = PyTuple_New(size);
+ convert_to_python_tuple(cpp_tuple, py_tuple);
+ size_t actual_size = PyTuple_Size(py_tuple);
+
+ if (actual_size < size)
+ {
+ Py_DECREF(py_tuple);
+ return NULL;
+ }
+
+ return py_tuple;
+}
+
template<>
PyObject* pyopencv_from(const std::pair<int, double>& src)
{
#include "pyopencv_generated_enums.h"
-#include "pyopencv_custom_headers.h"
#ifdef CVPY_DYNAMIC_INIT
#define CVPY_TYPE(NAME, STORAGE, SNAME, _1, _2) CVPY_TYPE_DECLARE_DYNAMIC(NAME, STORAGE, SNAME)
#endif
#include "pyopencv_generated_types.h"
#undef CVPY_TYPE
+#include "pyopencv_custom_headers.h"
#include "pyopencv_generated_types_content.h"
#include "pyopencv_generated_funcs.h"
{"dnn_registerLayer", CV_PY_FN_WITH_KW(pyopencv_cv_dnn_registerLayer), "registerLayer(type, class) -> None"},
{"dnn_unregisterLayer", CV_PY_FN_WITH_KW(pyopencv_cv_dnn_unregisterLayer), "unregisterLayer(type) -> None"},
#endif
+#ifdef HAVE_OPENCV_GAPI
+ {"GIn", CV_PY_FN_WITH_KW(pyopencv_cv_GIn), "GIn(...) -> GInputProtoArgs"},
+ {"GOut", CV_PY_FN_WITH_KW(pyopencv_cv_GOut), "GOut(...) -> GOutputProtoArgs"},
+ {"gin", CV_PY_FN_WITH_KW(pyopencv_cv_gin), "gin(...) -> GRunArgs"},
+#endif
{NULL, NULL},
};