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/flann/miniflann.hpp"
13 #include "opencv2/imgproc/imgproc.hpp"
14 #include "opencv2/calib3d/calib3d.hpp"
15 #include "opencv2/ml/ml.hpp"
16 #include "opencv2/features2d/features2d.hpp"
17 #include "opencv2/objdetect/objdetect.hpp"
18 #include "opencv2/video/tracking.hpp"
19 #include "opencv2/video/background_segm.hpp"
20 #include "opencv2/photo/photo.hpp"
21 #include "opencv2/nonfree/nonfree.hpp"
22 #include "opencv2/highgui/highgui.hpp"
24 using cv::flann::IndexParams;
25 using cv::flann::SearchParams;
27 static PyObject* opencv_error = 0;
29 static int failmsg(const char *fmt, ...)
35 vsnprintf(str, sizeof(str), fmt, ap);
38 PyErr_SetString(PyExc_TypeError, str);
45 PyAllowThreads() : _state(PyEval_SaveThread()) {}
48 PyEval_RestoreThread(_state);
51 PyThreadState* _state;
54 #define ERRWRAP2(expr) \
57 PyAllowThreads allowThreads; \
60 catch (const cv::Exception &e) \
62 PyErr_SetString(opencv_error, e.what()); \
68 typedef vector<uchar> vector_uchar;
69 typedef vector<int> vector_int;
70 typedef vector<float> vector_float;
71 typedef vector<double> vector_double;
72 typedef vector<Point> vector_Point;
73 typedef vector<Point2f> vector_Point2f;
74 typedef vector<Vec2f> vector_Vec2f;
75 typedef vector<Vec3f> vector_Vec3f;
76 typedef vector<Vec4f> vector_Vec4f;
77 typedef vector<Vec6f> vector_Vec6f;
78 typedef vector<Vec4i> vector_Vec4i;
79 typedef vector<Rect> vector_Rect;
80 typedef vector<KeyPoint> vector_KeyPoint;
81 typedef vector<Mat> vector_Mat;
82 typedef vector<DMatch> vector_DMatch;
83 typedef vector<vector<Point> > vector_vector_Point;
84 typedef vector<vector<Point2f> > vector_vector_Point2f;
85 typedef vector<vector<Point3f> > vector_vector_Point3f;
86 typedef vector<vector<DMatch> > vector_vector_DMatch;
88 typedef Ptr<FeatureDetector> Ptr_FeatureDetector;
89 typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor;
90 typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher;
92 typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
94 typedef cvflann::flann_distance_t cvflann_flann_distance_t;
95 typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
96 typedef Ptr<flann::IndexParams> Ptr_flann_IndexParams;
97 typedef Ptr<flann::SearchParams> Ptr_flann_SearchParams;
99 static PyObject* failmsgp(const char *fmt, ...)
105 vsnprintf(str, sizeof(str), fmt, ap);
108 PyErr_SetString(PyExc_TypeError, str);
112 static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
113 (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
115 static inline PyObject* pyObjectFromRefcount(const int* refcount)
117 return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
120 static inline int* refcountFromPyObject(const PyObject* obj)
122 return (int*)((size_t)obj + REFCOUNT_OFFSET);
125 class NumpyAllocator : public MatAllocator
131 void allocate(int dims, const int* sizes, int type, int*& refcount,
132 uchar*& datastart, uchar*& data, size_t* step)
134 int depth = CV_MAT_DEPTH(type);
135 int cn = CV_MAT_CN(type);
136 const int f = (int)(sizeof(size_t)/8);
137 int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
138 depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
139 depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
140 depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
142 npy_intp _sizes[CV_MAX_DIM+1];
143 for( i = 0; i < dims; i++ )
144 _sizes[i] = sizes[i];
147 /*if( _sizes[dims-1] == 1 )
152 PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
154 CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
155 refcount = refcountFromPyObject(o);
156 npy_intp* _strides = PyArray_STRIDES(o);
157 for( i = 0; i < dims - (cn > 1); i++ )
158 step[i] = (size_t)_strides[i];
159 datastart = data = (uchar*)PyArray_DATA(o);
162 void deallocate(int* refcount, uchar* datastart, uchar* data)
166 PyObject* o = pyObjectFromRefcount(refcount);
172 NumpyAllocator g_numpyAllocator;
174 enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
176 static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
178 if(!o || o == Py_None)
181 m.allocator = &g_numpyAllocator;
185 if( !PyArray_Check(o) )
187 failmsg("%s is not a numpy array", name);
191 int typenum = PyArray_TYPE(o);
192 int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE ? CV_8S :
193 typenum == NPY_USHORT ? CV_16U : typenum == NPY_SHORT ? CV_16S :
194 typenum == NPY_INT || typenum == NPY_LONG ? CV_32S :
195 typenum == NPY_FLOAT ? CV_32F :
196 typenum == NPY_DOUBLE ? CV_64F : -1;
200 failmsg("%s data type = %d is not supported", name, typenum);
204 int ndims = PyArray_NDIM(o);
205 if(ndims >= CV_MAX_DIM)
207 failmsg("%s dimensionality (=%d) is too high", name, ndims);
211 int size[CV_MAX_DIM+1];
212 size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
213 const npy_intp* _sizes = PyArray_DIMS(o);
214 const npy_intp* _strides = PyArray_STRIDES(o);
215 bool transposed = false;
217 for(int i = 0; i < ndims; i++)
219 size[i] = (int)_sizes[i];
220 step[i] = (size_t)_strides[i];
223 if( ndims == 0 || step[ndims-1] > elemsize ) {
225 step[ndims] = elemsize;
229 if( ndims >= 2 && step[0] < step[1] )
231 std::swap(size[0], size[1]);
232 std::swap(step[0], step[1]);
236 if( ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize*size[2] )
239 type |= CV_MAKETYPE(0, size[2]);
242 if( ndims > 2 && !allowND )
244 failmsg("%s has more than 2 dimensions", name);
248 m = Mat(ndims, size, type, PyArray_DATA(o), step);
252 m.refcount = refcountFromPyObject(o);
253 m.addref(); // protect the original numpy array from deallocation
254 // (since Mat destructor will decrement the reference counter)
256 m.allocator = &g_numpyAllocator;
261 tmp.allocator = &g_numpyAllocator;
268 static PyObject* pyopencv_from(const Mat& m)
272 Mat temp, *p = (Mat*)&m;
273 if(!p->refcount || p->allocator != &g_numpyAllocator)
275 temp.allocator = &g_numpyAllocator;
280 return pyObjectFromRefcount(p->refcount);
283 static bool pyopencv_to(PyObject *o, Scalar& s, const char *name = "<unknown>")
285 if(!o || o == Py_None)
287 if (PySequence_Check(o)) {
288 PyObject *fi = PySequence_Fast(o, name);
291 if (4 < PySequence_Fast_GET_SIZE(fi))
293 failmsg("Scalar value for argument '%s' is longer than 4", name);
296 for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
297 PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
298 if (PyFloat_Check(item) || PyInt_Check(item)) {
299 s[(int)i] = PyFloat_AsDouble(item);
301 failmsg("Scalar value for argument '%s' is not numeric", name);
307 if (PyFloat_Check(o) || PyInt_Check(o)) {
308 s[0] = PyFloat_AsDouble(o);
310 failmsg("Scalar value for argument '%s' is not numeric", name);
317 static inline PyObject* pyopencv_from(const Scalar& src)
319 return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
322 static PyObject* pyopencv_from(bool value)
324 return PyBool_FromLong(value);
327 static bool pyopencv_to(PyObject* obj, bool& value, const char* name = "<unknown>")
329 if(!obj || obj == Py_None)
331 int _val = PyObject_IsTrue(obj);
338 static PyObject* pyopencv_from(size_t value)
340 return PyLong_FromUnsignedLong((unsigned long)value);
343 static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>")
345 if(!obj || obj == Py_None)
347 value = (int)PyLong_AsUnsignedLong(obj);
348 return value != (size_t)-1 || !PyErr_Occurred();
351 static PyObject* pyopencv_from(int value)
353 return PyInt_FromLong(value);
356 static bool pyopencv_to(PyObject* obj, int& value, const char* name = "<unknown>")
358 if(!obj || obj == Py_None)
360 value = (int)PyInt_AsLong(obj);
361 return value != -1 || !PyErr_Occurred();
364 static PyObject* pyopencv_from(uchar value)
366 return PyInt_FromLong(value);
369 static bool pyopencv_to(PyObject* obj, uchar& value, const char* name = "<unknown>")
371 if(!obj || obj == Py_None)
373 value = (int)PyInt_AsLong(obj);
374 return value != -1 || !PyErr_Occurred();
377 static PyObject* pyopencv_from(double value)
379 return PyFloat_FromDouble(value);
382 static bool pyopencv_to(PyObject* obj, double& value, const char* name = "<unknown>")
384 if(!obj || obj == Py_None)
386 if(PyInt_CheckExact(obj))
387 value = (double)PyInt_AS_LONG(obj);
389 value = PyFloat_AsDouble(obj);
390 return !PyErr_Occurred();
393 static PyObject* pyopencv_from(float value)
395 return PyFloat_FromDouble(value);
398 static bool pyopencv_to(PyObject* obj, float& value, const char* name = "<unknown>")
400 if(!obj || obj == Py_None)
402 if(PyInt_CheckExact(obj))
403 value = (float)PyInt_AS_LONG(obj);
405 value = (float)PyFloat_AsDouble(obj);
406 return !PyErr_Occurred();
409 static PyObject* pyopencv_from(int64 value)
411 return PyFloat_FromDouble((double)value);
414 static PyObject* pyopencv_from(const string& value)
416 return PyString_FromString(value.empty() ? "" : value.c_str());
419 static bool pyopencv_to(PyObject* obj, string& value, const char* name = "<unknown>")
421 if(!obj || obj == Py_None)
423 char* str = PyString_AsString(obj);
430 static inline bool pyopencv_to(PyObject* obj, Size& sz, const char* name = "<unknown>")
432 if(!obj || obj == Py_None)
434 return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
437 static inline PyObject* pyopencv_from(const Size& sz)
439 return Py_BuildValue("(ii)", sz.width, sz.height);
442 static inline bool pyopencv_to(PyObject* obj, Rect& r, const char* name = "<unknown>")
444 if(!obj || obj == Py_None)
446 return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
449 static inline PyObject* pyopencv_from(const Rect& r)
451 return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
454 static inline bool pyopencv_to(PyObject* obj, Range& r, const char* name = "<unknown>")
456 if(!obj || obj == Py_None)
458 if(PyObject_Size(obj) == 0)
463 return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
466 static inline PyObject* pyopencv_from(const Range& r)
468 return Py_BuildValue("(ii)", r.start, r.end);
471 static inline bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name = "<unknown>")
473 if(!obj || obj == Py_None)
475 if(PyObject_Size(obj) == 0)
480 return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
483 static inline PyObject* pyopencv_from(const CvSlice& r)
485 return Py_BuildValue("(ii)", r.start_index, r.end_index);
488 static inline bool pyopencv_to(PyObject* obj, Point& p, const char* name = "<unknown>")
490 if(!obj || obj == Py_None)
492 if(PyComplex_CheckExact(obj))
494 Py_complex c = PyComplex_AsCComplex(obj);
495 p.x = saturate_cast<int>(c.real);
496 p.y = saturate_cast<int>(c.imag);
499 return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
502 static inline bool pyopencv_to(PyObject* obj, Point2f& p, const char* name = "<unknown>")
504 if(!obj || obj == Py_None)
506 if(PyComplex_CheckExact(obj))
508 Py_complex c = PyComplex_AsCComplex(obj);
509 p.x = saturate_cast<float>(c.real);
510 p.y = saturate_cast<float>(c.imag);
513 return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
516 static inline PyObject* pyopencv_from(const Point& p)
518 return Py_BuildValue("(ii)", p.x, p.y);
521 static inline PyObject* pyopencv_from(const Point2f& p)
523 return Py_BuildValue("(dd)", p.x, p.y);
526 static inline bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name = "<unknown>")
530 return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
533 static inline PyObject* pyopencv_from(const Vec3d& v)
535 return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
538 static inline PyObject* pyopencv_from(const Point2d& p)
540 return Py_BuildValue("(dd)", p.x, p.y);
543 template<typename _Tp> struct pyopencvVecConverter
545 static bool to(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
547 typedef typename DataType<_Tp>::channel_type _Cp;
548 if(!obj || obj == Py_None)
550 if (PyArray_Check(obj))
553 pyopencv_to(obj, m, name);
556 if (!PySequence_Check(obj))
558 PyObject *seq = PySequence_Fast(obj, name);
561 int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
564 int type = DataType<_Tp>::type;
565 int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
566 PyObject** items = PySequence_Fast_ITEMS(seq);
568 for( i = 0; i < n; i++ )
570 PyObject* item = items[i];
572 PyObject** items_i = &item;
573 _Cp* data = (_Cp*)&value[i];
575 if( channels == 2 && PyComplex_CheckExact(item) )
577 Py_complex c = PyComplex_AsCComplex(obj);
578 data[0] = saturate_cast<_Cp>(c.real);
579 data[1] = saturate_cast<_Cp>(c.imag);
584 if( PyArray_Check(item))
587 pyopencv_to(item, src, name);
588 if( src.dims != 2 || src.channels() != 1 ||
589 ((src.cols != 1 || src.rows != channels) &&
590 (src.cols != channels || src.rows != 1)))
592 Mat dst(src.rows, src.cols, depth, data);
593 src.convertTo(dst, type);
594 if( dst.data != (uchar*)data )
599 seq_i = PySequence_Fast(item, name);
600 if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
605 items_i = PySequence_Fast_ITEMS(seq_i);
608 for( j = 0; j < channels; j++ )
610 PyObject* item_ij = items_i[j];
611 if( PyInt_Check(item_ij))
613 int v = PyInt_AsLong(item_ij);
614 if( v == -1 && PyErr_Occurred() )
616 data[j] = saturate_cast<_Cp>(v);
618 else if( PyFloat_Check(item_ij))
620 double v = PyFloat_AsDouble(item_ij);
621 if( PyErr_Occurred() )
623 data[j] = saturate_cast<_Cp>(v);
636 static PyObject* from(const vector<_Tp>& value)
639 return PyTuple_New(0);
640 Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
641 return pyopencv_from(src);
646 template<typename _Tp> static inline bool pyopencv_to(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
648 return pyopencvVecConverter<_Tp>::to(obj, value, name);
651 template<typename _Tp> static inline PyObject* pyopencv_from(const vector<_Tp>& value)
653 return pyopencvVecConverter<_Tp>::from(value);
656 static PyObject* pyopencv_from(const KeyPoint&);
657 static PyObject* pyopencv_from(const DMatch&);
659 template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
661 if(!obj || obj == Py_None)
663 if (!PySequence_Check(obj))
665 PyObject *seq = PySequence_Fast(obj, name);
668 int i, n = (int)PySequence_Fast_GET_SIZE(seq);
671 PyObject** items = PySequence_Fast_ITEMS(seq);
673 for( i = 0; i < n; i++ )
675 PyObject* item = items[i];
676 if(!pyopencv_to(item, value[i], name))
683 template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const vector<_Tp>& value)
685 int i, n = (int)value.size();
686 PyObject* seq = PyList_New(n);
687 for( i = 0; i < n; i++ )
689 PyObject* item = pyopencv_from(value[i]);
692 PyList_SET_ITEM(seq, i, item);
703 template<typename _Tp> struct pyopencvVecConverter<vector<_Tp> >
705 static bool to(PyObject* obj, vector<vector<_Tp> >& value, const char* name="<unknown>")
707 return pyopencv_to_generic_vec(obj, value, name);
710 static PyObject* from(const vector<vector<_Tp> >& value)
712 return pyopencv_from_generic_vec(value);
716 template<> struct pyopencvVecConverter<Mat>
718 static bool to(PyObject* obj, vector<Mat>& value, const char* name="<unknown>")
720 return pyopencv_to_generic_vec(obj, value, name);
723 static PyObject* from(const vector<Mat>& value)
725 return pyopencv_from_generic_vec(value);
729 template<> struct pyopencvVecConverter<KeyPoint>
731 static bool to(PyObject* obj, vector<KeyPoint>& value, const char* name="<unknown>")
733 return pyopencv_to_generic_vec(obj, value, name);
736 static PyObject* from(const vector<KeyPoint>& value)
738 return pyopencv_from_generic_vec(value);
742 template<> struct pyopencvVecConverter<DMatch>
744 static bool to(PyObject* obj, vector<DMatch>& value, const char* name="<unknown>")
746 return pyopencv_to_generic_vec(obj, value, name);
749 static PyObject* from(const vector<DMatch>& value)
751 return pyopencv_from_generic_vec(value);
756 static inline bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name="<unknown>")
760 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
763 static inline PyObject* pyopencv_from(const CvTermCriteria& src)
765 return Py_BuildValue("(iid)", src.type, src.max_iter, src.epsilon);
768 static inline bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name="<unknown>")
772 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
775 static inline PyObject* pyopencv_from(const TermCriteria& src)
777 return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
780 static inline bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name="<unknown>")
784 return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
787 static inline PyObject* pyopencv_from(const RotatedRect& src)
789 return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
792 static inline PyObject* pyopencv_from(const Moments& m)
794 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}",
795 "m00", m.m00, "m10", m.m10, "m01", m.m01,
796 "m20", m.m20, "m11", m.m11, "m02", m.m02,
797 "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
798 "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
799 "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
800 "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
801 "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "mu03", m.nu03);
804 static inline PyObject* pyopencv_from(const CvDTreeNode* node)
806 double value = node->value;
807 int ivalue = cvRound(value);
808 return value == ivalue ? PyInt_FromLong(ivalue) : PyFloat_FromDouble(value);
811 static bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name="<unknown>")
814 PyObject* keys = PyObject_CallMethod(o,(char*)"keys",0);
815 PyObject* values = PyObject_CallMethod(o,(char*)"values",0);
819 int i, n = (int)PyList_GET_SIZE(keys);
820 for( i = 0; i < n; i++ )
822 PyObject* key = PyList_GET_ITEM(keys, i);
823 PyObject* item = PyList_GET_ITEM(values, i);
824 if( !PyString_Check(key) )
826 std::string k = PyString_AsString(key);
827 if( PyString_Check(item) )
829 const char* value = PyString_AsString(item);
830 p.setString(k, value);
832 else if( PyBool_Check(item) )
833 p.setBool(k, item == Py_True);
834 else if( PyInt_Check(item) )
836 int value = (int)PyInt_AsLong(item);
837 if( strcmp(k.c_str(), "algorithm") == 0 )
838 p.setAlgorithm(value);
842 else if( PyFloat_Check(item) )
844 double value = PyFloat_AsDouble(item);
845 p.setDouble(k, value);
850 ok = i == n && !PyErr_Occurred();
859 static bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name="<unknown>")
862 return pyopencv_to(o, *p, name);
866 static bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name="<unknown>")
869 bool ok = pyopencv_to(o, d, name);
870 dist = (cvflann::flann_distance_t)d;
874 ////////////////////////////////////////////////////////////////////////////////////////////////////
876 static void OnMouse(int event, int x, int y, int flags, void* param)
878 PyGILState_STATE gstate;
879 gstate = PyGILState_Ensure();
881 PyObject *o = (PyObject*)param;
882 PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
884 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
890 PyGILState_Release(gstate);
893 static PyObject *pycvSetMouseCallback(PyObject *self, PyObject *args, PyObject *kw)
895 const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
898 PyObject *param = NULL;
900 if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, ¶m))
902 if (!PyCallable_Check(on_mouse)) {
903 PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
909 ERRWRAP2(cvSetMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
913 void OnChange(int pos, void *param)
915 PyGILState_STATE gstate;
916 gstate = PyGILState_Ensure();
918 PyObject *o = (PyObject*)param;
919 PyObject *args = Py_BuildValue("(i)", pos);
920 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
924 PyGILState_Release(gstate);
927 static PyObject *pycvCreateTrackbar(PyObject *self, PyObject *args)
932 int *value = new int;
935 if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
937 if (!PyCallable_Check(on_change)) {
938 PyErr_SetString(PyExc_TypeError, "on_change must be callable");
941 ERRWRAP2(cvCreateTrackbar2(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
945 ///////////////////////////////////////////////////////////////////////////////////////
947 #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return
949 #include "pyopencv_generated_types.h"
950 #include "pyopencv_generated_funcs.h"
952 static PyMethodDef methods[] = {
954 #include "pyopencv_generated_func_tab.h"
955 {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
956 {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
960 /************************************************************************/
963 static int to_ok(PyTypeObject *to)
965 to->tp_alloc = PyType_GenericAlloc;
966 to->tp_new = PyType_GenericNew;
967 to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
968 return (PyType_Ready(to) == 0);
971 #include "cv2.cv.hpp"
974 #if defined WIN32 || defined _WIN32
975 __declspec(dllexport)
985 #include "pyopencv_generated_type_reg.h"
988 PyObject* m = Py_InitModule(MODULESTR, methods);
989 PyObject* d = PyModule_GetDict(m);
991 PyDict_SetItemString(d, "__version__", PyString_FromString("$Rev: 4557 $"));
993 opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
994 PyDict_SetItemString(d, "error", opencv_error);
996 PyObject* cv_m = init_cv();
998 PyDict_SetItemString(d, "cv", cv_m);
1000 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
1001 #define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
1002 #define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))
1004 PUBLISHU(IPL_DEPTH_8U);
1005 PUBLISHU(IPL_DEPTH_8S);
1006 PUBLISHU(IPL_DEPTH_16U);
1007 PUBLISHU(IPL_DEPTH_16S);
1008 PUBLISHU(IPL_DEPTH_32S);
1009 PUBLISHU(IPL_DEPTH_32F);
1010 PUBLISHU(IPL_DEPTH_64F);
1012 PUBLISH(CV_LOAD_IMAGE_COLOR);
1013 PUBLISH(CV_LOAD_IMAGE_GRAYSCALE);
1014 PUBLISH(CV_LOAD_IMAGE_UNCHANGED);
1015 PUBLISH(CV_HIST_ARRAY);
1016 PUBLISH(CV_HIST_SPARSE);
1052 PUBLISH(CV_NEXT_AROUND_ORG);
1053 PUBLISH(CV_NEXT_AROUND_DST);
1054 PUBLISH(CV_PREV_AROUND_ORG);
1055 PUBLISH(CV_PREV_AROUND_DST);
1056 PUBLISH(CV_NEXT_AROUND_LEFT);
1057 PUBLISH(CV_NEXT_AROUND_RIGHT);
1058 PUBLISH(CV_PREV_AROUND_LEFT);
1059 PUBLISH(CV_PREV_AROUND_RIGHT);
1061 PUBLISH(CV_WINDOW_AUTOSIZE);
1063 PUBLISH(CV_PTLOC_INSIDE);
1064 PUBLISH(CV_PTLOC_ON_EDGE);
1065 PUBLISH(CV_PTLOC_VERTEX);
1066 PUBLISH(CV_PTLOC_OUTSIDE_RECT);
1072 PUBLISH(GC_INIT_WITH_RECT);
1073 PUBLISH(GC_INIT_WITH_MASK);
1076 PUBLISH(CV_ROW_SAMPLE);
1077 PUBLISH(CV_VAR_NUMERICAL);
1078 PUBLISH(CV_VAR_ORDERED);
1079 PUBLISH(CV_VAR_CATEGORICAL);
1083 #include "pyopencv_generated_const_reg.h"