1 //warning number '5033' not a valid compiler warning in vc12
2 #if defined(_MSC_VER) && (_MSC_VER > 1800)
3 // eliminating duplicated round() declaration
6 #pragma warning(disable:5033) // 'register' is no longer a supported storage class
9 // #define CVPY_DYNAMIC_INIT
12 #if defined(CVPY_DYNAMIC_INIT) && !defined(Py_DEBUG)
13 # define Py_LIMITED_API 0x03030000
20 #if PY_MAJOR_VERSION < 3
21 #undef CVPY_DYNAMIC_INIT
26 #if defined(_MSC_VER) && (_MSC_VER > 1800)
30 #define MODULESTR "cv2"
31 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
33 #include <numpy/ndarrayobject.h>
35 #include "opencv2/core/utils/configuration.private.hpp"
36 #include "opencv2/core/utils/logger.hpp"
37 #include "opencv2/core/utils/tls.hpp"
39 #include "pyopencv_generated_include.h"
40 #include "opencv2/core/types_c.h"
41 #include "opencv2/opencv_modules.hpp"
42 #include "pycompat.hpp"
45 #include <type_traits> // std::enable_if
47 #define CV_HAS_CONVERSION_ERROR(x) (((x) == -1) && PyErr_Occurred())
55 // more fields may be added if necessary
57 ArgInfo(const char* name_, bool outputarg_) : name(name_), outputarg(outputarg_) {}
60 ArgInfo(const ArgInfo&) = delete;
61 ArgInfo& operator=(const ArgInfo&) = delete;
64 template<typename T, class TEnable = void> // TEnable is used for SFINAE checks
65 struct PyOpenCV_Converter
67 //static inline bool to(PyObject* obj, T& p, const ArgInfo& info);
68 //static inline PyObject* from(const T& src);
71 template<typename T> static
72 bool pyopencv_to(PyObject* obj, T& p, const ArgInfo& info) { return PyOpenCV_Converter<T>::to(obj, p, info); }
74 template<typename T> static
75 PyObject* pyopencv_from(const T& src) { return PyOpenCV_Converter<T>::from(src); }
77 static PyObject* opencv_error = NULL;
79 static bool isPythonBindingsDebugEnabled()
81 static bool param_debug = cv::utils::getConfigurationParameterBool("OPENCV_PYTHON_DEBUG", false);
85 static void emit_failmsg(PyObject * exc, const char *msg)
87 static bool param_debug = isPythonBindingsDebugEnabled();
90 CV_LOG_WARNING(NULL, "Bindings conversion failed: " << msg);
92 PyErr_SetString(exc, msg);
95 static int failmsg(const char *fmt, ...)
101 vsnprintf(str, sizeof(str), fmt, ap);
104 emit_failmsg(PyExc_TypeError, str);
108 static PyObject* failmsgp(const char *fmt, ...)
114 vsnprintf(str, sizeof(str), fmt, ap);
117 emit_failmsg(PyExc_TypeError, str);
124 PyAllowThreads() : _state(PyEval_SaveThread()) {}
127 PyEval_RestoreThread(_state);
130 PyThreadState* _state;
136 PyEnsureGIL() : _state(PyGILState_Ensure()) {}
139 PyGILState_Release(_state);
142 PyGILState_STATE _state;
146 * Light weight RAII wrapper for `PyObject*` owning references.
147 * In comparisson to C++11 `std::unique_ptr` with custom deleter, it provides
148 * implicit conversion functions that might be useful to initialize it with
149 * Python functions those returns owning references through the `PyObject**`
150 * e.g. `PyErr_Fetch` or directly pass it to functions those want to borrow
151 * reference to object (doesn't extend object lifetime) e.g. `PyObject_Str`.
156 PySafeObject() : obj_(NULL) {}
158 explicit PySafeObject(PyObject* obj) : obj_(obj) {}
170 operator PyObject**()
177 PyObject* obj = obj_;
185 // Explicitly disable copy operations
186 PySafeObject(const PySafeObject*); // = delete
187 PySafeObject& operator=(const PySafeObject&); // = delete
190 static void pyRaiseCVException(const cv::Exception &e)
192 PyObject_SetAttrString(opencv_error, "file", PyString_FromString(e.file.c_str()));
193 PyObject_SetAttrString(opencv_error, "func", PyString_FromString(e.func.c_str()));
194 PyObject_SetAttrString(opencv_error, "line", PyInt_FromLong(e.line));
195 PyObject_SetAttrString(opencv_error, "code", PyInt_FromLong(e.code));
196 PyObject_SetAttrString(opencv_error, "msg", PyString_FromString(e.msg.c_str()));
197 PyObject_SetAttrString(opencv_error, "err", PyString_FromString(e.err.c_str()));
198 PyErr_SetString(opencv_error, e.what());
201 #define ERRWRAP2(expr) \
204 PyAllowThreads allowThreads; \
207 catch (const cv::Exception &e) \
209 pyRaiseCVException(e); \
218 NPY_TYPES asNumpyType()
224 NPY_TYPES asNumpyType<bool>()
229 #define CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION(src, dst) \
231 NPY_TYPES asNumpyType<src>() \
236 NPY_TYPES asNumpyType<u##src>() \
241 CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION(int8_t, INT8);
243 CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION(int16_t, INT16);
245 CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION(int32_t, INT32);
247 CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION(int64_t, INT64);
249 #undef CV_GENERATE_INTEGRAL_TYPE_NPY_CONVERSION
252 NPY_TYPES asNumpyType<float>()
258 NPY_TYPES asNumpyType<double>()
264 PyArray_Descr* getNumpyTypeDescriptor()
266 return PyArray_DescrFromType(asNumpyType<T>());
270 PyArray_Descr* getNumpyTypeDescriptor<size_t>()
272 #if SIZE_MAX == ULONG_MAX
273 return PyArray_DescrFromType(NPY_ULONG);
274 #elif SIZE_MAX == ULLONG_MAX
275 return PyArray_DescrFromType(NPY_ULONGLONG);
277 return PyArray_DescrFromType(NPY_UINT);
281 template <class T, class U>
282 bool isRepresentable(U value) {
283 return (std::numeric_limits<T>::min() <= value) && (value <= std::numeric_limits<T>::max());
287 bool canBeSafelyCasted(PyObject* obj, PyArray_Descr* to)
289 return PyArray_CanCastTo(PyArray_DescrFromScalar(obj), to) != 0;
294 bool canBeSafelyCasted<size_t>(PyObject* obj, PyArray_Descr* to)
296 PyArray_Descr* from = PyArray_DescrFromScalar(obj);
297 if (PyArray_CanCastTo(from, to))
303 // False negative scenarios:
304 // - Signed input is positive so it can be safely cast to unsigned output
305 // - Input has wider limits but value is representable within output limits
307 if (PyDataType_ISSIGNED(from))
310 PyArray_CastScalarToCtype(obj, &input, getNumpyTypeDescriptor<int64_t>());
311 return (input >= 0) && isRepresentable<size_t>(static_cast<uint64_t>(input));
316 PyArray_CastScalarToCtype(obj, &input, getNumpyTypeDescriptor<uint64_t>());
317 return isRepresentable<size_t>(input);
325 bool parseNumpyScalar(PyObject* obj, T& value)
327 if (PyArray_CheckScalar(obj))
329 // According to the numpy documentation:
330 // There are 21 statically-defined PyArray_Descr objects for the built-in data-types
331 // So descriptor pointer is not owning.
332 PyArray_Descr* to = getNumpyTypeDescriptor<T>();
333 if (canBeSafelyCasted<T>(obj, to))
335 PyArray_CastScalarToCtype(obj, &value, to);
342 TLSData<std::vector<std::string> > conversionErrorsTLS;
344 inline void pyPrepareArgumentConversionErrorsStorage(std::size_t size)
346 std::vector<std::string>& conversionErrors = conversionErrorsTLS.getRef();
347 conversionErrors.clear();
348 conversionErrors.reserve(size);
351 void pyRaiseCVOverloadException(const std::string& functionName)
353 const std::vector<std::string>& conversionErrors = conversionErrorsTLS.getRef();
354 const std::size_t conversionErrorsCount = conversionErrors.size();
355 if (conversionErrorsCount > 0)
357 // In modern std libraries small string optimization is used = no dynamic memory allocations,
358 // but it can be applied only for string with length < 18 symbols (in GCC)
359 const std::string bullet = "\n - ";
361 // Estimate required buffer size - save dynamic memory allocations = faster
362 std::size_t requiredBufferSize = bullet.size() * conversionErrorsCount;
363 for (std::size_t i = 0; i < conversionErrorsCount; ++i)
365 requiredBufferSize += conversionErrors[i].size();
368 // Only string concatenation is required so std::string is way faster than
369 // std::ostringstream
370 std::string errorMessage("Overload resolution failed:");
371 errorMessage.reserve(errorMessage.size() + requiredBufferSize);
372 for (std::size_t i = 0; i < conversionErrorsCount; ++i)
374 errorMessage += bullet;
375 errorMessage += conversionErrors[i];
377 cv::Exception exception(CV_StsBadArg, errorMessage, functionName, "", -1);
378 pyRaiseCVException(exception);
382 cv::Exception exception(CV_StsInternal, "Overload resolution failed, but no errors reported",
383 functionName, "", -1);
384 pyRaiseCVException(exception);
388 void pyPopulateArgumentConversionErrors()
390 if (PyErr_Occurred())
392 PySafeObject exception_type;
393 PySafeObject exception_value;
394 PySafeObject exception_traceback;
395 PyErr_Fetch(exception_type, exception_value, exception_traceback);
396 PyErr_NormalizeException(exception_type, exception_value,
397 exception_traceback);
399 PySafeObject exception_message(PyObject_Str(exception_value));
401 getUnicodeString(exception_message, message);
403 conversionErrorsTLS.getRef().push_back(std::move(message));
405 conversionErrorsTLS.getRef().push_back(message);
413 SafeSeqItem(PyObject *obj, size_t idx) { item = PySequence_GetItem(obj, idx); }
414 ~SafeSeqItem() { Py_XDECREF(item); }
417 SafeSeqItem(const SafeSeqItem&); // = delete
418 SafeSeqItem& operator=(const SafeSeqItem&); // = delete
425 RefWrapper(T& item) : item_(item) {}
427 T& get() CV_NOEXCEPT { return item_; }
433 // In order to support this conversion on 3.x branch - use custom reference_wrapper
434 // and C-style array instead of std::array<T, N>
435 template <class T, std::size_t N>
436 bool parseSequence(PyObject* obj, RefWrapper<T> (&value)[N], const ArgInfo& info)
438 if (!obj || obj == Py_None)
442 if (!PySequence_Check(obj))
444 failmsg("Can't parse '%s'. Input argument doesn't provide sequence "
445 "protocol", info.name);
448 const std::size_t sequenceSize = PySequence_Size(obj);
449 if (sequenceSize != N)
451 failmsg("Can't parse '%s'. Expected sequence length %lu, got %lu",
452 info.name, N, sequenceSize);
455 for (std::size_t i = 0; i < N; ++i)
457 SafeSeqItem seqItem(obj, i);
458 if (!pyopencv_to(seqItem.item, value[i].get(), info))
460 failmsg("Can't parse '%s'. Sequence item with index %lu has a "
461 "wrong type", info.name, i);
469 typedef std::vector<uchar> vector_uchar;
470 typedef std::vector<char> vector_char;
471 typedef std::vector<int> vector_int;
472 typedef std::vector<float> vector_float;
473 typedef std::vector<double> vector_double;
474 typedef std::vector<size_t> vector_size_t;
475 typedef std::vector<Point> vector_Point;
476 typedef std::vector<Point2f> vector_Point2f;
477 typedef std::vector<Point3f> vector_Point3f;
478 typedef std::vector<Size> vector_Size;
479 typedef std::vector<Vec2f> vector_Vec2f;
480 typedef std::vector<Vec3f> vector_Vec3f;
481 typedef std::vector<Vec4f> vector_Vec4f;
482 typedef std::vector<Vec6f> vector_Vec6f;
483 typedef std::vector<Vec4i> vector_Vec4i;
484 typedef std::vector<Rect> vector_Rect;
485 typedef std::vector<Rect2d> vector_Rect2d;
486 typedef std::vector<RotatedRect> vector_RotatedRect;
487 typedef std::vector<KeyPoint> vector_KeyPoint;
488 typedef std::vector<Mat> vector_Mat;
489 typedef std::vector<std::vector<Mat> > vector_vector_Mat;
490 typedef std::vector<UMat> vector_UMat;
491 typedef std::vector<DMatch> vector_DMatch;
492 typedef std::vector<String> vector_String;
493 typedef std::vector<std::string> vector_string;
494 typedef std::vector<Scalar> vector_Scalar;
496 typedef std::vector<std::vector<char> > vector_vector_char;
497 typedef std::vector<std::vector<Point> > vector_vector_Point;
498 typedef std::vector<std::vector<Point2f> > vector_vector_Point2f;
499 typedef std::vector<std::vector<Point3f> > vector_vector_Point3f;
500 typedef std::vector<std::vector<DMatch> > vector_vector_DMatch;
501 typedef std::vector<std::vector<KeyPoint> > vector_vector_KeyPoint;
503 class NumpyAllocator : public MatAllocator
506 NumpyAllocator() { stdAllocator = Mat::getStdAllocator(); }
509 UMatData* allocate(PyObject* o, int dims, const int* sizes, int type, size_t* step) const
511 UMatData* u = new UMatData(this);
512 u->data = u->origdata = (uchar*)PyArray_DATA((PyArrayObject*) o);
513 npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
514 for( int i = 0; i < dims - 1; i++ )
515 step[i] = (size_t)_strides[i];
516 step[dims-1] = CV_ELEM_SIZE(type);
517 u->size = sizes[0]*step[0];
522 UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, AccessFlag flags, UMatUsageFlags usageFlags) const CV_OVERRIDE
526 // issue #6969: CV_Error(Error::StsAssert, "The data should normally be NULL!");
527 // probably this is safe to do in such extreme case
528 return stdAllocator->allocate(dims0, sizes, type, data, step, flags, usageFlags);
532 int depth = CV_MAT_DEPTH(type);
533 int cn = CV_MAT_CN(type);
534 const int f = (int)(sizeof(size_t)/8);
535 int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
536 depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
537 depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
538 depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
540 cv::AutoBuffer<npy_intp> _sizes(dims + 1);
541 for( i = 0; i < dims; i++ )
542 _sizes[i] = sizes[i];
545 PyObject* o = PyArray_SimpleNew(dims, _sizes.data(), typenum);
547 CV_Error_(Error::StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
548 return allocate(o, dims0, sizes, type, step);
551 bool allocate(UMatData* u, AccessFlag accessFlags, UMatUsageFlags usageFlags) const CV_OVERRIDE
553 return stdAllocator->allocate(u, accessFlags, usageFlags);
556 void deallocate(UMatData* u) const CV_OVERRIDE
561 CV_Assert(u->urefcount >= 0);
562 CV_Assert(u->refcount >= 0);
565 PyObject* o = (PyObject*)u->userdata;
571 const MatAllocator* stdAllocator;
574 NumpyAllocator g_numpyAllocator;
577 enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
579 static bool isBool(PyObject* obj) CV_NOEXCEPT
581 return PyArray_IsScalar(obj, Bool) || PyBool_Check(obj);
584 // special case, when the converter needs full ArgInfo structure
585 static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo& info)
588 if(!o || o == Py_None)
591 m.allocator = &g_numpyAllocator;
597 double v[] = {static_cast<double>(PyInt_AsLong((PyObject*)o)), 0., 0., 0.};
598 m = Mat(4, 1, CV_64F, v).clone();
601 if( PyFloat_Check(o) )
603 double v[] = {PyFloat_AsDouble((PyObject*)o), 0., 0., 0.};
604 m = Mat(4, 1, CV_64F, v).clone();
607 if( PyTuple_Check(o) )
609 int i, sz = (int)PyTuple_Size((PyObject*)o);
610 m = Mat(sz, 1, CV_64F);
611 for( i = 0; i < sz; i++ )
613 PyObject* oi = PyTuple_GetItem(o, i);
614 if( PyInt_Check(oi) )
615 m.at<double>(i) = (double)PyInt_AsLong(oi);
616 else if( PyFloat_Check(oi) )
617 m.at<double>(i) = (double)PyFloat_AsDouble(oi);
620 failmsg("%s is not a numerical tuple", info.name);
628 if( !PyArray_Check(o) )
630 failmsg("%s is not a numpy array, neither a scalar", info.name);
634 PyArrayObject* oarr = (PyArrayObject*) o;
636 bool needcopy = false, needcast = false;
637 int typenum = PyArray_TYPE(oarr), new_typenum = typenum;
638 int type = typenum == NPY_UBYTE ? CV_8U :
639 typenum == NPY_BYTE ? CV_8S :
640 typenum == NPY_USHORT ? CV_16U :
641 typenum == NPY_SHORT ? CV_16S :
642 typenum == NPY_INT ? CV_32S :
643 typenum == NPY_INT32 ? CV_32S :
644 typenum == NPY_FLOAT ? CV_32F :
645 typenum == NPY_DOUBLE ? CV_64F : -1;
649 if( typenum == NPY_INT64 || typenum == NPY_UINT64 || typenum == NPY_LONG )
651 needcopy = needcast = true;
652 new_typenum = NPY_INT;
657 failmsg("%s data type = %d is not supported", info.name, typenum);
663 const int CV_MAX_DIM = 32;
666 int ndims = PyArray_NDIM(oarr);
667 if(ndims >= CV_MAX_DIM)
669 failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
673 int size[CV_MAX_DIM+1];
674 size_t step[CV_MAX_DIM+1];
675 size_t elemsize = CV_ELEM_SIZE1(type);
676 const npy_intp* _sizes = PyArray_DIMS(oarr);
677 const npy_intp* _strides = PyArray_STRIDES(oarr);
678 bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
680 for( int i = ndims-1; i >= 0 && !needcopy; i-- )
682 // these checks handle cases of
683 // a) multi-dimensional (ndims > 2) arrays, as well as simpler 1- and 2-dimensional cases
684 // b) transposed arrays, where _strides[] elements go in non-descending order
685 // c) flipped arrays, where some of _strides[] elements are negative
686 // the _sizes[i] > 1 is needed to avoid spurious copies when NPY_RELAXED_STRIDES is set
687 if( (i == ndims-1 && _sizes[i] > 1 && (size_t)_strides[i] != elemsize) ||
688 (i < ndims-1 && _sizes[i] > 1 && _strides[i] < _strides[i+1]) )
692 if( ismultichannel && _strides[1] != (npy_intp)elemsize*_sizes[2] )
699 failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
704 o = PyArray_Cast(oarr, new_typenum);
705 oarr = (PyArrayObject*) o;
708 oarr = PyArray_GETCONTIGUOUS(oarr);
709 o = (PyObject*) oarr;
712 _strides = PyArray_STRIDES(oarr);
715 // Normalize strides in case NPY_RELAXED_STRIDES is set
716 size_t default_step = elemsize;
717 for ( int i = ndims - 1; i >= 0; --i )
719 size[i] = (int)_sizes[i];
722 step[i] = (size_t)_strides[i];
723 default_step = step[i] * size[i];
727 step[i] = default_step;
728 default_step *= size[i];
732 // handle degenerate case
735 step[ndims] = elemsize;
742 type |= CV_MAKETYPE(0, size[2]);
745 if( ndims > 2 && !allowND )
747 failmsg("%s has more than 2 dimensions", info.name);
751 m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
752 m.u = g_numpyAllocator.allocate(o, ndims, size, type, step);
759 m.allocator = &g_numpyAllocator;
764 template<typename _Tp, int m, int n>
765 bool pyopencv_to(PyObject* o, Matx<_Tp, m, n>& mx, const ArgInfo& info)
768 if (!pyopencv_to(o, tmp, info)) {
776 template<typename _Tp, int cn>
777 bool pyopencv_to(PyObject* o, Vec<_Tp, cn>& vec, const ArgInfo& info)
779 return pyopencv_to(o, (Matx<_Tp, cn, 1>&)vec, info);
783 PyObject* pyopencv_from(const Mat& m)
787 Mat temp, *p = (Mat*)&m;
788 if(!p->u || p->allocator != &g_numpyAllocator)
790 temp.allocator = &g_numpyAllocator;
791 ERRWRAP2(m.copyTo(temp));
794 PyObject* o = (PyObject*)p->u->userdata;
799 template<typename _Tp, int m, int n>
800 PyObject* pyopencv_from(const Matx<_Tp, m, n>& matx)
802 return pyopencv_from(Mat(matx));
806 struct PyOpenCV_Converter< cv::Ptr<T> >
808 static PyObject* from(const cv::Ptr<T>& p)
812 return pyopencv_from(*p);
814 static bool to(PyObject *o, Ptr<T>& p, const ArgInfo& info)
816 if (!o || o == Py_None)
819 return pyopencv_to(o, *p, info);
824 bool pyopencv_to(PyObject* obj, void*& ptr, const ArgInfo& info)
827 if (!obj || obj == Py_None)
830 if (!PyLong_Check(obj))
832 ptr = PyLong_AsVoidPtr(obj);
833 return ptr != NULL && !PyErr_Occurred();
836 static PyObject* pyopencv_from(void*& ptr)
838 return PyLong_FromVoidPtr(ptr);
841 static bool pyopencv_to(PyObject *o, Scalar& s, const ArgInfo& info)
843 if(!o || o == Py_None)
845 if (PySequence_Check(o)) {
846 if (4 < PySequence_Size(o))
848 failmsg("Scalar value for argument '%s' is longer than 4", info.name);
851 for (Py_ssize_t i = 0; i < PySequence_Size(o); i++) {
852 SafeSeqItem item_wrap(o, i);
853 PyObject *item = item_wrap.item;
854 if (PyFloat_Check(item) || PyInt_Check(item)) {
855 s[(int)i] = PyFloat_AsDouble(item);
857 failmsg("Scalar value for argument '%s' is not numeric", info.name);
862 if (PyFloat_Check(o) || PyInt_Check(o)) {
863 s[0] = PyFloat_AsDouble(o);
865 failmsg("Scalar value for argument '%s' is not numeric", info.name);
873 PyObject* pyopencv_from(const Scalar& src)
875 return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
879 PyObject* pyopencv_from(const bool& value)
881 return PyBool_FromLong(value);
885 bool pyopencv_to(PyObject* obj, bool& value, const ArgInfo& info)
887 if (!obj || obj == Py_None)
891 if (isBool(obj) || PyArray_IsIntegerScalar(obj))
893 npy_bool npy_value = NPY_FALSE;
894 const int ret_code = PyArray_BoolConverter(obj, &npy_value);
897 value = (npy_value == NPY_TRUE);
901 failmsg("Argument '%s' is not convertable to bool", info.name);
906 PyObject* pyopencv_from(const size_t& value)
908 return PyLong_FromSize_t(value);
912 bool pyopencv_to(PyObject* obj, size_t& value, const ArgInfo& info)
914 if (!obj || obj == Py_None)
920 failmsg("Argument '%s' must be integer type, not bool", info.name);
923 if (PyArray_IsIntegerScalar(obj))
925 if (PyLong_Check(obj))
927 #if defined(CV_PYTHON_3)
928 value = PyLong_AsSize_t(obj);
930 #if ULONG_MAX == SIZE_MAX
931 value = PyLong_AsUnsignedLong(obj);
933 value = PyLong_AsUnsignedLongLong(obj);
937 #if !defined(CV_PYTHON_3)
938 // Python 2.x has PyIntObject which is not a subtype of PyLongObject
939 // Overflow check here is unnecessary because object will be converted to long on the
941 else if (PyInt_Check(obj))
943 const long res = PyInt_AsLong(obj);
945 failmsg("Argument '%s' can not be safely parsed to 'size_t'", info.name);
948 #if ULONG_MAX == SIZE_MAX
949 value = PyInt_AsUnsignedLongMask(obj);
951 value = PyInt_AsUnsignedLongLongMask(obj);
957 const bool isParsed = parseNumpyScalar<size_t>(obj, value);
959 failmsg("Argument '%s' can not be safely parsed to 'size_t'", info.name);
966 failmsg("Argument '%s' is required to be an integer", info.name);
969 return !PyErr_Occurred();
973 PyObject* pyopencv_from(const int& value)
975 return PyInt_FromLong(value);
979 bool pyopencv_to(PyObject* obj, int& value, const ArgInfo& info)
981 if (!obj || obj == Py_None)
987 failmsg("Argument '%s' must be integer, not bool", info.name);
990 if (PyArray_IsIntegerScalar(obj))
992 value = PyArray_PyIntAsInt(obj);
996 failmsg("Argument '%s' is required to be an integer", info.name);
999 return !CV_HAS_CONVERSION_ERROR(value);
1002 // There is conflict between "size_t" and "unsigned int".
1003 // They are the same type on some 32-bit platforms.
1004 template<typename T>
1005 struct PyOpenCV_Converter
1006 < T, typename std::enable_if< std::is_same<unsigned int, T>::value && !std::is_same<unsigned int, size_t>::value >::type >
1008 static inline PyObject* from(const unsigned int& value)
1010 return PyLong_FromUnsignedLong(value);
1013 static inline bool to(PyObject* obj, unsigned int& value, const ArgInfo& info)
1016 if(!obj || obj == Py_None)
1018 if(PyInt_Check(obj))
1019 value = (unsigned int)PyInt_AsLong(obj);
1020 else if(PyLong_Check(obj))
1021 value = (unsigned int)PyLong_AsLong(obj);
1024 return value != (unsigned int)-1 || !PyErr_Occurred();
1029 PyObject* pyopencv_from(const uchar& value)
1031 return PyInt_FromLong(value);
1035 bool pyopencv_to(PyObject* obj, uchar& value, const ArgInfo& info)
1038 if(!obj || obj == Py_None)
1040 int ivalue = (int)PyInt_AsLong(obj);
1041 value = cv::saturate_cast<uchar>(ivalue);
1042 return ivalue != -1 || !PyErr_Occurred();
1046 PyObject* pyopencv_from(const double& value)
1048 return PyFloat_FromDouble(value);
1052 bool pyopencv_to(PyObject* obj, double& value, const ArgInfo& info)
1054 if (!obj || obj == Py_None)
1060 failmsg("Argument '%s' must be double, not bool", info.name);
1063 if (PyArray_IsPythonNumber(obj))
1065 if (PyLong_Check(obj))
1067 value = PyLong_AsDouble(obj);
1071 value = PyFloat_AsDouble(obj);
1074 else if (PyArray_CheckScalar(obj))
1076 const bool isParsed = parseNumpyScalar<double>(obj, value);
1078 failmsg("Argument '%s' can not be safely parsed to 'double'", info.name);
1084 failmsg("Argument '%s' can not be treated as a double", info.name);
1087 return !PyErr_Occurred();
1091 PyObject* pyopencv_from(const float& value)
1093 return PyFloat_FromDouble(value);
1097 bool pyopencv_to(PyObject* obj, float& value, const ArgInfo& info)
1099 if (!obj || obj == Py_None)
1105 failmsg("Argument '%s' must be float, not bool", info.name);
1108 if (PyArray_IsPythonNumber(obj))
1110 if (PyLong_Check(obj))
1112 double res = PyLong_AsDouble(obj);
1113 value = static_cast<float>(res);
1117 double res = PyFloat_AsDouble(obj);
1118 value = static_cast<float>(res);
1121 else if (PyArray_CheckScalar(obj))
1123 const bool isParsed = parseNumpyScalar<float>(obj, value);
1125 failmsg("Argument '%s' can not be safely parsed to 'float'", info.name);
1131 failmsg("Argument '%s' can't be treated as a float", info.name);
1134 return !PyErr_Occurred();
1138 PyObject* pyopencv_from(const int64& value)
1140 return PyLong_FromLongLong(value);
1144 PyObject* pyopencv_from(const String& value)
1146 return PyString_FromString(value.empty() ? "" : value.c_str());
1149 #if CV_VERSION_MAJOR == 3
1151 PyObject* pyopencv_from(const std::string& value)
1153 return PyString_FromString(value.empty() ? "" : value.c_str());
1158 bool pyopencv_to(PyObject* obj, String &value, const ArgInfo& info)
1160 if(!obj || obj == Py_None)
1165 if (getUnicodeString(obj, str))
1172 // If error hasn't been already set by Python conversion functions
1173 if (!PyErr_Occurred())
1175 // Direct access to underlying slots of PyObjectType is not allowed
1176 // when limited API is enabled
1177 #ifdef Py_LIMITED_API
1178 failmsg("Can't convert object to 'str' for '%s'", info.name);
1180 failmsg("Can't convert object of type '%s' to 'str' for '%s'",
1181 obj->ob_type->tp_name, info.name);
1189 bool pyopencv_to(PyObject* obj, Size& sz, const ArgInfo& info)
1191 RefWrapper<int> values[] = {RefWrapper<int>(sz.width),
1192 RefWrapper<int>(sz.height)};
1193 return parseSequence(obj, values, info);
1197 PyObject* pyopencv_from(const Size& sz)
1199 return Py_BuildValue("(ii)", sz.width, sz.height);
1203 bool pyopencv_to(PyObject* obj, Size_<float>& sz, const ArgInfo& info)
1205 RefWrapper<float> values[] = {RefWrapper<float>(sz.width),
1206 RefWrapper<float>(sz.height)};
1207 return parseSequence(obj, values, info);
1211 PyObject* pyopencv_from(const Size_<float>& sz)
1213 return Py_BuildValue("(ff)", sz.width, sz.height);
1217 bool pyopencv_to(PyObject* obj, Rect& r, const ArgInfo& info)
1219 RefWrapper<int> values[] = {RefWrapper<int>(r.x), RefWrapper<int>(r.y),
1220 RefWrapper<int>(r.width),
1221 RefWrapper<int>(r.height)};
1222 return parseSequence(obj, values, info);
1226 PyObject* pyopencv_from(const Rect& r)
1228 return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
1232 bool pyopencv_to(PyObject* obj, Rect2d& r, const ArgInfo& info)
1234 RefWrapper<double> values[] = {
1235 RefWrapper<double>(r.x), RefWrapper<double>(r.y),
1236 RefWrapper<double>(r.width), RefWrapper<double>(r.height)};
1237 return parseSequence(obj, values, info);
1241 PyObject* pyopencv_from(const Rect2d& r)
1243 return Py_BuildValue("(dddd)", r.x, r.y, r.width, r.height);
1247 bool pyopencv_to(PyObject* obj, Range& r, const ArgInfo& info)
1249 if (!obj || obj == Py_None)
1253 if (PyObject_Size(obj) == 0)
1258 RefWrapper<int> values[] = {RefWrapper<int>(r.start), RefWrapper<int>(r.end)};
1259 return parseSequence(obj, values, info);
1263 PyObject* pyopencv_from(const Range& r)
1265 return Py_BuildValue("(ii)", r.start, r.end);
1269 bool pyopencv_to(PyObject* obj, Point& p, const ArgInfo& info)
1271 RefWrapper<int> values[] = {RefWrapper<int>(p.x), RefWrapper<int>(p.y)};
1272 return parseSequence(obj, values, info);
1276 bool pyopencv_to(PyObject* obj, Point2f& p, const ArgInfo& info)
1278 RefWrapper<float> values[] = {RefWrapper<float>(p.x),
1279 RefWrapper<float>(p.y)};
1280 return parseSequence(obj, values, info);
1284 bool pyopencv_to(PyObject* obj, Point2d& p, const ArgInfo& info)
1286 RefWrapper<double> values[] = {RefWrapper<double>(p.x),
1287 RefWrapper<double>(p.y)};
1288 return parseSequence(obj, values, info);
1292 bool pyopencv_to(PyObject* obj, Point3f& p, const ArgInfo& info)
1294 RefWrapper<float> values[] = {RefWrapper<float>(p.x),
1295 RefWrapper<float>(p.y),
1296 RefWrapper<float>(p.z)};
1297 return parseSequence(obj, values, info);
1301 bool pyopencv_to(PyObject* obj, Point3d& p, const ArgInfo& info)
1303 RefWrapper<double> values[] = {RefWrapper<double>(p.x),
1304 RefWrapper<double>(p.y),
1305 RefWrapper<double>(p.z)};
1306 return parseSequence(obj, values, info);
1310 PyObject* pyopencv_from(const Point& p)
1312 return Py_BuildValue("(ii)", p.x, p.y);
1316 PyObject* pyopencv_from(const Point2f& p)
1318 return Py_BuildValue("(dd)", p.x, p.y);
1322 PyObject* pyopencv_from(const Point3f& p)
1324 return Py_BuildValue("(ddd)", p.x, p.y, p.z);
1327 static bool pyopencv_to(PyObject* obj, Vec4d& v, ArgInfo& info)
1329 RefWrapper<double> values[] = {RefWrapper<double>(v[0]), RefWrapper<double>(v[1]),
1330 RefWrapper<double>(v[2]), RefWrapper<double>(v[3])};
1331 return parseSequence(obj, values, info);
1334 static bool pyopencv_to(PyObject* obj, Vec4f& v, ArgInfo& info)
1336 RefWrapper<float> values[] = {RefWrapper<float>(v[0]), RefWrapper<float>(v[1]),
1337 RefWrapper<float>(v[2]), RefWrapper<float>(v[3])};
1338 return parseSequence(obj, values, info);
1341 static bool pyopencv_to(PyObject* obj, Vec4i& v, ArgInfo& info)
1343 RefWrapper<int> values[] = {RefWrapper<int>(v[0]), RefWrapper<int>(v[1]),
1344 RefWrapper<int>(v[2]), RefWrapper<int>(v[3])};
1345 return parseSequence(obj, values, info);
1348 static bool pyopencv_to(PyObject* obj, Vec3d& v, ArgInfo& info)
1350 RefWrapper<double> values[] = {RefWrapper<double>(v[0]),
1351 RefWrapper<double>(v[1]),
1352 RefWrapper<double>(v[2])};
1353 return parseSequence(obj, values, info);
1356 static bool pyopencv_to(PyObject* obj, Vec3f& v, ArgInfo& info)
1358 RefWrapper<float> values[] = {RefWrapper<float>(v[0]),
1359 RefWrapper<float>(v[1]),
1360 RefWrapper<float>(v[2])};
1361 return parseSequence(obj, values, info);
1364 static bool pyopencv_to(PyObject* obj, Vec3i& v, ArgInfo& info)
1366 RefWrapper<int> values[] = {RefWrapper<int>(v[0]), RefWrapper<int>(v[1]),
1367 RefWrapper<int>(v[2])};
1368 return parseSequence(obj, values, info);
1371 static bool pyopencv_to(PyObject* obj, Vec2d& v, ArgInfo& info)
1373 RefWrapper<double> values[] = {RefWrapper<double>(v[0]),
1374 RefWrapper<double>(v[1])};
1375 return parseSequence(obj, values, info);
1378 static bool pyopencv_to(PyObject* obj, Vec2f& v, ArgInfo& info)
1380 RefWrapper<float> values[] = {RefWrapper<float>(v[0]),
1381 RefWrapper<float>(v[1])};
1382 return parseSequence(obj, values, info);
1385 static bool pyopencv_to(PyObject* obj, Vec2i& v, ArgInfo& info)
1387 RefWrapper<int> values[] = {RefWrapper<int>(v[0]), RefWrapper<int>(v[1])};
1388 return parseSequence(obj, values, info);
1392 PyObject* pyopencv_from(const Vec4d& v)
1394 return Py_BuildValue("(dddd)", v[0], v[1], v[2], v[3]);
1398 PyObject* pyopencv_from(const Vec4f& v)
1400 return Py_BuildValue("(ffff)", v[0], v[1], v[2], v[3]);
1404 PyObject* pyopencv_from(const Vec4i& v)
1406 return Py_BuildValue("(iiii)", v[0], v[1], v[2], v[3]);
1410 PyObject* pyopencv_from(const Vec3d& v)
1412 return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
1416 PyObject* pyopencv_from(const Vec3f& v)
1418 return Py_BuildValue("(fff)", v[0], v[1], v[2]);
1422 PyObject* pyopencv_from(const Vec3i& v)
1424 return Py_BuildValue("(iii)", v[0], v[1], v[2]);
1428 PyObject* pyopencv_from(const Vec2d& v)
1430 return Py_BuildValue("(dd)", v[0], v[1]);
1434 PyObject* pyopencv_from(const Vec2f& v)
1436 return Py_BuildValue("(ff)", v[0], v[1]);
1440 PyObject* pyopencv_from(const Vec2i& v)
1442 return Py_BuildValue("(ii)", v[0], v[1]);
1446 PyObject* pyopencv_from(const Point2d& p)
1448 return Py_BuildValue("(dd)", p.x, p.y);
1452 PyObject* pyopencv_from(const Point3d& p)
1454 return Py_BuildValue("(ddd)", p.x, p.y, p.z);
1457 template<typename _Tp> struct pyopencvVecConverter
1459 typedef typename DataType<_Tp>::channel_type _Cp;
1460 static inline bool copyOneItem(PyObject *obj, size_t start, int channels, _Cp * data)
1462 for(size_t j = 0; (int)j < channels; j++ )
1464 SafeSeqItem sub_item_wrap(obj, start + j);
1465 PyObject* item_ij = sub_item_wrap.item;
1466 if( PyInt_Check(item_ij))
1468 int v = (int)PyInt_AsLong(item_ij);
1469 if( v == -1 && PyErr_Occurred() )
1471 data[j] = saturate_cast<_Cp>(v);
1473 else if( PyLong_Check(item_ij))
1475 int v = (int)PyLong_AsLong(item_ij);
1476 if( v == -1 && PyErr_Occurred() )
1478 data[j] = saturate_cast<_Cp>(v);
1480 else if( PyFloat_Check(item_ij))
1482 double v = PyFloat_AsDouble(item_ij);
1483 if( PyErr_Occurred() )
1485 data[j] = saturate_cast<_Cp>(v);
1492 static bool to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo& info)
1494 if(!obj || obj == Py_None)
1496 if (PyArray_Check(obj))
1499 pyopencv_to(obj, m, info);
1503 else if (PySequence_Check(obj))
1505 const int type = traits::Type<_Tp>::value;
1506 const int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
1507 size_t i, n = PySequence_Size(obj);
1509 for (i = 0; i < n; i++ )
1511 SafeSeqItem item_wrap(obj, i);
1512 PyObject* item = item_wrap.item;
1513 _Cp* data = (_Cp*)&value[i];
1515 if( channels == 2 && PyComplex_Check(item) )
1517 data[0] = saturate_cast<_Cp>(PyComplex_RealAsDouble(item));
1518 data[1] = saturate_cast<_Cp>(PyComplex_ImagAsDouble(item));
1520 else if( channels > 1 )
1522 if( PyArray_Check(item))
1525 pyopencv_to(item, src, info);
1526 if( src.dims != 2 || src.channels() != 1 ||
1527 ((src.cols != 1 || src.rows != channels) &&
1528 (src.cols != channels || src.rows != 1)))
1530 Mat dst(src.rows, src.cols, depth, data);
1531 src.convertTo(dst, type);
1532 if( dst.data != (uchar*)data )
1535 else if (PySequence_Check(item))
1537 if (!copyOneItem(item, 0, channels, data))
1545 else if (channels == 1)
1547 if (!copyOneItem(obj, i, channels, data))
1557 failmsg("Can't convert vector element for '%s', index=%d", info.name, i);
1561 failmsg("Can't convert object to vector for '%s', unsupported type", info.name);
1565 static PyObject* from(const std::vector<_Tp>& value)
1568 return PyTuple_New(0);
1569 int type = traits::Type<_Tp>::value;
1570 int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
1571 Mat src((int)value.size(), channels, depth, (uchar*)&value[0]);
1572 return pyopencv_from(src);
1576 template<typename _Tp>
1577 bool pyopencv_to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo& info)
1579 return pyopencvVecConverter<_Tp>::to(obj, value, info);
1582 template<typename _Tp>
1583 PyObject* pyopencv_from(const std::vector<_Tp>& value)
1585 return pyopencvVecConverter<_Tp>::from(value);
1588 template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, std::vector<_Tp>& value, const ArgInfo& info)
1590 if(!obj || obj == Py_None)
1592 if (!PySequence_Check(obj))
1594 size_t n = PySequence_Size(obj);
1596 for(size_t i = 0; i < n; i++ )
1598 SafeSeqItem item_wrap(obj, i);
1599 if(!pyopencv_to(item_wrap.item, value[i], info))
1605 template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const std::vector<_Tp>& value)
1607 int i, n = (int)value.size();
1608 PyObject* seq = PyList_New(n);
1609 for( i = 0; i < n; i++ )
1611 PyObject* item = pyopencv_from(value[i]);
1614 PyList_SetItem(seq, i, item);
1624 template<std::size_t I = 0, typename... Tp>
1625 inline typename std::enable_if<I == sizeof...(Tp), void>::type
1626 convert_to_python_tuple(const std::tuple<Tp...>&, PyObject*) { }
1628 template<std::size_t I = 0, typename... Tp>
1629 inline typename std::enable_if<I < sizeof...(Tp), void>::type
1630 convert_to_python_tuple(const std::tuple<Tp...>& cpp_tuple, PyObject* py_tuple)
1632 PyObject* item = pyopencv_from(std::get<I>(cpp_tuple));
1637 PyTuple_SetItem(py_tuple, I, item);
1638 convert_to_python_tuple<I + 1, Tp...>(cpp_tuple, py_tuple);
1642 template<typename... Ts>
1643 PyObject* pyopencv_from(const std::tuple<Ts...>& cpp_tuple)
1645 size_t size = sizeof...(Ts);
1646 PyObject* py_tuple = PyTuple_New(size);
1647 convert_to_python_tuple(cpp_tuple, py_tuple);
1648 size_t actual_size = PyTuple_Size(py_tuple);
1650 if (actual_size < size)
1652 Py_DECREF(py_tuple);
1660 PyObject* pyopencv_from(const std::pair<int, double>& src)
1662 return Py_BuildValue("(id)", src.first, src.second);
1665 template<typename _Tp, typename _Tr> struct pyopencvVecConverter<std::pair<_Tp, _Tr> >
1667 static bool to(PyObject* obj, std::vector<std::pair<_Tp, _Tr> >& value, const ArgInfo& info)
1669 return pyopencv_to_generic_vec(obj, value, info);
1672 static PyObject* from(const std::vector<std::pair<_Tp, _Tr> >& value)
1674 return pyopencv_from_generic_vec(value);
1678 template<typename _Tp> struct pyopencvVecConverter<std::vector<_Tp> >
1680 static bool to(PyObject* obj, std::vector<std::vector<_Tp> >& value, const ArgInfo& info)
1682 return pyopencv_to_generic_vec(obj, value, info);
1685 static PyObject* from(const std::vector<std::vector<_Tp> >& value)
1687 return pyopencv_from_generic_vec(value);
1691 template<> struct pyopencvVecConverter<Mat>
1693 static bool to(PyObject* obj, std::vector<Mat>& value, const ArgInfo& info)
1695 return pyopencv_to_generic_vec(obj, value, info);
1698 static PyObject* from(const std::vector<Mat>& value)
1700 return pyopencv_from_generic_vec(value);
1704 template<> struct pyopencvVecConverter<UMat>
1706 static bool to(PyObject* obj, std::vector<UMat>& value, const ArgInfo& info)
1708 return pyopencv_to_generic_vec(obj, value, info);
1711 static PyObject* from(const std::vector<UMat>& value)
1713 return pyopencv_from_generic_vec(value);
1717 template<> struct pyopencvVecConverter<KeyPoint>
1719 static bool to(PyObject* obj, std::vector<KeyPoint>& value, const ArgInfo& info)
1721 return pyopencv_to_generic_vec(obj, value, info);
1724 static PyObject* from(const std::vector<KeyPoint>& value)
1726 return pyopencv_from_generic_vec(value);
1730 template<> struct pyopencvVecConverter<DMatch>
1732 static bool to(PyObject* obj, std::vector<DMatch>& value, const ArgInfo& info)
1734 return pyopencv_to_generic_vec(obj, value, info);
1737 static PyObject* from(const std::vector<DMatch>& value)
1739 return pyopencv_from_generic_vec(value);
1743 template<> struct pyopencvVecConverter<String>
1745 static bool to(PyObject* obj, std::vector<String>& value, const ArgInfo& info)
1747 return pyopencv_to_generic_vec(obj, value, info);
1750 static PyObject* from(const std::vector<String>& value)
1752 return pyopencv_from_generic_vec(value);
1756 template<> struct pyopencvVecConverter<RotatedRect>
1758 static bool to(PyObject* obj, std::vector<RotatedRect>& value, const ArgInfo& info)
1760 return pyopencv_to_generic_vec(obj, value, info);
1762 static PyObject* from(const std::vector<RotatedRect>& value)
1764 return pyopencv_from_generic_vec(value);
1769 bool pyopencv_to(PyObject* obj, TermCriteria& dst, const ArgInfo& info)
1771 if (!obj || obj == Py_None)
1775 if (!PySequence_Check(obj))
1777 failmsg("Can't parse '%s' as TermCriteria."
1778 "Input argument doesn't provide sequence protocol",
1782 const std::size_t sequenceSize = PySequence_Size(obj);
1783 if (sequenceSize != 3) {
1784 failmsg("Can't parse '%s' as TermCriteria. Expected sequence length 3, "
1786 info.name, sequenceSize);
1790 const String typeItemName = format("'%s' criteria type", info.name);
1791 const ArgInfo typeItemInfo(typeItemName.c_str(), false);
1792 SafeSeqItem typeItem(obj, 0);
1793 if (!pyopencv_to(typeItem.item, dst.type, typeItemInfo))
1799 const String maxCountItemName = format("'%s' max count", info.name);
1800 const ArgInfo maxCountItemInfo(maxCountItemName.c_str(), false);
1801 SafeSeqItem maxCountItem(obj, 1);
1802 if (!pyopencv_to(maxCountItem.item, dst.maxCount, maxCountItemInfo))
1808 const String epsilonItemName = format("'%s' epsilon", info.name);
1809 const ArgInfo epsilonItemInfo(epsilonItemName.c_str(), false);
1810 SafeSeqItem epsilonItem(obj, 2);
1811 if (!pyopencv_to(epsilonItem.item, dst.epsilon, epsilonItemInfo))
1820 PyObject* pyopencv_from(const TermCriteria& src)
1822 return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
1826 bool pyopencv_to(PyObject* obj, RotatedRect& dst, const ArgInfo& info)
1828 if (!obj || obj == Py_None)
1832 if (!PySequence_Check(obj))
1834 failmsg("Can't parse '%s' as RotatedRect."
1835 "Input argument doesn't provide sequence protocol",
1839 const std::size_t sequenceSize = PySequence_Size(obj);
1840 if (sequenceSize != 3)
1842 failmsg("Can't parse '%s' as RotatedRect. Expected sequence length 3, got %lu",
1843 info.name, sequenceSize);
1847 const String centerItemName = format("'%s' center point", info.name);
1848 const ArgInfo centerItemInfo(centerItemName.c_str(), false);
1849 SafeSeqItem centerItem(obj, 0);
1850 if (!pyopencv_to(centerItem.item, dst.center, centerItemInfo))
1856 const String sizeItemName = format("'%s' size", info.name);
1857 const ArgInfo sizeItemInfo(sizeItemName.c_str(), false);
1858 SafeSeqItem sizeItem(obj, 1);
1859 if (!pyopencv_to(sizeItem.item, dst.size, sizeItemInfo))
1865 const String angleItemName = format("'%s' angle", info.name);
1866 const ArgInfo angleItemInfo(angleItemName.c_str(), false);
1867 SafeSeqItem angleItem(obj, 2);
1868 if (!pyopencv_to(angleItem.item, dst.angle, angleItemInfo))
1877 PyObject* pyopencv_from(const RotatedRect& src)
1879 return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
1883 PyObject* pyopencv_from(const Moments& m)
1885 return Py_BuildValue("{s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d,s:d}",
1886 "m00", m.m00, "m10", m.m10, "m01", m.m01,
1887 "m20", m.m20, "m11", m.m11, "m02", m.m02,
1888 "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
1889 "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
1890 "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
1891 "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
1892 "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "nu03", m.nu03);
1895 static int OnError(int status, const char *func_name, const char *err_msg, const char *file_name, int line, void *userdata)
1897 PyGILState_STATE gstate;
1898 gstate = PyGILState_Ensure();
1900 PyObject *on_error = (PyObject*)userdata;
1901 PyObject *args = Py_BuildValue("isssi", status, func_name, err_msg, file_name, line);
1903 PyObject *r = PyObject_Call(on_error, args, NULL);
1911 PyGILState_Release(gstate);
1913 return 0; // The return value isn't used
1916 static PyObject *pycvRedirectError(PyObject*, PyObject *args, PyObject *kw)
1918 const char *keywords[] = { "on_error", NULL };
1921 if (!PyArg_ParseTupleAndKeywords(args, kw, "O", (char**)keywords, &on_error))
1924 if ((on_error != Py_None) && !PyCallable_Check(on_error)) {
1925 PyErr_SetString(PyExc_TypeError, "on_error must be callable");
1929 // Keep track of the previous handler parameter, so we can decref it when no longer used
1930 static PyObject* last_on_error = NULL;
1931 if (last_on_error) {
1932 Py_DECREF(last_on_error);
1933 last_on_error = NULL;
1936 if (on_error == Py_None) {
1937 ERRWRAP2(redirectError(NULL));
1939 last_on_error = on_error;
1940 Py_INCREF(last_on_error);
1941 ERRWRAP2(redirectError(OnError, last_on_error));
1946 static void OnMouse(int event, int x, int y, int flags, void* param)
1948 PyGILState_STATE gstate;
1949 gstate = PyGILState_Ensure();
1951 PyObject *o = (PyObject*)param;
1952 PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
1954 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1960 PyGILState_Release(gstate);
1963 #ifdef HAVE_OPENCV_HIGHGUI
1964 static PyObject *pycvSetMouseCallback(PyObject*, PyObject *args, PyObject *kw)
1966 const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
1969 PyObject *param = NULL;
1971 if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, ¶m))
1973 if (!PyCallable_Check(on_mouse)) {
1974 PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
1977 if (param == NULL) {
1980 PyObject* py_callback_info = Py_BuildValue("OO", on_mouse, param);
1981 static std::map<std::string, PyObject*> registered_callbacks;
1982 std::map<std::string, PyObject*>::iterator i = registered_callbacks.find(name);
1983 if (i != registered_callbacks.end())
1985 Py_DECREF(i->second);
1986 i->second = py_callback_info;
1990 registered_callbacks.insert(std::pair<std::string, PyObject*>(std::string(name), py_callback_info));
1992 ERRWRAP2(setMouseCallback(name, OnMouse, py_callback_info));
1997 static void OnChange(int pos, void *param)
1999 PyGILState_STATE gstate;
2000 gstate = PyGILState_Ensure();
2002 PyObject *o = (PyObject*)param;
2003 PyObject *args = Py_BuildValue("(i)", pos);
2004 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
2010 PyGILState_Release(gstate);
2013 #ifdef HAVE_OPENCV_HIGHGUI
2014 static PyObject *pycvCreateTrackbar(PyObject*, PyObject *args)
2016 PyObject *on_change;
2017 char* trackbar_name;
2019 int *value = new int;
2022 if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
2024 if (!PyCallable_Check(on_change)) {
2025 PyErr_SetString(PyExc_TypeError, "on_change must be callable");
2028 PyObject* py_callback_info = Py_BuildValue("OO", on_change, Py_None);
2029 std::string name = std::string(window_name) + ":" + std::string(trackbar_name);
2030 static std::map<std::string, PyObject*> registered_callbacks;
2031 std::map<std::string, PyObject*>::iterator i = registered_callbacks.find(name);
2032 if (i != registered_callbacks.end())
2034 Py_DECREF(i->second);
2035 i->second = py_callback_info;
2039 registered_callbacks.insert(std::pair<std::string, PyObject*>(name, py_callback_info));
2041 ERRWRAP2(createTrackbar(trackbar_name, window_name, value, count, OnChange, py_callback_info));
2045 static void OnButtonChange(int state, void *param)
2047 PyGILState_STATE gstate;
2048 gstate = PyGILState_Ensure();
2050 PyObject *o = (PyObject*)param;
2052 if(PyTuple_GetItem(o, 1) != NULL)
2054 args = Py_BuildValue("(iO)", state, PyTuple_GetItem(o,1));
2058 args = Py_BuildValue("(i)", state);
2061 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
2067 PyGILState_Release(gstate);
2070 static PyObject *pycvCreateButton(PyObject*, PyObject *args, PyObject *kw)
2072 const char* keywords[] = {"buttonName", "onChange", "userData", "buttonType", "initialButtonState", NULL};
2073 PyObject *on_change;
2074 PyObject *userdata = NULL;
2076 int button_type = 0;
2077 int initial_button_state = 0;
2079 if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|Oii", (char**)keywords, &button_name, &on_change, &userdata, &button_type, &initial_button_state))
2081 if (!PyCallable_Check(on_change)) {
2082 PyErr_SetString(PyExc_TypeError, "onChange must be callable");
2085 if (userdata == NULL) {
2089 PyObject* py_callback_info = Py_BuildValue("OO", on_change, userdata);
2090 std::string name(button_name);
2092 static std::map<std::string, PyObject*> registered_callbacks;
2093 std::map<std::string, PyObject*>::iterator i = registered_callbacks.find(name);
2094 if (i != registered_callbacks.end())
2096 Py_DECREF(i->second);
2097 i->second = py_callback_info;
2101 registered_callbacks.insert(std::pair<std::string, PyObject*>(name, py_callback_info));
2103 ERRWRAP2(createButton(button_name, OnButtonChange, py_callback_info, button_type, initial_button_state != 0));
2108 ///////////////////////////////////////////////////////////////////////////////////////
2110 static int convert_to_char(PyObject *o, char *dst, const ArgInfo& info)
2113 if (getUnicodeString(o, str))
2119 return failmsg("Expected single character string for argument '%s'", info.name);
2123 # pragma GCC diagnostic ignored "-Wunused-parameter"
2124 # pragma GCC diagnostic ignored "-Wmissing-field-initializers"
2128 #include "pyopencv_generated_enums.h"
2130 #ifdef CVPY_DYNAMIC_INIT
2131 #define CVPY_TYPE(NAME, STORAGE, SNAME, _1, _2) CVPY_TYPE_DECLARE_DYNAMIC(NAME, STORAGE, SNAME)
2133 #define CVPY_TYPE(NAME, STORAGE, SNAME, _1, _2) CVPY_TYPE_DECLARE(NAME, STORAGE, SNAME)
2135 #include "pyopencv_generated_types.h"
2137 #include "pyopencv_custom_headers.h"
2139 #include "pyopencv_generated_types_content.h"
2140 #include "pyopencv_generated_funcs.h"
2143 static PyMethodDef special_methods[] = {
2144 {"redirectError", CV_PY_FN_WITH_KW(pycvRedirectError), "redirectError(onError) -> None"},
2145 #ifdef HAVE_OPENCV_HIGHGUI
2146 {"createTrackbar", (PyCFunction)pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
2147 {"createButton", CV_PY_FN_WITH_KW(pycvCreateButton), "createButton(buttonName, onChange [, userData, buttonType, initialButtonState]) -> None"},
2148 {"setMouseCallback", CV_PY_FN_WITH_KW(pycvSetMouseCallback), "setMouseCallback(windowName, onMouse [, param]) -> None"},
2150 #ifdef HAVE_OPENCV_DNN
2151 {"dnn_registerLayer", CV_PY_FN_WITH_KW(pyopencv_cv_dnn_registerLayer), "registerLayer(type, class) -> None"},
2152 {"dnn_unregisterLayer", CV_PY_FN_WITH_KW(pyopencv_cv_dnn_unregisterLayer), "unregisterLayer(type) -> None"},
2154 #ifdef HAVE_OPENCV_GAPI
2155 {"GIn", CV_PY_FN_WITH_KW(pyopencv_cv_GIn), "GIn(...) -> GInputProtoArgs"},
2156 {"GOut", CV_PY_FN_WITH_KW(pyopencv_cv_GOut), "GOut(...) -> GOutputProtoArgs"},
2157 {"gin", CV_PY_FN_WITH_KW(pyopencv_cv_gin), "gin(...) -> GRunArgs"},
2162 /************************************************************************/
2171 static void init_submodule(PyObject * root, const char * name, PyMethodDef * methods, ConstDef * consts)
2173 // traverse and create nested submodules
2174 std::string s = name;
2175 size_t i = s.find('.');
2176 while (i < s.length() && i != std::string::npos)
2178 size_t j = s.find('.', i);
2179 if (j == std::string::npos)
2181 std::string short_name = s.substr(i, j-i);
2182 std::string full_name = s.substr(0, j);
2185 PyObject * d = PyModule_GetDict(root);
2186 PyObject * submod = PyDict_GetItemString(d, short_name.c_str());
2189 submod = PyImport_AddModule(full_name.c_str());
2190 PyDict_SetItemString(d, short_name.c_str(), submod);
2193 if (short_name != "")
2197 // populate module's dict
2198 PyObject * d = PyModule_GetDict(root);
2199 for (PyMethodDef * m = methods; m->ml_name != NULL; ++m)
2201 PyObject * method_obj = PyCFunction_NewEx(m, NULL, NULL);
2202 PyDict_SetItemString(d, m->ml_name, method_obj);
2203 Py_DECREF(method_obj);
2205 for (ConstDef * c = consts; c->name != NULL; ++c)
2207 PyDict_SetItemString(d, c->name, PyLong_FromLongLong(c->val));
2212 #include "pyopencv_generated_modules_content.h"
2214 static bool init_body(PyObject * m)
2216 #define CVPY_MODULE(NAMESTR, NAME) \
2217 init_submodule(m, MODULESTR NAMESTR, methods_##NAME, consts_##NAME)
2218 #include "pyopencv_generated_modules.h"
2221 #ifdef CVPY_DYNAMIC_INIT
2222 #define CVPY_TYPE(NAME, _1, _2, BASE, CONSTRUCTOR) CVPY_TYPE_INIT_DYNAMIC(NAME, return false, BASE, CONSTRUCTOR)
2223 PyObject * pyopencv_NoBase_TypePtr = NULL;
2225 #define CVPY_TYPE(NAME, _1, _2, BASE, CONSTRUCTOR) CVPY_TYPE_INIT_STATIC(NAME, return false, BASE, CONSTRUCTOR)
2226 PyTypeObject * pyopencv_NoBase_TypePtr = NULL;
2228 #include "pyopencv_generated_types.h"
2231 PyObject* d = PyModule_GetDict(m);
2234 PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION));
2236 PyObject *opencv_error_dict = PyDict_New();
2237 PyDict_SetItemString(opencv_error_dict, "file", Py_None);
2238 PyDict_SetItemString(opencv_error_dict, "func", Py_None);
2239 PyDict_SetItemString(opencv_error_dict, "line", Py_None);
2240 PyDict_SetItemString(opencv_error_dict, "code", Py_None);
2241 PyDict_SetItemString(opencv_error_dict, "msg", Py_None);
2242 PyDict_SetItemString(opencv_error_dict, "err", Py_None);
2243 opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, opencv_error_dict);
2244 Py_DECREF(opencv_error_dict);
2245 PyDict_SetItemString(d, "error", opencv_error);
2248 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
2289 #if defined(__GNUC__)
2290 #pragma GCC visibility push(default)
2293 #if defined(CV_PYTHON_3)
2296 static struct PyModuleDef cv2_moduledef =
2298 PyModuleDef_HEAD_INIT,
2300 "Python wrapper for OpenCV.",
2301 -1, /* size of per-interpreter state of the module,
2302 or -1 if the module keeps state in global variables. */
2306 PyMODINIT_FUNC PyInit_cv2();
2307 PyObject* PyInit_cv2()
2309 import_array(); // from numpy
2310 PyObject* m = PyModule_Create(&cv2_moduledef);
2318 PyMODINIT_FUNC initcv2();
2321 import_array(); // from numpy
2322 PyObject* m = Py_InitModule(MODULESTR, special_methods);