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/highgui/highgui.hpp"
22 using cv::flann::IndexParams;
23 using cv::flann::SearchParams;
25 static PyObject* opencv_error = 0;
27 static int failmsg(const char *fmt, ...)
33 vsnprintf(str, sizeof(str), fmt, ap);
36 PyErr_SetString(PyExc_TypeError, str);
43 PyAllowThreads() : _state(PyEval_SaveThread()) {}
46 PyEval_RestoreThread(_state);
49 PyThreadState* _state;
52 #define ERRWRAP2(expr) \
55 PyAllowThreads allowThreads; \
58 catch (const cv::Exception &e) \
60 PyErr_SetString(opencv_error, e.what()); \
66 typedef vector<uchar> vector_uchar;
67 typedef vector<int> vector_int;
68 typedef vector<float> vector_float;
69 typedef vector<double> vector_double;
70 typedef vector<Point> vector_Point;
71 typedef vector<Point2f> vector_Point2f;
72 typedef vector<Vec2f> vector_Vec2f;
73 typedef vector<Vec3f> vector_Vec3f;
74 typedef vector<Vec4f> vector_Vec4f;
75 typedef vector<Vec6f> vector_Vec6f;
76 typedef vector<Vec4i> vector_Vec4i;
77 typedef vector<Rect> vector_Rect;
78 typedef vector<KeyPoint> vector_KeyPoint;
79 typedef vector<Mat> vector_Mat;
80 typedef vector<DMatch> vector_DMatch;
81 typedef vector<vector<Point> > vector_vector_Point;
82 typedef vector<vector<Point2f> > vector_vector_Point2f;
83 typedef vector<vector<Point3f> > vector_vector_Point3f;
84 typedef vector<vector<DMatch> > vector_vector_DMatch;
86 typedef Ptr<FeatureDetector> Ptr_FeatureDetector;
87 typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor;
88 typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher;
90 typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
92 typedef cvflann::flann_distance_t cvflann_flann_distance_t;
93 typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
94 typedef Ptr<flann::IndexParams> Ptr_flann_IndexParams;
95 typedef Ptr<flann::SearchParams> Ptr_flann_SearchParams;
97 static PyObject* failmsgp(const char *fmt, ...)
103 vsnprintf(str, sizeof(str), fmt, ap);
106 PyErr_SetString(PyExc_TypeError, str);
110 static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
111 (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
113 static inline PyObject* pyObjectFromRefcount(const int* refcount)
115 return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
118 static inline int* refcountFromPyObject(const PyObject* obj)
120 return (int*)((size_t)obj + REFCOUNT_OFFSET);
123 class NumpyAllocator : public MatAllocator
129 void allocate(int dims, const int* sizes, int type, int*& refcount,
130 uchar*& datastart, uchar*& data, size_t* step)
132 int depth = CV_MAT_DEPTH(type);
133 int cn = CV_MAT_CN(type);
134 const int f = (int)(sizeof(size_t)/8);
135 int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
136 depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
137 depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
138 depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
140 npy_intp _sizes[CV_MAX_DIM+1];
141 for( i = 0; i < dims; i++ )
142 _sizes[i] = sizes[i];
145 /*if( _sizes[dims-1] == 1 )
150 PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
152 CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
153 refcount = refcountFromPyObject(o);
154 npy_intp* _strides = PyArray_STRIDES(o);
155 for( i = 0; i < dims - (cn > 1); i++ )
156 step[i] = (size_t)_strides[i];
157 datastart = data = (uchar*)PyArray_DATA(o);
160 void deallocate(int* refcount, uchar* datastart, uchar* data)
164 PyObject* o = pyObjectFromRefcount(refcount);
170 NumpyAllocator g_numpyAllocator;
172 enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
174 static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
176 if(!o || o == Py_None)
179 m.allocator = &g_numpyAllocator;
183 if( !PyArray_Check(o) )
185 failmsg("%s is not a numpy array", name);
189 int typenum = PyArray_TYPE(o);
190 int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE ? CV_8S :
191 typenum == NPY_USHORT ? CV_16U : typenum == NPY_SHORT ? CV_16S :
192 typenum == NPY_INT || typenum == NPY_LONG ? CV_32S :
193 typenum == NPY_FLOAT ? CV_32F :
194 typenum == NPY_DOUBLE ? CV_64F : -1;
198 failmsg("%s data type = %d is not supported", name, typenum);
202 int ndims = PyArray_NDIM(o);
203 if(ndims >= CV_MAX_DIM)
205 failmsg("%s dimensionality (=%d) is too high", name, ndims);
209 int size[CV_MAX_DIM+1];
210 size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
211 const npy_intp* _sizes = PyArray_DIMS(o);
212 const npy_intp* _strides = PyArray_STRIDES(o);
213 bool transposed = false;
215 for(int i = 0; i < ndims; i++)
217 size[i] = (int)_sizes[i];
218 step[i] = (size_t)_strides[i];
221 if( ndims == 0 || step[ndims-1] > elemsize ) {
223 step[ndims] = elemsize;
227 if( ndims >= 2 && step[0] < step[1] )
229 std::swap(size[0], size[1]);
230 std::swap(step[0], step[1]);
234 if( ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize*size[2] )
237 type |= CV_MAKETYPE(0, size[2]);
240 if( ndims > 2 && !allowND )
242 failmsg("%s has more than 2 dimensions", name);
246 m = Mat(ndims, size, type, PyArray_DATA(o), step);
250 m.refcount = refcountFromPyObject(o);
251 m.addref(); // protect the original numpy array from deallocation
252 // (since Mat destructor will decrement the reference counter)
254 m.allocator = &g_numpyAllocator;
259 tmp.allocator = &g_numpyAllocator;
266 static PyObject* pyopencv_from(const Mat& m)
270 Mat temp, *p = (Mat*)&m;
271 if(!p->refcount || p->allocator != &g_numpyAllocator)
273 temp.allocator = &g_numpyAllocator;
278 return pyObjectFromRefcount(p->refcount);
281 static bool pyopencv_to(PyObject *o, Scalar& s, const char *name = "<unknown>")
283 if(!o || o == Py_None)
285 if (PySequence_Check(o)) {
286 PyObject *fi = PySequence_Fast(o, name);
289 if (4 < PySequence_Fast_GET_SIZE(fi))
291 failmsg("Scalar value for argument '%s' is longer than 4", name);
294 for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
295 PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
296 if (PyFloat_Check(item) || PyInt_Check(item)) {
297 s[(int)i] = PyFloat_AsDouble(item);
299 failmsg("Scalar value for argument '%s' is not numeric", name);
305 if (PyFloat_Check(o) || PyInt_Check(o)) {
306 s[0] = PyFloat_AsDouble(o);
308 failmsg("Scalar value for argument '%s' is not numeric", name);
315 static inline PyObject* pyopencv_from(const Scalar& src)
317 return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
320 static PyObject* pyopencv_from(bool value)
322 return PyBool_FromLong(value);
325 static bool pyopencv_to(PyObject* obj, bool& value, const char* name = "<unknown>")
327 if(!obj || obj == Py_None)
329 int _val = PyObject_IsTrue(obj);
336 static PyObject* pyopencv_from(size_t value)
338 return PyLong_FromUnsignedLong((unsigned long)value);
341 static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>")
343 if(!obj || obj == Py_None)
345 value = (int)PyLong_AsUnsignedLong(obj);
346 return value != -1 || !PyErr_Occurred();
349 static PyObject* pyopencv_from(int value)
351 return PyInt_FromLong(value);
354 static bool pyopencv_to(PyObject* obj, int& value, const char* name = "<unknown>")
356 if(!obj || obj == Py_None)
358 value = (int)PyInt_AsLong(obj);
359 return value != -1 || !PyErr_Occurred();
362 static PyObject* pyopencv_from(uchar value)
364 return PyInt_FromLong(value);
367 static bool pyopencv_to(PyObject* obj, uchar& value, const char* name = "<unknown>")
369 if(!obj || obj == Py_None)
371 value = (int)PyInt_AsLong(obj);
372 return value != -1 || !PyErr_Occurred();
375 static PyObject* pyopencv_from(double value)
377 return PyFloat_FromDouble(value);
380 static bool pyopencv_to(PyObject* obj, double& value, const char* name = "<unknown>")
382 if(!obj || obj == Py_None)
384 if(PyInt_CheckExact(obj))
385 value = (double)PyInt_AS_LONG(obj);
387 value = PyFloat_AsDouble(obj);
388 return !PyErr_Occurred();
391 static PyObject* pyopencv_from(float value)
393 return PyFloat_FromDouble(value);
396 static bool pyopencv_to(PyObject* obj, float& value, const char* name = "<unknown>")
398 if(!obj || obj == Py_None)
400 if(PyInt_CheckExact(obj))
401 value = (float)PyInt_AS_LONG(obj);
403 value = (float)PyFloat_AsDouble(obj);
404 return !PyErr_Occurred();
407 static PyObject* pyopencv_from(int64 value)
409 return PyFloat_FromDouble((double)value);
412 static PyObject* pyopencv_from(const string& value)
414 return PyString_FromString(value.empty() ? "" : value.c_str());
417 static bool pyopencv_to(PyObject* obj, string& value, const char* name = "<unknown>")
419 if(!obj || obj == Py_None)
421 char* str = PyString_AsString(obj);
428 static inline bool pyopencv_to(PyObject* obj, Size& sz, const char* name = "<unknown>")
430 if(!obj || obj == Py_None)
432 return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
435 static inline PyObject* pyopencv_from(const Size& sz)
437 return Py_BuildValue("(ii)", sz.width, sz.height);
440 static inline bool pyopencv_to(PyObject* obj, Rect& r, const char* name = "<unknown>")
442 if(!obj || obj == Py_None)
444 return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
447 static inline PyObject* pyopencv_from(const Rect& r)
449 return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
452 static inline bool pyopencv_to(PyObject* obj, Range& r, const char* name = "<unknown>")
454 if(!obj || obj == Py_None)
456 if(PyObject_Size(obj) == 0)
461 return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
464 static inline PyObject* pyopencv_from(const Range& r)
466 return Py_BuildValue("(ii)", r.start, r.end);
469 static inline bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name = "<unknown>")
471 if(!obj || obj == Py_None)
473 if(PyObject_Size(obj) == 0)
478 return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
481 static inline PyObject* pyopencv_from(const CvSlice& r)
483 return Py_BuildValue("(ii)", r.start_index, r.end_index);
486 static inline bool pyopencv_to(PyObject* obj, Point& p, const char* name = "<unknown>")
488 if(!obj || obj == Py_None)
490 if(PyComplex_CheckExact(obj))
492 Py_complex c = PyComplex_AsCComplex(obj);
493 p.x = saturate_cast<int>(c.real);
494 p.y = saturate_cast<int>(c.imag);
497 return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
500 static inline bool pyopencv_to(PyObject* obj, Point2f& p, const char* name = "<unknown>")
502 if(!obj || obj == Py_None)
504 if(PyComplex_CheckExact(obj))
506 Py_complex c = PyComplex_AsCComplex(obj);
507 p.x = saturate_cast<float>(c.real);
508 p.y = saturate_cast<float>(c.imag);
511 return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
514 static inline PyObject* pyopencv_from(const Point& p)
516 return Py_BuildValue("(ii)", p.x, p.y);
519 static inline PyObject* pyopencv_from(const Point2f& p)
521 return Py_BuildValue("(dd)", p.x, p.y);
524 static inline bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name = "<unknown>")
528 return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
531 static inline PyObject* pyopencv_from(const Vec3d& v)
533 return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
536 static inline PyObject* pyopencv_from(const Point2d& p)
538 return Py_BuildValue("(dd)", p.x, p.y);
541 template<typename _Tp> struct pyopencvVecConverter
543 static bool to(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
545 typedef typename DataType<_Tp>::channel_type _Cp;
546 if(!obj || obj == Py_None)
548 if (PyArray_Check(obj))
551 pyopencv_to(obj, m, name);
554 if (!PySequence_Check(obj))
556 PyObject *seq = PySequence_Fast(obj, name);
559 int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
562 int type = DataType<_Tp>::type;
563 int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
564 PyObject** items = PySequence_Fast_ITEMS(seq);
566 for( i = 0; i < n; i++ )
568 PyObject* item = items[i];
570 PyObject** items_i = &item;
571 _Cp* data = (_Cp*)&value[i];
573 if( channels == 2 && PyComplex_CheckExact(item) )
575 Py_complex c = PyComplex_AsCComplex(obj);
576 data[0] = saturate_cast<_Cp>(c.real);
577 data[1] = saturate_cast<_Cp>(c.imag);
582 if( PyArray_Check(item))
585 pyopencv_to(item, src, name);
586 if( src.dims != 2 || src.channels() != 1 ||
587 ((src.cols != 1 || src.rows != channels) &&
588 (src.cols != channels || src.rows != 1)))
590 Mat dst(src.rows, src.cols, depth, data);
591 src.convertTo(dst, type);
592 if( dst.data != (uchar*)data )
597 seq_i = PySequence_Fast(item, name);
598 if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
603 items_i = PySequence_Fast_ITEMS(seq_i);
606 for( j = 0; j < channels; j++ )
608 PyObject* item_ij = items_i[j];
609 if( PyInt_Check(item_ij))
611 int v = PyInt_AsLong(item_ij);
612 if( v == -1 && PyErr_Occurred() )
614 data[j] = saturate_cast<_Cp>(v);
616 else if( PyFloat_Check(item_ij))
618 double v = PyFloat_AsDouble(item_ij);
619 if( PyErr_Occurred() )
621 data[j] = saturate_cast<_Cp>(v);
634 static PyObject* from(const vector<_Tp>& value)
637 return PyTuple_New(0);
638 Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
639 return pyopencv_from(src);
644 template<typename _Tp> static inline bool pyopencv_to(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
646 return pyopencvVecConverter<_Tp>::to(obj, value, name);
649 template<typename _Tp> static inline PyObject* pyopencv_from(const vector<_Tp>& value)
651 return pyopencvVecConverter<_Tp>::from(value);
654 static PyObject* pyopencv_from(const KeyPoint&);
655 static PyObject* pyopencv_from(const DMatch&);
657 template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, vector<_Tp>& value, const char* name="<unknown>")
659 if(!obj || obj == Py_None)
661 if (!PySequence_Check(obj))
663 PyObject *seq = PySequence_Fast(obj, name);
666 int i, n = (int)PySequence_Fast_GET_SIZE(seq);
669 PyObject** items = PySequence_Fast_ITEMS(seq);
671 for( i = 0; i < n; i++ )
673 PyObject* item = items[i];
674 if(!pyopencv_to(item, value[i], name))
681 template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const vector<_Tp>& value)
683 int i, n = (int)value.size();
684 PyObject* seq = PyList_New(n);
685 for( i = 0; i < n; i++ )
687 PyObject* item = pyopencv_from(value[i]);
690 PyList_SET_ITEM(seq, i, item);
701 template<typename _Tp> struct pyopencvVecConverter<vector<_Tp> >
703 static bool to(PyObject* obj, vector<vector<_Tp> >& value, const char* name="<unknown>")
705 return pyopencv_to_generic_vec(obj, value, name);
708 static PyObject* from(const vector<vector<_Tp> >& value)
710 return pyopencv_from_generic_vec(value);
714 template<> struct pyopencvVecConverter<Mat>
716 static bool to(PyObject* obj, vector<Mat>& value, const char* name="<unknown>")
718 return pyopencv_to_generic_vec(obj, value, name);
721 static PyObject* from(const vector<Mat>& value)
723 return pyopencv_from_generic_vec(value);
727 template<> struct pyopencvVecConverter<KeyPoint>
729 static bool to(PyObject* obj, vector<KeyPoint>& value, const char* name="<unknown>")
731 return pyopencv_to_generic_vec(obj, value, name);
734 static PyObject* from(const vector<KeyPoint>& value)
736 return pyopencv_from_generic_vec(value);
740 template<> struct pyopencvVecConverter<DMatch>
742 static bool to(PyObject* obj, vector<DMatch>& value, const char* name="<unknown>")
744 return pyopencv_to_generic_vec(obj, value, name);
747 static PyObject* from(const vector<DMatch>& value)
749 return pyopencv_from_generic_vec(value);
754 static inline bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name="<unknown>")
758 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
761 static inline PyObject* pyopencv_from(const CvTermCriteria& src)
763 return Py_BuildValue("(iid)", src.type, src.max_iter, src.epsilon);
766 static inline bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name="<unknown>")
770 return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
773 static inline PyObject* pyopencv_from(const TermCriteria& src)
775 return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
778 static inline bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name="<unknown>")
782 return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
785 static inline PyObject* pyopencv_from(const RotatedRect& src)
787 return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
790 static inline PyObject* pyopencv_from(const Moments& m)
792 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}",
793 "m00", m.m00, "m10", m.m10, "m01", m.m01,
794 "m20", m.m20, "m11", m.m11, "m02", m.m02,
795 "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
796 "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
797 "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
798 "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
799 "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "mu03", m.nu03);
802 static inline PyObject* pyopencv_from(const CvDTreeNode* node)
804 double value = node->value;
805 int ivalue = cvRound(value);
806 return value == ivalue ? PyInt_FromLong(ivalue) : PyFloat_FromDouble(value);
809 static bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name="<unknown>")
812 PyObject* keys = PyObject_CallMethod(o,(char*)"keys",0);
813 PyObject* values = PyObject_CallMethod(o,(char*)"values",0);
817 int i, n = (int)PyList_GET_SIZE(keys);
818 for( i = 0; i < n; i++ )
820 PyObject* key = PyList_GET_ITEM(keys, i);
821 PyObject* item = PyList_GET_ITEM(values, i);
822 if( !PyString_Check(key) )
824 std::string k = PyString_AsString(key);
825 if( PyString_Check(item) )
827 const char* value = PyString_AsString(item);
828 p.setString(k, value);
830 else if( PyBool_Check(item) )
831 p.setBool(k, item == Py_True);
832 else if( PyInt_Check(item) )
834 int value = (int)PyInt_AsLong(item);
835 if( strcmp(k.c_str(), "algorithm") == 0 )
836 p.setAlgorithm(value);
840 else if( PyFloat_Check(item) )
842 double value = PyFloat_AsDouble(item);
843 p.setDouble(k, value);
848 ok = i == n && !PyErr_Occurred();
857 static bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name="<unknown>")
860 return pyopencv_to(o, *p, name);
864 static bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name="<unknown>")
867 bool ok = pyopencv_to(o, d, name);
868 dist = (cvflann::flann_distance_t)d;
872 ////////////////////////////////////////////////////////////////////////////////////////////////////
874 static void OnMouse(int event, int x, int y, int flags, void* param)
876 PyGILState_STATE gstate;
877 gstate = PyGILState_Ensure();
879 PyObject *o = (PyObject*)param;
880 PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
882 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
888 PyGILState_Release(gstate);
891 static PyObject *pycvSetMouseCallback(PyObject *self, PyObject *args, PyObject *kw)
893 const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
896 PyObject *param = NULL;
898 if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, ¶m))
900 if (!PyCallable_Check(on_mouse)) {
901 PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
907 ERRWRAP2(cvSetMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
911 void OnChange(int pos, void *param)
913 PyGILState_STATE gstate;
914 gstate = PyGILState_Ensure();
916 PyObject *o = (PyObject*)param;
917 PyObject *args = Py_BuildValue("(i)", pos);
918 PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
922 PyGILState_Release(gstate);
925 static PyObject *pycvCreateTrackbar(PyObject *self, PyObject *args)
930 int *value = new int;
933 if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
935 if (!PyCallable_Check(on_change)) {
936 PyErr_SetString(PyExc_TypeError, "on_change must be callable");
939 ERRWRAP2(cvCreateTrackbar2(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
943 ///////////////////////////////////////////////////////////////////////////////////////
945 #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return
947 #include "pyopencv_generated_types.h"
948 #include "pyopencv_generated_funcs.h"
950 static PyMethodDef methods[] = {
952 #include "pyopencv_generated_func_tab.h"
953 {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
954 {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
958 /************************************************************************/
961 static int to_ok(PyTypeObject *to)
963 to->tp_alloc = PyType_GenericAlloc;
964 to->tp_new = PyType_GenericNew;
965 to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
966 return (PyType_Ready(to) == 0);
969 #include "cv2.cv.hpp"
972 #if defined WIN32 || defined _WIN32
973 __declspec(dllexport)
983 #include "pyopencv_generated_type_reg.h"
986 PyObject* m = Py_InitModule(MODULESTR, methods);
987 PyObject* d = PyModule_GetDict(m);
989 PyDict_SetItemString(d, "__version__", PyString_FromString("$Rev: 4557 $"));
991 opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
992 PyDict_SetItemString(d, "error", opencv_error);
994 PyObject* cv_m = init_cv();
996 PyDict_SetItemString(d, "cv", cv_m);
998 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
999 #define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
1000 #define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))
1002 PUBLISHU(IPL_DEPTH_8U);
1003 PUBLISHU(IPL_DEPTH_8S);
1004 PUBLISHU(IPL_DEPTH_16U);
1005 PUBLISHU(IPL_DEPTH_16S);
1006 PUBLISHU(IPL_DEPTH_32S);
1007 PUBLISHU(IPL_DEPTH_32F);
1008 PUBLISHU(IPL_DEPTH_64F);
1010 PUBLISH(CV_LOAD_IMAGE_COLOR);
1011 PUBLISH(CV_LOAD_IMAGE_GRAYSCALE);
1012 PUBLISH(CV_LOAD_IMAGE_UNCHANGED);
1013 PUBLISH(CV_HIST_ARRAY);
1014 PUBLISH(CV_HIST_SPARSE);
1050 PUBLISH(CV_NEXT_AROUND_ORG);
1051 PUBLISH(CV_NEXT_AROUND_DST);
1052 PUBLISH(CV_PREV_AROUND_ORG);
1053 PUBLISH(CV_PREV_AROUND_DST);
1054 PUBLISH(CV_NEXT_AROUND_LEFT);
1055 PUBLISH(CV_NEXT_AROUND_RIGHT);
1056 PUBLISH(CV_PREV_AROUND_LEFT);
1057 PUBLISH(CV_PREV_AROUND_RIGHT);
1059 PUBLISH(CV_WINDOW_AUTOSIZE);
1061 PUBLISH(CV_PTLOC_INSIDE);
1062 PUBLISH(CV_PTLOC_ON_EDGE);
1063 PUBLISH(CV_PTLOC_VERTEX);
1064 PUBLISH(CV_PTLOC_OUTSIDE_RECT);
1070 PUBLISH(GC_INIT_WITH_RECT);
1071 PUBLISH(GC_INIT_WITH_MASK);
1074 PUBLISH(CV_ROW_SAMPLE);
1075 PUBLISH(CV_VAR_NUMERICAL);
1076 PUBLISH(CV_VAR_ORDERED);
1077 PUBLISH(CV_VAR_CATEGORICAL);
1081 #include "pyopencv_generated_const_reg.h"