4 #error "The module can only be built if NumPy is available"
7 #define MODULESTR "cv2"
9 #include "numpy/ndarrayobject.h"
11 #include "opencv2/core/core.hpp"
12 #include "opencv2/contrib/contrib.hpp"
13 #include "opencv2/flann/miniflann.hpp"
14 #include "opencv2/imgproc/imgproc.hpp"
15 #include "opencv2/calib3d/calib3d.hpp"
16 #include "opencv2/ml/ml.hpp"
17 #include "opencv2/features2d/features2d.hpp"
18 #include "opencv2/objdetect/objdetect.hpp"
19 #include "opencv2/video/tracking.hpp"
20 #include "opencv2/video/background_segm.hpp"
21 #include "opencv2/photo/photo.hpp"
22 #include "opencv2/highgui/highgui.hpp"
24 #include "opencv2/opencv_modules.hpp"
26 #ifdef HAVE_OPENCV_NONFREE
27 # include "opencv2/nonfree/nonfree.hpp"
30 using cv::flann::IndexParams;
31 using cv::flann::SearchParams;
33 static PyObject* opencv_error = 0;
35 static int failmsg(const char *fmt, ...)
41 vsnprintf(str, sizeof(str), fmt, ap);
44 PyErr_SetString(PyExc_TypeError, str);
52 // more fields may be added if necessary
54 ArgInfo(const char * name_, bool outputarg_)
56 , outputarg(outputarg_) {}
58 // to match with older pyopencv_to function signature
59 operator const char *() const { return name; }
65 PyAllowThreads() : _state(PyEval_SaveThread()) {}
68 PyEval_RestoreThread(_state);
71 PyThreadState* _state;
77 PyEnsureGIL() : _state(PyGILState_Ensure()) {}
80 PyGILState_Release(_state);
83 PyGILState_STATE _state;
86 #define ERRWRAP2(expr) \
89 PyAllowThreads allowThreads; \
92 catch (const cv::Exception &e) \
94 PyErr_SetString(opencv_error, e.what()); \
100 typedef vector<uchar> vector_uchar;
101 typedef vector<int> vector_int;
102 typedef vector<float> vector_float;
103 typedef vector<double> vector_double;
104 typedef vector<Point> vector_Point;
105 typedef vector<Point2f> vector_Point2f;
106 typedef vector<Vec2f> vector_Vec2f;
107 typedef vector<Vec3f> vector_Vec3f;
108 typedef vector<Vec4f> vector_Vec4f;
109 typedef vector<Vec6f> vector_Vec6f;
110 typedef vector<Vec4i> vector_Vec4i;
111 typedef vector<Rect> vector_Rect;
112 typedef vector<KeyPoint> vector_KeyPoint;
113 typedef vector<Mat> vector_Mat;
114 typedef vector<DMatch> vector_DMatch;
115 typedef vector<string> vector_string;
116 typedef vector<vector<Point> > vector_vector_Point;
117 typedef vector<vector<Point2f> > vector_vector_Point2f;
118 typedef vector<vector<Point3f> > vector_vector_Point3f;
119 typedef vector<vector<DMatch> > vector_vector_DMatch;
121 typedef Ptr<Algorithm> Ptr_Algorithm;
122 typedef Ptr<FeatureDetector> Ptr_FeatureDetector;
123 typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor;
124 typedef Ptr<Feature2D> Ptr_Feature2D;
125 typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher;
126 typedef Ptr<CLAHE> Ptr_CLAHE;
128 typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
130 typedef cvflann::flann_distance_t cvflann_flann_distance_t;
131 typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
132 typedef Ptr<flann::IndexParams> Ptr_flann_IndexParams;
133 typedef Ptr<flann::SearchParams> Ptr_flann_SearchParams;
135 typedef Ptr<FaceRecognizer> Ptr_FaceRecognizer;
136 typedef vector<Scalar> vector_Scalar;
138 static PyObject* failmsgp(const char *fmt, ...)
144 vsnprintf(str, sizeof(str), fmt, ap);
147 PyErr_SetString(PyExc_TypeError, str);
151 static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
152 (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
154 static inline PyObject* pyObjectFromRefcount(const int* refcount)
156 return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
159 static inline int* refcountFromPyObject(const PyObject* obj)
161 return (int*)((size_t)obj + REFCOUNT_OFFSET);
164 class NumpyAllocator : public MatAllocator
170 void allocate(int dims, const int* sizes, int type, int*& refcount,
171 uchar*& datastart, uchar*& data, size_t* step)
175 int depth = CV_MAT_DEPTH(type);
176 int cn = CV_MAT_CN(type);
177 const int f = (int)(sizeof(size_t)/8);
178 int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
179 depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
180 depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
181 depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
183 npy_intp _sizes[CV_MAX_DIM+1];
184 for( i = 0; i < dims; i++ )
185 _sizes[i] = sizes[i];
188 /*if( _sizes[dims-1] == 1 )
193 PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
195 CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
196 refcount = refcountFromPyObject(o);
197 npy_intp* _strides = PyArray_STRIDES(o);
198 for( i = 0; i < dims - (cn > 1); i++ )
199 step[i] = (size_t)_strides[i];
200 datastart = data = (uchar*)PyArray_DATA(o);
203 void deallocate(int* refcount, uchar*, uchar*)
208 PyObject* o = pyObjectFromRefcount(refcount);
214 NumpyAllocator g_numpyAllocator;
216 enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
218 // special case, when the convertor needs full ArgInfo structure
219 static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allowND=true)
221 if(!o || o == Py_None)
224 m.allocator = &g_numpyAllocator;
230 double v[] = {PyInt_AsLong((PyObject*)o), 0., 0., 0.};
231 m = Mat(4, 1, CV_64F, v).clone();
234 if( PyFloat_Check(o) )
236 double v[] = {PyFloat_AsDouble((PyObject*)o), 0., 0., 0.};
237 m = Mat(4, 1, CV_64F, v).clone();
240 if( PyTuple_Check(o) )
242 int i, sz = (int)PyTuple_Size((PyObject*)o);
243 m = Mat(sz, 1, CV_64F);
244 for( i = 0; i < sz; i++ )
246 PyObject* oi = PyTuple_GET_ITEM(o, i);
247 if( PyInt_Check(oi) )
248 m.at<double>(i) = (double)PyInt_AsLong(oi);
249 else if( PyFloat_Check(oi) )
250 m.at<double>(i) = (double)PyFloat_AsDouble(oi);
253 failmsg("%s is not a numerical tuple", info.name);
261 if( !PyArray_Check(o) )
263 failmsg("%s is not a numpy array, neither a scalar", info.name);
267 bool needcopy = false, needcast = false;
268 int typenum = PyArray_TYPE(o), new_typenum = typenum;
269 int type = typenum == NPY_UBYTE ? CV_8U :
270 typenum == NPY_BYTE ? CV_8S :
271 typenum == NPY_USHORT ? CV_16U :
272 typenum == NPY_SHORT ? CV_16S :
273 typenum == NPY_INT ? CV_32S :
274 typenum == NPY_INT32 ? CV_32S :
275 typenum == NPY_FLOAT ? CV_32F :
276 typenum == NPY_DOUBLE ? CV_64F : -1;
280 if( typenum == NPY_INT64 || typenum == NPY_UINT64 || type == NPY_LONG )
282 needcopy = needcast = true;
283 new_typenum = NPY_INT;
288 failmsg("%s data type = %d is not supported", info.name, typenum);
293 int ndims = PyArray_NDIM(o);
294 if(ndims >= CV_MAX_DIM)
296 failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
300 int size[CV_MAX_DIM+1];
301 size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
302 const npy_intp* _sizes = PyArray_DIMS(o);
303 const npy_intp* _strides = PyArray_STRIDES(o);
304 bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
306 for( int i = ndims-1; i >= 0 && !needcopy; i-- )
308 // these checks handle cases of
309 // a) multi-dimensional (ndims > 2) arrays, as well as simpler 1- and 2-dimensional cases
310 // b) transposed arrays, where _strides[] elements go in non-descending order
311 // c) flipped arrays, where some of _strides[] elements are negative
312 if( (i == ndims-1 && (size_t)_strides[i] != elemsize) ||
313 (i < ndims-1 && _strides[i] < _strides[i+1]) )
317 if( ismultichannel && _strides[1] != (npy_intp)elemsize*_sizes[2] )
324 failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
328 o = (PyObject*)PyArray_Cast((PyArrayObject*)o, new_typenum);
330 o = (PyObject*)PyArray_GETCONTIGUOUS((PyArrayObject*)o);
331 _strides = PyArray_STRIDES(o);
334 for(int i = 0; i < ndims; i++)
336 size[i] = (int)_sizes[i];
337 step[i] = (size_t)_strides[i];
340 // handle degenerate case
343 step[ndims] = elemsize;
350 type |= CV_MAKETYPE(0, size[2]);
353 if( ndims > 2 && !allowND )
355 failmsg("%s has more than 2 dimensions", info.name);
359 m = Mat(ndims, size, type, PyArray_DATA(o), step);
363 m.refcount = refcountFromPyObject(o);
366 m.addref(); // protect the original numpy array from deallocation
367 // (since Mat destructor will decrement the reference counter)
370 m.allocator = &g_numpyAllocator;
375 static PyObject* pyopencv_from(const Mat& m)
379 Mat temp, *p = (Mat*)&m;
380 if(!p->refcount || p->allocator != &g_numpyAllocator)
382 temp.allocator = &g_numpyAllocator;
383 ERRWRAP2(m.copyTo(temp));
387 return pyObjectFromRefcount(p->refcount);
390 static bool pyopencv_to(PyObject *o, Scalar& s, const char *name = "<unknown>")
392 if(!o || o == Py_None)
394 if (PySequence_Check(o)) {
395 PyObject *fi = PySequence_Fast(o, name);
398 if (4 < PySequence_Fast_GET_SIZE(fi))
400 failmsg("Scalar value for argument '%s' is longer than 4", name);
403 for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
404 PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
405 if (PyFloat_Check(item) || PyInt_Check(item)) {
406 s[(int)i] = PyFloat_AsDouble(item);
408 failmsg("Scalar value for argument '%s' is not numeric", name);
414 if (PyFloat_Check(o) || PyInt_Check(o)) {
415 s[0] = PyFloat_AsDouble(o);
417 failmsg("Scalar value for argument '%s' is not numeric", name);
424 static inline PyObject* pyopencv_from(const Scalar& src)
426 return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
429 static PyObject* pyopencv_from(bool value)
431 return PyBool_FromLong(value);
434 static bool pyopencv_to(PyObject* obj, bool& value, const char* name = "<unknown>")
437 if(!obj || obj == Py_None)
439 int _val = PyObject_IsTrue(obj);
446 static PyObject* pyopencv_from(size_t value)
448 return PyLong_FromUnsignedLong((unsigned long)value);
451 static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>")
454 if(!obj || obj == Py_None)
456 value = (int)PyLong_AsUnsignedLong(obj);
457 return value != (size_t)-1 || !PyErr_Occurred();
460 static PyObject* pyopencv_from(int value)
462 return PyInt_FromLong(value);
465 static PyObject* pyopencv_from(cvflann_flann_algorithm_t value)
467 return PyInt_FromLong(int(value));
470 static PyObject* pyopencv_from(cvflann_flann_distance_t value)
472 return PyInt_FromLong(int(value));
475 static bool pyopencv_to(PyObject* obj, int& value, const char* name = "<unknown>")
478 if(!obj || obj == Py_None)
481 value = (int)PyInt_AsLong(obj);
482 else if(PyLong_Check(obj))
483 value = (int)PyLong_AsLong(obj);
486 return value != -1 || !PyErr_Occurred();
489 static PyObject* pyopencv_from(uchar value)
491 return PyInt_FromLong(value);
494 static bool pyopencv_to(PyObject* obj, uchar& value, const char* name = "<unknown>")
497 if(!obj || obj == Py_None)
499 int ivalue = (int)PyInt_AsLong(obj);
500 value = cv::saturate_cast<uchar>(ivalue);
501 return ivalue != -1 || !PyErr_Occurred();
504 static PyObject* pyopencv_from(double value)
506 return PyFloat_FromDouble(value);
509 static bool pyopencv_to(PyObject* obj, double& value, const char* name = "<unknown>")
512 if(!obj || obj == Py_None)
514 if(!!PyInt_CheckExact(obj))
515 value = (double)PyInt_AS_LONG(obj);
517 value = PyFloat_AsDouble(obj);
518 return !PyErr_Occurred();
521 static PyObject* pyopencv_from(float value)
523 return PyFloat_FromDouble(value);
526 static bool pyopencv_to(PyObject* obj, float& value, const char* name = "<unknown>")
529 if(!obj || obj == Py_None)
531 if(!!PyInt_CheckExact(obj))
532 value = (float)PyInt_AS_LONG(obj);
534 value = (float)PyFloat_AsDouble(obj);
535 return !PyErr_Occurred();
538 static PyObject* pyopencv_from(int64 value)
540 return PyFloat_FromDouble((double)value);
543 static PyObject* pyopencv_from(const string& value)
545 return PyString_FromString(value.empty() ? "" : value.c_str());
548 static bool pyopencv_to(PyObject* obj, string& value, const char* name = "<unknown>")
551 if(!obj || obj == Py_None)
553 char* str = PyString_AsString(obj);
560 static inline bool pyopencv_to(PyObject* obj, Size& sz, const char* name = "<unknown>")
563 if(!obj || obj == Py_None)
565 return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
568 static inline PyObject* pyopencv_from(const Size& sz)
570 return Py_BuildValue("(ii)", sz.width, sz.height);
573 static inline bool pyopencv_to(PyObject* obj, Rect& r, const char* name = "<unknown>")
576 if(!obj || obj == Py_None)
578 return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
581 static inline PyObject* pyopencv_from(const Rect& r)
583 return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
586 static inline bool pyopencv_to(PyObject* obj, Range& r, const char* name = "<unknown>")
589 if(!obj || obj == Py_None)
591 if(PyObject_Size(obj) == 0)
596 return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
599 static inline PyObject* pyopencv_from(const Range& r)
601 return Py_BuildValue("(ii)", r.start, r.end);
604 static inline bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name = "<unknown>")
607 if(!obj || obj == Py_None)
609 if(PyObject_Size(obj) == 0)
614 return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
617 static inline PyObject* pyopencv_from(const CvSlice& r)
619 return Py_BuildValue("(ii)", r.start_index, r.end_index);
622 static inline bool pyopencv_to(PyObject* obj, Point& p, const char* name = "<unknown>")
625 if(!obj || obj == Py_None)
627 if(!!PyComplex_CheckExact(obj))
629 Py_complex c = PyComplex_AsCComplex(obj);
630 p.x = saturate_cast<int>(c.real);
631 p.y = saturate_cast<int>(c.imag);
634 return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
637 static inline bool pyopencv_to(PyObject* obj, Point2f& p, const char* name = "<unknown>")
640 if(!obj || obj == Py_None)
642 if(!!PyComplex_CheckExact(obj))
644 Py_complex c = PyComplex_AsCComplex(obj);
645 p.x = saturate_cast<float>(c.real);
646 p.y = saturate_cast<float>(c.imag);
649 return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
652 static inline PyObject* pyopencv_from(const Point& p)
654 return Py_BuildValue("(ii)", p.x, p.y);
657 static inline PyObject* pyopencv_from(const Point2f& p)
659 return Py_BuildValue("(dd)", p.x, p.y);
662 static inline bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name = "<unknown>")
667 return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
670 static inline PyObject* pyopencv_from(const Vec3d& v)
672 return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
675 static inline PyObject* pyopencv_from(const Point2d& p)
677 return Py_BuildValue("(dd)", p.x, p.y);
680 template<typename _Tp> struct pyopencvVecConverter
682 static bool to(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
684 typedef typename DataType<_Tp>::channel_type _Cp;
685 if(!obj || obj == Py_None)
687 if (PyArray_Check(obj))
690 pyopencv_to(obj, m, info);
693 if (!PySequence_Check(obj))
695 PyObject *seq = PySequence_Fast(obj, info.name);
698 int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
701 int type = DataType<_Tp>::type;
702 int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
703 PyObject** items = PySequence_Fast_ITEMS(seq);
705 for( i = 0; i < n; i++ )
707 PyObject* item = items[i];
709 PyObject** items_i = &item;
710 _Cp* data = (_Cp*)&value[i];
712 if( channels == 2 && PyComplex_CheckExact(item) )
714 Py_complex c = PyComplex_AsCComplex(obj);
715 data[0] = saturate_cast<_Cp>(c.real);
716 data[1] = saturate_cast<_Cp>(c.imag);
721 if( PyArray_Check(item))
724 pyopencv_to(item, src, info);
725 if( src.dims != 2 || src.channels() != 1 ||
726 ((src.cols != 1 || src.rows != channels) &&
727 (src.cols != channels || src.rows != 1)))
729 Mat dst(src.rows, src.cols, depth, data);
730 src.convertTo(dst, type);
731 if( dst.data != (uchar*)data )
736 seq_i = PySequence_Fast(item, info.name);
737 if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
742 items_i = PySequence_Fast_ITEMS(seq_i);
745 for( j = 0; j < channels; j++ )
747 PyObject* item_ij = items_i[j];
748 if( PyInt_Check(item_ij))
750 int v = (int)PyInt_AsLong(item_ij);
751 if( v == -1 && PyErr_Occurred() )
753 data[j] = saturate_cast<_Cp>(v);
755 else if( PyLong_Check(item_ij))
757 int v = (int)PyLong_AsLong(item_ij);
758 if( v == -1 && PyErr_Occurred() )
760 data[j] = saturate_cast<_Cp>(v);
762 else if( PyFloat_Check(item_ij))
764 double v = PyFloat_AsDouble(item_ij);
765 if( PyErr_Occurred() )
767 data[j] = saturate_cast<_Cp>(v);
780 static PyObject* from(const vector<_Tp>& value)
783 return PyTuple_New(0);
784 Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
785 return pyopencv_from(src);
790 template<typename _Tp> static inline bool pyopencv_to(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
792 return pyopencvVecConverter<_Tp>::to(obj, value, info);
795 template<typename _Tp> static inline PyObject* pyopencv_from(const vector<_Tp>& value)
797 return pyopencvVecConverter<_Tp>::from(value);
800 static PyObject* pyopencv_from(const KeyPoint&);
801 static PyObject* pyopencv_from(const DMatch&);
803 template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
805 if(!obj || obj == Py_None)
807 if (!PySequence_Check(obj))
809 PyObject *seq = PySequence_Fast(obj, info.name);
812 int i, n = (int)PySequence_Fast_GET_SIZE(seq);
815 PyObject** items = PySequence_Fast_ITEMS(seq);
817 for( i = 0; i < n; i++ )
819 PyObject* item = items[i];
820 if(!pyopencv_to(item, value[i], info))
827 template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const vector<_Tp>& value)
829 int i, n = (int)value.size();
830 PyObject* seq = PyList_New(n);
831 for( i = 0; i < n; i++ )
833 PyObject* item = pyopencv_from(value[i]);
836 PyList_SET_ITEM(seq, i, item);
847 template<typename _Tp> struct pyopencvVecConverter<vector<_Tp> >
849 static bool to(PyObject* obj, vector<vector<_Tp> >& value, const char* name="<unknown>")
851 return pyopencv_to_generic_vec(obj, value, name);
854 static PyObject* from(const vector<vector<_Tp> >& value)
856 return pyopencv_from_generic_vec(value);
860 template<> struct pyopencvVecConverter<Mat>
862 static bool to(PyObject* obj, vector<Mat>& value, const ArgInfo info)
864 return pyopencv_to_generic_vec(obj, value, info);
867 static PyObject* from(const vector<Mat>& value)
869 return pyopencv_from_generic_vec(value);
873 template<> struct pyopencvVecConverter<KeyPoint>
875 static bool to(PyObject* obj, vector<KeyPoint>& value, const ArgInfo info)
877 return pyopencv_to_generic_vec(obj, value, info);
880 static PyObject* from(const vector<KeyPoint>& value)
882 return pyopencv_from_generic_vec(value);
886 template<> struct pyopencvVecConverter<DMatch>
888 static bool to(PyObject* obj, vector<DMatch>& value, const ArgInfo info)
890 return pyopencv_to_generic_vec(obj, value, info);
893 static PyObject* from(const vector<DMatch>& value)
895 return pyopencv_from_generic_vec(value);
899 template<> struct pyopencvVecConverter<string>
901 static bool to(PyObject* obj, vector<string>& value, const ArgInfo info)
903 return pyopencv_to_generic_vec(obj, value, info);
906 static PyObject* from(const vector<string>& value)
908 return pyopencv_from_generic_vec(value);
913 static inline bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name="<unknown>")
918 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
921 static inline PyObject* pyopencv_from(const CvTermCriteria& src)
923 return Py_BuildValue("(iid)", src.type, src.max_iter, src.epsilon);
926 static inline bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name="<unknown>")
931 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
934 static inline PyObject* pyopencv_from(const TermCriteria& src)
936 return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
939 static inline bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name="<unknown>")
944 return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
947 static inline PyObject* pyopencv_from(const RotatedRect& src)
949 return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
952 static inline PyObject* pyopencv_from(const Moments& m)
954 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}",
955 "m00", m.m00, "m10", m.m10, "m01", m.m01,
956 "m20", m.m20, "m11", m.m11, "m02", m.m02,
957 "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
958 "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
959 "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
960 "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
961 "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "nu03", m.nu03);
964 static inline PyObject* pyopencv_from(const CvDTreeNode* node)
966 double value = node->value;
967 int ivalue = cvRound(value);
968 return value == ivalue ? PyInt_FromLong(ivalue) : PyFloat_FromDouble(value);
971 static bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name="<unknown>")
975 PyObject* keys = PyObject_CallMethod(o,(char*)"keys",0);
976 PyObject* values = PyObject_CallMethod(o,(char*)"values",0);
980 int i, n = (int)PyList_GET_SIZE(keys);
981 for( i = 0; i < n; i++ )
983 PyObject* key = PyList_GET_ITEM(keys, i);
984 PyObject* item = PyList_GET_ITEM(values, i);
985 if( !PyString_Check(key) )
987 std::string k = PyString_AsString(key);
988 if( PyString_Check(item) )
990 const char* value = PyString_AsString(item);
991 p.setString(k, value);
993 else if( !!PyBool_Check(item) )
994 p.setBool(k, item == Py_True);
995 else if( PyInt_Check(item) )
997 int value = (int)PyInt_AsLong(item);
998 if( strcmp(k.c_str(), "algorithm") == 0 )
999 p.setAlgorithm(value);
1003 else if( PyFloat_Check(item) )
1005 double value = PyFloat_AsDouble(item);
1006 p.setDouble(k, value);
1011 ok = i == n && !PyErr_Occurred();
1020 static bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name="<unknown>")
1023 return pyopencv_to(o, *p, name);
1027 static bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name="<unknown>")
1030 bool ok = pyopencv_to(o, d, name);
1031 dist = (cvflann::flann_distance_t)d;
1035 ////////////////////////////////////////////////////////////////////////////////////////////////////
1037 static void OnMouse(int event, int x, int y, int flags, void* param)
1039 PyGILState_STATE gstate;
1040 gstate = PyGILState_Ensure();
1042 PyObject *o = (PyObject*)param;
1043 PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
1045 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1051 PyGILState_Release(gstate);
1054 static PyObject *pycvSetMouseCallback(PyObject*, PyObject *args, PyObject *kw)
1056 const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
1059 PyObject *param = NULL;
1061 if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, ¶m))
1063 if (!PyCallable_Check(on_mouse)) {
1064 PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
1067 if (param == NULL) {
1070 ERRWRAP2(cvSetMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
1074 static void OnChange(int pos, void *param)
1076 PyGILState_STATE gstate;
1077 gstate = PyGILState_Ensure();
1079 PyObject *o = (PyObject*)param;
1080 PyObject *args = Py_BuildValue("(i)", pos);
1081 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1085 PyGILState_Release(gstate);
1088 static PyObject *pycvCreateTrackbar(PyObject*, PyObject *args)
1090 PyObject *on_change;
1091 char* trackbar_name;
1093 int *value = new int;
1096 if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
1098 if (!PyCallable_Check(on_change)) {
1099 PyErr_SetString(PyExc_TypeError, "on_change must be callable");
1102 ERRWRAP2(cvCreateTrackbar2(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
1106 ///////////////////////////////////////////////////////////////////////////////////////
1108 #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return
1111 # pragma GCC diagnostic ignored "-Wunused-parameter"
1112 # pragma GCC diagnostic ignored "-Wmissing-field-initializers"
1115 #include "pyopencv_generated_types.h"
1116 #include "pyopencv_generated_funcs.h"
1118 static PyMethodDef methods[] = {
1120 #include "pyopencv_generated_func_tab.h"
1121 {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
1122 {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
1126 /************************************************************************/
1129 static int to_ok(PyTypeObject *to)
1131 to->tp_alloc = PyType_GenericAlloc;
1132 to->tp_new = PyType_GenericNew;
1133 to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
1134 return (PyType_Ready(to) == 0);
1137 #include "cv2.cv.hpp"
1140 #if defined WIN32 || defined _WIN32
1141 __declspec(dllexport)
1147 #if PYTHON_USE_NUMPY
1151 #if PYTHON_USE_NUMPY
1152 #include "pyopencv_generated_type_reg.h"
1155 PyObject* m = Py_InitModule(MODULESTR, methods);
1156 PyObject* d = PyModule_GetDict(m);
1158 PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION));
1160 opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
1161 PyDict_SetItemString(d, "error", opencv_error);
1163 PyObject* cv_m = init_cv();
1165 PyDict_SetItemString(d, "cv", cv_m);
1167 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
1168 #define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
1169 #define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))
1171 PUBLISHU(IPL_DEPTH_8U);
1172 PUBLISHU(IPL_DEPTH_8S);
1173 PUBLISHU(IPL_DEPTH_16U);
1174 PUBLISHU(IPL_DEPTH_16S);
1175 PUBLISHU(IPL_DEPTH_32S);
1176 PUBLISHU(IPL_DEPTH_32F);
1177 PUBLISHU(IPL_DEPTH_64F);
1179 PUBLISH(CV_LOAD_IMAGE_COLOR);
1180 PUBLISH(CV_LOAD_IMAGE_GRAYSCALE);
1181 PUBLISH(CV_LOAD_IMAGE_UNCHANGED);
1182 PUBLISH(CV_HIST_ARRAY);
1183 PUBLISH(CV_HIST_SPARSE);
1219 PUBLISH(CV_NEXT_AROUND_ORG);
1220 PUBLISH(CV_NEXT_AROUND_DST);
1221 PUBLISH(CV_PREV_AROUND_ORG);
1222 PUBLISH(CV_PREV_AROUND_DST);
1223 PUBLISH(CV_NEXT_AROUND_LEFT);
1224 PUBLISH(CV_NEXT_AROUND_RIGHT);
1225 PUBLISH(CV_PREV_AROUND_LEFT);
1226 PUBLISH(CV_PREV_AROUND_RIGHT);
1228 PUBLISH(CV_WINDOW_AUTOSIZE);
1230 PUBLISH(CV_PTLOC_INSIDE);
1231 PUBLISH(CV_PTLOC_ON_EDGE);
1232 PUBLISH(CV_PTLOC_VERTEX);
1233 PUBLISH(CV_PTLOC_OUTSIDE_RECT);
1239 PUBLISH(GC_INIT_WITH_RECT);
1240 PUBLISH(GC_INIT_WITH_MASK);
1243 PUBLISH(CV_ROW_SAMPLE);
1244 PUBLISH(CV_VAR_NUMERICAL);
1245 PUBLISH(CV_VAR_ORDERED);
1246 PUBLISH(CV_VAR_CATEGORICAL);
1250 #include "pyopencv_generated_const_reg.h"