• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #if defined(_MSC_VER) && (_MSC_VER >= 1800)
2 // eliminating duplicated round() declaration
3 #define HAVE_ROUND
4 #endif
5 
6 #include <Python.h>
7 
8 #define MODULESTR "cv2"
9 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
10 #include <numpy/ndarrayobject.h>
11 
12 #include "pyopencv_generated_include.h"
13 #include "opencv2/core/types_c.h"
14 
15 #include "opencv2/opencv_modules.hpp"
16 
17 #include "pycompat.hpp"
18 
19 
20 static PyObject* opencv_error = 0;
21 
failmsg(const char * fmt,...)22 static int failmsg(const char *fmt, ...)
23 {
24     char str[1000];
25 
26     va_list ap;
27     va_start(ap, fmt);
28     vsnprintf(str, sizeof(str), fmt, ap);
29     va_end(ap);
30 
31     PyErr_SetString(PyExc_TypeError, str);
32     return 0;
33 }
34 
35 struct ArgInfo
36 {
37     const char * name;
38     bool outputarg;
39     // more fields may be added if necessary
40 
ArgInfoArgInfo41     ArgInfo(const char * name_, bool outputarg_)
42         : name(name_)
43         , outputarg(outputarg_) {}
44 
45     // to match with older pyopencv_to function signature
operator const char*ArgInfo46     operator const char *() const { return name; }
47 };
48 
49 class PyAllowThreads
50 {
51 public:
PyAllowThreads()52     PyAllowThreads() : _state(PyEval_SaveThread()) {}
~PyAllowThreads()53     ~PyAllowThreads()
54     {
55         PyEval_RestoreThread(_state);
56     }
57 private:
58     PyThreadState* _state;
59 };
60 
61 class PyEnsureGIL
62 {
63 public:
PyEnsureGIL()64     PyEnsureGIL() : _state(PyGILState_Ensure()) {}
~PyEnsureGIL()65     ~PyEnsureGIL()
66     {
67         PyGILState_Release(_state);
68     }
69 private:
70     PyGILState_STATE _state;
71 };
72 
73 #define ERRWRAP2(expr) \
74 try \
75 { \
76     PyAllowThreads allowThreads; \
77     expr; \
78 } \
79 catch (const cv::Exception &e) \
80 { \
81     PyErr_SetString(opencv_error, e.what()); \
82     return 0; \
83 }
84 
85 using namespace cv;
86 
87 typedef std::vector<uchar> vector_uchar;
88 typedef std::vector<char> vector_char;
89 typedef std::vector<int> vector_int;
90 typedef std::vector<float> vector_float;
91 typedef std::vector<double> vector_double;
92 typedef std::vector<Point> vector_Point;
93 typedef std::vector<Point2f> vector_Point2f;
94 typedef std::vector<Vec2f> vector_Vec2f;
95 typedef std::vector<Vec3f> vector_Vec3f;
96 typedef std::vector<Vec4f> vector_Vec4f;
97 typedef std::vector<Vec6f> vector_Vec6f;
98 typedef std::vector<Vec4i> vector_Vec4i;
99 typedef std::vector<Rect> vector_Rect;
100 typedef std::vector<KeyPoint> vector_KeyPoint;
101 typedef std::vector<Mat> vector_Mat;
102 typedef std::vector<DMatch> vector_DMatch;
103 typedef std::vector<String> vector_String;
104 typedef std::vector<Scalar> vector_Scalar;
105 
106 typedef std::vector<std::vector<char> > vector_vector_char;
107 typedef std::vector<std::vector<Point> > vector_vector_Point;
108 typedef std::vector<std::vector<Point2f> > vector_vector_Point2f;
109 typedef std::vector<std::vector<Point3f> > vector_vector_Point3f;
110 typedef std::vector<std::vector<DMatch> > vector_vector_DMatch;
111 
112 #ifdef HAVE_OPENCV_FEATURES2D
113 typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
114 #endif
115 
116 #ifdef HAVE_OPENCV_FLANN
117 typedef cvflann::flann_distance_t cvflann_flann_distance_t;
118 typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
119 #endif
120 
121 #ifdef HAVE_OPENCV_STITCHING
122 typedef Stitcher::Status Status;
123 #endif
124 
failmsgp(const char * fmt,...)125 static PyObject* failmsgp(const char *fmt, ...)
126 {
127   char str[1000];
128 
129   va_list ap;
130   va_start(ap, fmt);
131   vsnprintf(str, sizeof(str), fmt, ap);
132   va_end(ap);
133 
134   PyErr_SetString(PyExc_TypeError, str);
135   return 0;
136 }
137 
138 class NumpyAllocator : public MatAllocator
139 {
140 public:
NumpyAllocator()141     NumpyAllocator() { stdAllocator = Mat::getStdAllocator(); }
~NumpyAllocator()142     ~NumpyAllocator() {}
143 
allocate(PyObject * o,int dims,const int * sizes,int type,size_t * step) const144     UMatData* allocate(PyObject* o, int dims, const int* sizes, int type, size_t* step) const
145     {
146         UMatData* u = new UMatData(this);
147         u->data = u->origdata = (uchar*)PyArray_DATA((PyArrayObject*) o);
148         npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
149         for( int i = 0; i < dims - 1; i++ )
150             step[i] = (size_t)_strides[i];
151         step[dims-1] = CV_ELEM_SIZE(type);
152         u->size = sizes[0]*step[0];
153         u->userdata = o;
154         return u;
155     }
156 
allocate(int dims0,const int * sizes,int type,void * data,size_t * step,int flags,UMatUsageFlags usageFlags) const157     UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, int flags, UMatUsageFlags usageFlags) const
158     {
159         if( data != 0 )
160         {
161             CV_Error(Error::StsAssert, "The data should normally be NULL!");
162             // probably this is safe to do in such extreme case
163             return stdAllocator->allocate(dims0, sizes, type, data, step, flags, usageFlags);
164         }
165         PyEnsureGIL gil;
166 
167         int depth = CV_MAT_DEPTH(type);
168         int cn = CV_MAT_CN(type);
169         const int f = (int)(sizeof(size_t)/8);
170         int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
171         depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
172         depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
173         depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
174         int i, dims = dims0;
175         cv::AutoBuffer<npy_intp> _sizes(dims + 1);
176         for( i = 0; i < dims; i++ )
177             _sizes[i] = sizes[i];
178         if( cn > 1 )
179             _sizes[dims++] = cn;
180         PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
181         if(!o)
182             CV_Error_(Error::StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
183         return allocate(o, dims0, sizes, type, step);
184     }
185 
allocate(UMatData * u,int accessFlags,UMatUsageFlags usageFlags) const186     bool allocate(UMatData* u, int accessFlags, UMatUsageFlags usageFlags) const
187     {
188         return stdAllocator->allocate(u, accessFlags, usageFlags);
189     }
190 
deallocate(UMatData * u) const191     void deallocate(UMatData* u) const
192     {
193         if(u)
194         {
195             PyEnsureGIL gil;
196             PyObject* o = (PyObject*)u->userdata;
197             Py_XDECREF(o);
198             delete u;
199         }
200     }
201 
202     const MatAllocator* stdAllocator;
203 };
204 
205 NumpyAllocator g_numpyAllocator;
206 
207 
208 template<typename T> static
209 bool pyopencv_to(PyObject* obj, T& p, const char* name = "<unknown>");
210 
211 template<typename T> static
212 PyObject* pyopencv_from(const T& src);
213 
214 enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
215 
216 // special case, when the convertor needs full ArgInfo structure
pyopencv_to(PyObject * o,Mat & m,const ArgInfo info)217 static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
218 {
219     bool allowND = true;
220     if(!o || o == Py_None)
221     {
222         if( !m.data )
223             m.allocator = &g_numpyAllocator;
224         return true;
225     }
226 
227     if( PyInt_Check(o) )
228     {
229         double v[] = {static_cast<double>(PyInt_AsLong((PyObject*)o)), 0., 0., 0.};
230         m = Mat(4, 1, CV_64F, v).clone();
231         return true;
232     }
233     if( PyFloat_Check(o) )
234     {
235         double v[] = {PyFloat_AsDouble((PyObject*)o), 0., 0., 0.};
236         m = Mat(4, 1, CV_64F, v).clone();
237         return true;
238     }
239     if( PyTuple_Check(o) )
240     {
241         int i, sz = (int)PyTuple_Size((PyObject*)o);
242         m = Mat(sz, 1, CV_64F);
243         for( i = 0; i < sz; i++ )
244         {
245             PyObject* oi = PyTuple_GET_ITEM(o, i);
246             if( PyInt_Check(oi) )
247                 m.at<double>(i) = (double)PyInt_AsLong(oi);
248             else if( PyFloat_Check(oi) )
249                 m.at<double>(i) = (double)PyFloat_AsDouble(oi);
250             else
251             {
252                 failmsg("%s is not a numerical tuple", info.name);
253                 m.release();
254                 return false;
255             }
256         }
257         return true;
258     }
259 
260     if( !PyArray_Check(o) )
261     {
262         failmsg("%s is not a numpy array, neither a scalar", info.name);
263         return false;
264     }
265 
266     PyArrayObject* oarr = (PyArrayObject*) o;
267 
268     bool needcopy = false, needcast = false;
269     int typenum = PyArray_TYPE(oarr), new_typenum = typenum;
270     int type = typenum == NPY_UBYTE ? CV_8U :
271                typenum == NPY_BYTE ? CV_8S :
272                typenum == NPY_USHORT ? CV_16U :
273                typenum == NPY_SHORT ? CV_16S :
274                typenum == NPY_INT ? CV_32S :
275                typenum == NPY_INT32 ? CV_32S :
276                typenum == NPY_FLOAT ? CV_32F :
277                typenum == NPY_DOUBLE ? CV_64F : -1;
278 
279     if( type < 0 )
280     {
281         if( typenum == NPY_INT64 || typenum == NPY_UINT64 || type == NPY_LONG )
282         {
283             needcopy = needcast = true;
284             new_typenum = NPY_INT;
285             type = CV_32S;
286         }
287         else
288         {
289             failmsg("%s data type = %d is not supported", info.name, typenum);
290             return false;
291         }
292     }
293 
294 #ifndef CV_MAX_DIM
295     const int CV_MAX_DIM = 32;
296 #endif
297 
298     int ndims = PyArray_NDIM(oarr);
299     if(ndims >= CV_MAX_DIM)
300     {
301         failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
302         return false;
303     }
304 
305     int size[CV_MAX_DIM+1];
306     size_t step[CV_MAX_DIM+1];
307     size_t elemsize = CV_ELEM_SIZE1(type);
308     const npy_intp* _sizes = PyArray_DIMS(oarr);
309     const npy_intp* _strides = PyArray_STRIDES(oarr);
310     bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
311 
312     for( int i = ndims-1; i >= 0 && !needcopy; i-- )
313     {
314         // these checks handle cases of
315         //  a) multi-dimensional (ndims > 2) arrays, as well as simpler 1- and 2-dimensional cases
316         //  b) transposed arrays, where _strides[] elements go in non-descending order
317         //  c) flipped arrays, where some of _strides[] elements are negative
318         if( (i == ndims-1 && (size_t)_strides[i] != elemsize) ||
319             (i < ndims-1 && _strides[i] < _strides[i+1]) )
320             needcopy = true;
321     }
322 
323     if( ismultichannel && _strides[1] != (npy_intp)elemsize*_sizes[2] )
324         needcopy = true;
325 
326     if (needcopy)
327     {
328         if (info.outputarg)
329         {
330             failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
331             return false;
332         }
333 
334         if( needcast ) {
335             o = PyArray_Cast(oarr, new_typenum);
336             oarr = (PyArrayObject*) o;
337         }
338         else {
339             oarr = PyArray_GETCONTIGUOUS(oarr);
340             o = (PyObject*) oarr;
341         }
342 
343         _strides = PyArray_STRIDES(oarr);
344     }
345 
346     for(int i = 0; i < ndims; i++)
347     {
348         size[i] = (int)_sizes[i];
349         step[i] = (size_t)_strides[i];
350     }
351 
352     // handle degenerate case
353     if( ndims == 0) {
354         size[ndims] = 1;
355         step[ndims] = elemsize;
356         ndims++;
357     }
358 
359     if( ismultichannel )
360     {
361         ndims--;
362         type |= CV_MAKETYPE(0, size[2]);
363     }
364 
365     if( ndims > 2 && !allowND )
366     {
367         failmsg("%s has more than 2 dimensions", info.name);
368         return false;
369     }
370 
371     m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
372     m.u = g_numpyAllocator.allocate(o, ndims, size, type, step);
373     m.addref();
374 
375     if( !needcopy )
376     {
377         Py_INCREF(o);
378     }
379     m.allocator = &g_numpyAllocator;
380 
381     return true;
382 }
383 
384 template<>
pyopencv_to(PyObject * o,Mat & m,const char * name)385 bool pyopencv_to(PyObject* o, Mat& m, const char* name)
386 {
387     return pyopencv_to(o, m, ArgInfo(name, 0));
388 }
389 
390 template<>
pyopencv_from(const Mat & m)391 PyObject* pyopencv_from(const Mat& m)
392 {
393     if( !m.data )
394         Py_RETURN_NONE;
395     Mat temp, *p = (Mat*)&m;
396     if(!p->u || p->allocator != &g_numpyAllocator)
397     {
398         temp.allocator = &g_numpyAllocator;
399         ERRWRAP2(m.copyTo(temp));
400         p = &temp;
401     }
402     PyObject* o = (PyObject*)p->u->userdata;
403     Py_INCREF(o);
404     return o;
405 }
406 
407 template<>
pyopencv_to(PyObject * o,Scalar & s,const char * name)408 bool pyopencv_to(PyObject *o, Scalar& s, const char *name)
409 {
410     if(!o || o == Py_None)
411         return true;
412     if (PySequence_Check(o)) {
413         PyObject *fi = PySequence_Fast(o, name);
414         if (fi == NULL)
415             return false;
416         if (4 < PySequence_Fast_GET_SIZE(fi))
417         {
418             failmsg("Scalar value for argument '%s' is longer than 4", name);
419             return false;
420         }
421         for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
422             PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
423             if (PyFloat_Check(item) || PyInt_Check(item)) {
424                 s[(int)i] = PyFloat_AsDouble(item);
425             } else {
426                 failmsg("Scalar value for argument '%s' is not numeric", name);
427                 return false;
428             }
429         }
430         Py_DECREF(fi);
431     } else {
432         if (PyFloat_Check(o) || PyInt_Check(o)) {
433             s[0] = PyFloat_AsDouble(o);
434         } else {
435             failmsg("Scalar value for argument '%s' is not numeric", name);
436             return false;
437         }
438     }
439     return true;
440 }
441 
442 template<>
pyopencv_from(const Scalar & src)443 PyObject* pyopencv_from(const Scalar& src)
444 {
445     return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
446 }
447 
448 template<>
pyopencv_from(const bool & value)449 PyObject* pyopencv_from(const bool& value)
450 {
451     return PyBool_FromLong(value);
452 }
453 
454 #ifdef HAVE_OPENCV_STITCHING
455 template<>
pyopencv_from(const Status & value)456 PyObject* pyopencv_from(const Status& value)
457 {
458     return PyInt_FromLong(value);
459 }
460 #endif
461 
462 template<>
pyopencv_to(PyObject * obj,bool & value,const char * name)463 bool pyopencv_to(PyObject* obj, bool& value, const char* name)
464 {
465     (void)name;
466     if(!obj || obj == Py_None)
467         return true;
468     int _val = PyObject_IsTrue(obj);
469     if(_val < 0)
470         return false;
471     value = _val > 0;
472     return true;
473 }
474 
475 template<>
pyopencv_from(const size_t & value)476 PyObject* pyopencv_from(const size_t& value)
477 {
478     return PyLong_FromSize_t(value);
479 }
480 
481 template<>
pyopencv_to(PyObject * obj,size_t & value,const char * name)482 bool pyopencv_to(PyObject* obj, size_t& value, const char* name)
483 {
484     (void)name;
485     if(!obj || obj == Py_None)
486         return true;
487     value = (int)PyLong_AsUnsignedLong(obj);
488     return value != (size_t)-1 || !PyErr_Occurred();
489 }
490 
491 template<>
pyopencv_from(const int & value)492 PyObject* pyopencv_from(const int& value)
493 {
494     return PyInt_FromLong(value);
495 }
496 
497 #ifdef HAVE_OPENCV_FLANN
498 template<>
pyopencv_from(const cvflann_flann_algorithm_t & value)499 PyObject* pyopencv_from(const cvflann_flann_algorithm_t& value)
500 {
501     return PyInt_FromLong(int(value));
502 }
503 
504 template<>
pyopencv_from(const cvflann_flann_distance_t & value)505 PyObject* pyopencv_from(const cvflann_flann_distance_t& value)
506 {
507     return PyInt_FromLong(int(value));
508 }
509 #endif
510 
511 template<>
pyopencv_to(PyObject * obj,int & value,const char * name)512 bool pyopencv_to(PyObject* obj, int& value, const char* name)
513 {
514     (void)name;
515     if(!obj || obj == Py_None)
516         return true;
517     if(PyInt_Check(obj))
518         value = (int)PyInt_AsLong(obj);
519     else if(PyLong_Check(obj))
520         value = (int)PyLong_AsLong(obj);
521     else
522         return false;
523     return value != -1 || !PyErr_Occurred();
524 }
525 
526 template<>
pyopencv_from(const uchar & value)527 PyObject* pyopencv_from(const uchar& value)
528 {
529     return PyInt_FromLong(value);
530 }
531 
532 template<>
pyopencv_to(PyObject * obj,uchar & value,const char * name)533 bool pyopencv_to(PyObject* obj, uchar& value, const char* name)
534 {
535     (void)name;
536     if(!obj || obj == Py_None)
537         return true;
538     int ivalue = (int)PyInt_AsLong(obj);
539     value = cv::saturate_cast<uchar>(ivalue);
540     return ivalue != -1 || !PyErr_Occurred();
541 }
542 
543 template<>
pyopencv_from(const double & value)544 PyObject* pyopencv_from(const double& value)
545 {
546     return PyFloat_FromDouble(value);
547 }
548 
549 template<>
pyopencv_to(PyObject * obj,double & value,const char * name)550 bool pyopencv_to(PyObject* obj, double& value, const char* name)
551 {
552     (void)name;
553     if(!obj || obj == Py_None)
554         return true;
555     if(!!PyInt_CheckExact(obj))
556         value = (double)PyInt_AS_LONG(obj);
557     else
558         value = PyFloat_AsDouble(obj);
559     return !PyErr_Occurred();
560 }
561 
562 template<>
pyopencv_from(const float & value)563 PyObject* pyopencv_from(const float& value)
564 {
565     return PyFloat_FromDouble(value);
566 }
567 
568 template<>
pyopencv_to(PyObject * obj,float & value,const char * name)569 bool pyopencv_to(PyObject* obj, float& value, const char* name)
570 {
571     (void)name;
572     if(!obj || obj == Py_None)
573         return true;
574     if(!!PyInt_CheckExact(obj))
575         value = (float)PyInt_AS_LONG(obj);
576     else
577         value = (float)PyFloat_AsDouble(obj);
578     return !PyErr_Occurred();
579 }
580 
581 template<>
pyopencv_from(const int64 & value)582 PyObject* pyopencv_from(const int64& value)
583 {
584     return PyLong_FromLongLong(value);
585 }
586 
587 template<>
pyopencv_from(const String & value)588 PyObject* pyopencv_from(const String& value)
589 {
590     return PyString_FromString(value.empty() ? "" : value.c_str());
591 }
592 
593 template<>
pyopencv_to(PyObject * obj,String & value,const char * name)594 bool pyopencv_to(PyObject* obj, String& value, const char* name)
595 {
596     (void)name;
597     if(!obj || obj == Py_None)
598         return true;
599     char* str = PyString_AsString(obj);
600     if(!str)
601         return false;
602     value = String(str);
603     return true;
604 }
605 
606 template<>
pyopencv_to(PyObject * obj,Size & sz,const char * name)607 bool pyopencv_to(PyObject* obj, Size& sz, const char* name)
608 {
609     (void)name;
610     if(!obj || obj == Py_None)
611         return true;
612     return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
613 }
614 
615 template<>
pyopencv_from(const Size & sz)616 PyObject* pyopencv_from(const Size& sz)
617 {
618     return Py_BuildValue("(ii)", sz.width, sz.height);
619 }
620 
621 template<>
pyopencv_to(PyObject * obj,Rect & r,const char * name)622 bool pyopencv_to(PyObject* obj, Rect& r, const char* name)
623 {
624     (void)name;
625     if(!obj || obj == Py_None)
626         return true;
627     return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
628 }
629 
630 template<>
pyopencv_from(const Rect & r)631 PyObject* pyopencv_from(const Rect& r)
632 {
633     return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
634 }
635 
636 template<>
pyopencv_to(PyObject * obj,Range & r,const char * name)637 bool pyopencv_to(PyObject* obj, Range& r, const char* name)
638 {
639     (void)name;
640     if(!obj || obj == Py_None)
641         return true;
642     if(PyObject_Size(obj) == 0)
643     {
644         r = Range::all();
645         return true;
646     }
647     return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
648 }
649 
650 template<>
pyopencv_from(const Range & r)651 PyObject* pyopencv_from(const Range& r)
652 {
653     return Py_BuildValue("(ii)", r.start, r.end);
654 }
655 
656 template<>
pyopencv_to(PyObject * obj,Point & p,const char * name)657 bool pyopencv_to(PyObject* obj, Point& p, const char* name)
658 {
659     (void)name;
660     if(!obj || obj == Py_None)
661         return true;
662     if(!!PyComplex_CheckExact(obj))
663     {
664         Py_complex c = PyComplex_AsCComplex(obj);
665         p.x = saturate_cast<int>(c.real);
666         p.y = saturate_cast<int>(c.imag);
667         return true;
668     }
669     return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
670 }
671 
672 template<>
pyopencv_to(PyObject * obj,Point2f & p,const char * name)673 bool pyopencv_to(PyObject* obj, Point2f& p, const char* name)
674 {
675     (void)name;
676     if(!obj || obj == Py_None)
677         return true;
678     if(!!PyComplex_CheckExact(obj))
679     {
680         Py_complex c = PyComplex_AsCComplex(obj);
681         p.x = saturate_cast<float>(c.real);
682         p.y = saturate_cast<float>(c.imag);
683         return true;
684     }
685     return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
686 }
687 
688 template<>
pyopencv_to(PyObject * obj,Point2d & p,const char * name)689 bool pyopencv_to(PyObject* obj, Point2d& p, const char* name)
690 {
691     (void)name;
692     if(!obj || obj == Py_None)
693         return true;
694     if(!!PyComplex_CheckExact(obj))
695     {
696         Py_complex c = PyComplex_AsCComplex(obj);
697         p.x = saturate_cast<double>(c.real);
698         p.y = saturate_cast<double>(c.imag);
699         return true;
700     }
701     return PyArg_ParseTuple(obj, "dd", &p.x, &p.y) > 0;
702 }
703 
704 
705 template<>
pyopencv_from(const Point & p)706 PyObject* pyopencv_from(const Point& p)
707 {
708     return Py_BuildValue("(ii)", p.x, p.y);
709 }
710 
711 template<>
pyopencv_from(const Point2f & p)712 PyObject* pyopencv_from(const Point2f& p)
713 {
714     return Py_BuildValue("(dd)", p.x, p.y);
715 }
716 
717 template<>
pyopencv_to(PyObject * obj,Vec3d & v,const char * name)718 bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name)
719 {
720     (void)name;
721     if(!obj)
722         return true;
723     return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
724 }
725 
726 template<>
pyopencv_from(const Vec3d & v)727 PyObject* pyopencv_from(const Vec3d& v)
728 {
729     return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
730 }
731 
732 template<>
pyopencv_from(const Vec2d & v)733 PyObject* pyopencv_from(const Vec2d& v)
734 {
735     return Py_BuildValue("(dd)", v[0], v[1]);
736 }
737 
738 template<>
pyopencv_from(const Point2d & p)739 PyObject* pyopencv_from(const Point2d& p)
740 {
741     return Py_BuildValue("(dd)", p.x, p.y);
742 }
743 
744 template<typename _Tp> struct pyopencvVecConverter
745 {
topyopencvVecConverter746     static bool to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
747     {
748         typedef typename DataType<_Tp>::channel_type _Cp;
749         if(!obj || obj == Py_None)
750             return true;
751         if (PyArray_Check(obj))
752         {
753             Mat m;
754             pyopencv_to(obj, m, info);
755             m.copyTo(value);
756         }
757         if (!PySequence_Check(obj))
758             return false;
759         PyObject *seq = PySequence_Fast(obj, info.name);
760         if (seq == NULL)
761             return false;
762         int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
763         value.resize(n);
764 
765         int type = DataType<_Tp>::type;
766         int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
767         PyObject** items = PySequence_Fast_ITEMS(seq);
768 
769         for( i = 0; i < n; i++ )
770         {
771             PyObject* item = items[i];
772             PyObject* seq_i = 0;
773             PyObject** items_i = &item;
774             _Cp* data = (_Cp*)&value[i];
775 
776             if( channels == 2 && PyComplex_CheckExact(item) )
777             {
778                 Py_complex c = PyComplex_AsCComplex(obj);
779                 data[0] = saturate_cast<_Cp>(c.real);
780                 data[1] = saturate_cast<_Cp>(c.imag);
781                 continue;
782             }
783             if( channels > 1 )
784             {
785                 if( PyArray_Check(item))
786                 {
787                     Mat src;
788                     pyopencv_to(item, src, info);
789                     if( src.dims != 2 || src.channels() != 1 ||
790                        ((src.cols != 1 || src.rows != channels) &&
791                         (src.cols != channels || src.rows != 1)))
792                         break;
793                     Mat dst(src.rows, src.cols, depth, data);
794                     src.convertTo(dst, type);
795                     if( dst.data != (uchar*)data )
796                         break;
797                     continue;
798                 }
799 
800                 seq_i = PySequence_Fast(item, info.name);
801                 if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
802                 {
803                     Py_XDECREF(seq_i);
804                     break;
805                 }
806                 items_i = PySequence_Fast_ITEMS(seq_i);
807             }
808 
809             for( j = 0; j < channels; j++ )
810             {
811                 PyObject* item_ij = items_i[j];
812                 if( PyInt_Check(item_ij))
813                 {
814                     int v = (int)PyInt_AsLong(item_ij);
815                     if( v == -1 && PyErr_Occurred() )
816                         break;
817                     data[j] = saturate_cast<_Cp>(v);
818                 }
819                 else if( PyLong_Check(item_ij))
820                 {
821                     int v = (int)PyLong_AsLong(item_ij);
822                     if( v == -1 && PyErr_Occurred() )
823                         break;
824                     data[j] = saturate_cast<_Cp>(v);
825                 }
826                 else if( PyFloat_Check(item_ij))
827                 {
828                     double v = PyFloat_AsDouble(item_ij);
829                     if( PyErr_Occurred() )
830                         break;
831                     data[j] = saturate_cast<_Cp>(v);
832                 }
833                 else
834                     break;
835             }
836             Py_XDECREF(seq_i);
837             if( j < channels )
838                 break;
839         }
840         Py_DECREF(seq);
841         return i == n;
842     }
843 
frompyopencvVecConverter844     static PyObject* from(const std::vector<_Tp>& value)
845     {
846         if(value.empty())
847             return PyTuple_New(0);
848         Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
849         return pyopencv_from(src);
850     }
851 };
852 
853 template<typename _Tp>
pyopencv_to(PyObject * obj,std::vector<_Tp> & value,const ArgInfo info)854 bool pyopencv_to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
855 {
856     return pyopencvVecConverter<_Tp>::to(obj, value, info);
857 }
858 
859 template<typename _Tp>
pyopencv_from(const std::vector<_Tp> & value)860 PyObject* pyopencv_from(const std::vector<_Tp>& value)
861 {
862     return pyopencvVecConverter<_Tp>::from(value);
863 }
864 
pyopencv_to_generic_vec(PyObject * obj,std::vector<_Tp> & value,const ArgInfo info)865 template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
866 {
867     if(!obj || obj == Py_None)
868        return true;
869     if (!PySequence_Check(obj))
870         return false;
871     PyObject *seq = PySequence_Fast(obj, info.name);
872     if (seq == NULL)
873         return false;
874     int i, n = (int)PySequence_Fast_GET_SIZE(seq);
875     value.resize(n);
876 
877     PyObject** items = PySequence_Fast_ITEMS(seq);
878 
879     for( i = 0; i < n; i++ )
880     {
881         PyObject* item = items[i];
882         if(!pyopencv_to(item, value[i], info))
883             break;
884     }
885     Py_DECREF(seq);
886     return i == n;
887 }
888 
pyopencv_from_generic_vec(const std::vector<_Tp> & value)889 template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const std::vector<_Tp>& value)
890 {
891     int i, n = (int)value.size();
892     PyObject* seq = PyList_New(n);
893     for( i = 0; i < n; i++ )
894     {
895         PyObject* item = pyopencv_from(value[i]);
896         if(!item)
897             break;
898         PyList_SET_ITEM(seq, i, item);
899     }
900     if( i < n )
901     {
902         Py_DECREF(seq);
903         return 0;
904     }
905     return seq;
906 }
907 
908 
909 template<typename _Tp> struct pyopencvVecConverter<std::vector<_Tp> >
910 {
topyopencvVecConverter911     static bool to(PyObject* obj, std::vector<std::vector<_Tp> >& value, const ArgInfo info)
912     {
913         return pyopencv_to_generic_vec(obj, value, info);
914     }
915 
frompyopencvVecConverter916     static PyObject* from(const std::vector<std::vector<_Tp> >& value)
917     {
918         return pyopencv_from_generic_vec(value);
919     }
920 };
921 
922 template<> struct pyopencvVecConverter<Mat>
923 {
topyopencvVecConverter924     static bool to(PyObject* obj, std::vector<Mat>& value, const ArgInfo info)
925     {
926         return pyopencv_to_generic_vec(obj, value, info);
927     }
928 
frompyopencvVecConverter929     static PyObject* from(const std::vector<Mat>& value)
930     {
931         return pyopencv_from_generic_vec(value);
932     }
933 };
934 
935 template<> struct pyopencvVecConverter<KeyPoint>
936 {
topyopencvVecConverter937     static bool to(PyObject* obj, std::vector<KeyPoint>& value, const ArgInfo info)
938     {
939         return pyopencv_to_generic_vec(obj, value, info);
940     }
941 
frompyopencvVecConverter942     static PyObject* from(const std::vector<KeyPoint>& value)
943     {
944         return pyopencv_from_generic_vec(value);
945     }
946 };
947 
948 template<> struct pyopencvVecConverter<DMatch>
949 {
topyopencvVecConverter950     static bool to(PyObject* obj, std::vector<DMatch>& value, const ArgInfo info)
951     {
952         return pyopencv_to_generic_vec(obj, value, info);
953     }
954 
frompyopencvVecConverter955     static PyObject* from(const std::vector<DMatch>& value)
956     {
957         return pyopencv_from_generic_vec(value);
958     }
959 };
960 
961 template<> struct pyopencvVecConverter<String>
962 {
topyopencvVecConverter963     static bool to(PyObject* obj, std::vector<String>& value, const ArgInfo info)
964     {
965         return pyopencv_to_generic_vec(obj, value, info);
966     }
967 
frompyopencvVecConverter968     static PyObject* from(const std::vector<String>& value)
969     {
970         return pyopencv_from_generic_vec(value);
971     }
972 };
973 
974 template<>
pyopencv_to(PyObject * obj,TermCriteria & dst,const char * name)975 bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name)
976 {
977     (void)name;
978     if(!obj)
979         return true;
980     return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
981 }
982 
983 template<>
pyopencv_from(const TermCriteria & src)984 PyObject* pyopencv_from(const TermCriteria& src)
985 {
986     return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
987 }
988 
989 template<>
pyopencv_to(PyObject * obj,RotatedRect & dst,const char * name)990 bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name)
991 {
992     (void)name;
993     if(!obj)
994         return true;
995     return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
996 }
997 
998 template<>
pyopencv_from(const RotatedRect & src)999 PyObject* pyopencv_from(const RotatedRect& src)
1000 {
1001     return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
1002 }
1003 
1004 template<>
pyopencv_from(const Moments & m)1005 PyObject* pyopencv_from(const Moments& m)
1006 {
1007     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}",
1008                          "m00", m.m00, "m10", m.m10, "m01", m.m01,
1009                          "m20", m.m20, "m11", m.m11, "m02", m.m02,
1010                          "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
1011                          "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
1012                          "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
1013                          "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
1014                          "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "nu03", m.nu03);
1015 }
1016 
1017 #ifdef HAVE_OPENCV_FLANN
1018 template<>
pyopencv_to(PyObject * o,cv::flann::IndexParams & p,const char * name)1019 bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name)
1020 {
1021     (void)name;
1022     bool ok = true;
1023     PyObject* key = NULL;
1024     PyObject* item = NULL;
1025     Py_ssize_t pos = 0;
1026 
1027     if(PyDict_Check(o)) {
1028         while(PyDict_Next(o, &pos, &key, &item)) {
1029             if( !PyString_Check(key) ) {
1030                 ok = false;
1031                 break;
1032             }
1033 
1034             String k = PyString_AsString(key);
1035             if( PyString_Check(item) )
1036             {
1037                 const char* value = PyString_AsString(item);
1038                 p.setString(k, value);
1039             }
1040             else if( !!PyBool_Check(item) )
1041                 p.setBool(k, item == Py_True);
1042             else if( PyInt_Check(item) )
1043             {
1044                 int value = (int)PyInt_AsLong(item);
1045                 if( strcmp(k.c_str(), "algorithm") == 0 )
1046                     p.setAlgorithm(value);
1047                 else
1048                     p.setInt(k, value);
1049             }
1050             else if( PyFloat_Check(item) )
1051             {
1052                 double value = PyFloat_AsDouble(item);
1053                 p.setDouble(k, value);
1054             }
1055             else
1056             {
1057                 ok = false;
1058                 break;
1059             }
1060         }
1061     }
1062 
1063     return ok && !PyErr_Occurred();
1064 }
1065 
1066 template<>
pyopencv_to(PyObject * obj,cv::flann::SearchParams & value,const char * name)1067 bool pyopencv_to(PyObject* obj, cv::flann::SearchParams & value, const char * name)
1068 {
1069     return pyopencv_to<cv::flann::IndexParams>(obj, value, name);
1070 }
1071 #endif
1072 
1073 template <typename T>
pyopencv_to(PyObject * o,Ptr<T> & p,const char * name)1074 bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name)
1075 {
1076     p = makePtr<T>();
1077     return pyopencv_to(o, *p, name);
1078 }
1079 
1080 #ifdef HAVE_OPENCV_FLANN
1081 template<>
pyopencv_to(PyObject * o,cvflann::flann_distance_t & dist,const char * name)1082 bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name)
1083 {
1084     int d = (int)dist;
1085     bool ok = pyopencv_to(o, d, name);
1086     dist = (cvflann::flann_distance_t)d;
1087     return ok;
1088 }
1089 #endif
1090 
1091 
1092 ////////////////////////////////////////////////////////////////////////////////////////////////////
1093 // TODO: REMOVE used only by ml wrapper
1094 
1095 template<>
pyopencv_to(PyObject * obj,CvTermCriteria & dst,const char * name)1096 bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name)
1097 {
1098     (void)name;
1099     if(!obj)
1100         return true;
1101     return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
1102 }
1103 
1104 template<>
pyopencv_to(PyObject * obj,CvSlice & r,const char * name)1105 bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name)
1106 {
1107     (void)name;
1108     if(!obj || obj == Py_None)
1109         return true;
1110     if(PyObject_Size(obj) == 0)
1111     {
1112         r = CV_WHOLE_SEQ;
1113         return true;
1114     }
1115     return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
1116 }
1117 
1118 ////////////////////////////////////////////////////////////////////////////////////////////////////
1119 
OnMouse(int event,int x,int y,int flags,void * param)1120 static void OnMouse(int event, int x, int y, int flags, void* param)
1121 {
1122     PyGILState_STATE gstate;
1123     gstate = PyGILState_Ensure();
1124 
1125     PyObject *o = (PyObject*)param;
1126     PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
1127 
1128     PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1129     if (r == NULL)
1130         PyErr_Print();
1131     else
1132         Py_DECREF(r);
1133     Py_DECREF(args);
1134     PyGILState_Release(gstate);
1135 }
1136 
1137 #ifdef HAVE_OPENCV_HIGHGUI
pycvSetMouseCallback(PyObject *,PyObject * args,PyObject * kw)1138 static PyObject *pycvSetMouseCallback(PyObject*, PyObject *args, PyObject *kw)
1139 {
1140     const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
1141     char* name;
1142     PyObject *on_mouse;
1143     PyObject *param = NULL;
1144 
1145     if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, &param))
1146         return NULL;
1147     if (!PyCallable_Check(on_mouse)) {
1148         PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
1149         return NULL;
1150     }
1151     if (param == NULL) {
1152         param = Py_None;
1153     }
1154     ERRWRAP2(setMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
1155     Py_RETURN_NONE;
1156 }
1157 #endif
1158 
OnChange(int pos,void * param)1159 static void OnChange(int pos, void *param)
1160 {
1161     PyGILState_STATE gstate;
1162     gstate = PyGILState_Ensure();
1163 
1164     PyObject *o = (PyObject*)param;
1165     PyObject *args = Py_BuildValue("(i)", pos);
1166     PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1167     if (r == NULL)
1168         PyErr_Print();
1169     Py_DECREF(args);
1170     PyGILState_Release(gstate);
1171 }
1172 
1173 #ifdef HAVE_OPENCV_HIGHGUI
pycvCreateTrackbar(PyObject *,PyObject * args)1174 static PyObject *pycvCreateTrackbar(PyObject*, PyObject *args)
1175 {
1176     PyObject *on_change;
1177     char* trackbar_name;
1178     char* window_name;
1179     int *value = new int;
1180     int count;
1181 
1182     if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
1183         return NULL;
1184     if (!PyCallable_Check(on_change)) {
1185         PyErr_SetString(PyExc_TypeError, "on_change must be callable");
1186         return NULL;
1187     }
1188     ERRWRAP2(createTrackbar(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
1189     Py_RETURN_NONE;
1190 }
1191 #endif
1192 
1193 ///////////////////////////////////////////////////////////////////////////////////////
1194 
convert_to_char(PyObject * o,char * dst,const char * name="no_name")1195 static int convert_to_char(PyObject *o, char *dst, const char *name = "no_name")
1196 {
1197   if (PyString_Check(o) && PyString_Size(o) == 1) {
1198     *dst = PyString_AsString(o)[0];
1199     return 1;
1200   } else {
1201     (*dst) = 0;
1202     return failmsg("Expected single character string for argument '%s'", name);
1203   }
1204 }
1205 
1206 #if PY_MAJOR_VERSION >= 3
1207 #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return NULL;
1208 #else
1209 #define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return
1210 #endif
1211 
1212 #ifdef __GNUC__
1213 #  pragma GCC diagnostic ignored "-Wunused-parameter"
1214 #  pragma GCC diagnostic ignored "-Wmissing-field-initializers"
1215 #endif
1216 
1217 #include "pyopencv_generated_types.h"
1218 #include "pyopencv_generated_funcs.h"
1219 
1220 static PyMethodDef special_methods[] = {
1221 #ifdef HAVE_OPENCV_HIGHGUI
1222   {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
1223   {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_VARARGS | METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
1224 #endif
1225   {NULL, NULL},
1226 };
1227 
1228 /************************************************************************/
1229 /* Module init */
1230 
1231 struct ConstDef
1232 {
1233     const char * name;
1234     long val;
1235 };
1236 
init_submodule(PyObject * root,const char * name,PyMethodDef * methods,ConstDef * consts)1237 static void init_submodule(PyObject * root, const char * name, PyMethodDef * methods, ConstDef * consts)
1238 {
1239   // traverse and create nested submodules
1240   std::string s = name;
1241   size_t i = s.find('.');
1242   while (i < s.length() && i != std::string::npos)
1243   {
1244     size_t j = s.find('.', i);
1245     if (j == std::string::npos)
1246         j = s.length();
1247     std::string short_name = s.substr(i, j-i);
1248     std::string full_name = s.substr(0, j);
1249     i = j+1;
1250 
1251     PyObject * d = PyModule_GetDict(root);
1252     PyObject * submod = PyDict_GetItemString(d, short_name.c_str());
1253     if (submod == NULL)
1254     {
1255         submod = PyImport_AddModule(full_name.c_str());
1256         PyDict_SetItemString(d, short_name.c_str(), submod);
1257     }
1258 
1259     if (short_name != "")
1260         root = submod;
1261   }
1262 
1263   // populate module's dict
1264   PyObject * d = PyModule_GetDict(root);
1265   for (PyMethodDef * m = methods; m->ml_name != NULL; ++m)
1266   {
1267     PyObject * method_obj = PyCFunction_NewEx(m, NULL, NULL);
1268     PyDict_SetItemString(d, m->ml_name, method_obj);
1269     Py_DECREF(method_obj);
1270   }
1271   for (ConstDef * c = consts; c->name != NULL; ++c)
1272   {
1273     PyDict_SetItemString(d, c->name, PyInt_FromLong(c->val));
1274   }
1275 
1276 }
1277 
1278 #include "pyopencv_generated_ns_reg.h"
1279 
to_ok(PyTypeObject * to)1280 static int to_ok(PyTypeObject *to)
1281 {
1282   to->tp_alloc = PyType_GenericAlloc;
1283   to->tp_new = PyType_GenericNew;
1284   to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
1285   return (PyType_Ready(to) == 0);
1286 }
1287 
1288 
1289 #if PY_MAJOR_VERSION >= 3
1290 extern "C" CV_EXPORTS PyObject* PyInit_cv2();
1291 static struct PyModuleDef cv2_moduledef =
1292 {
1293     PyModuleDef_HEAD_INIT,
1294     MODULESTR,
1295     "Python wrapper for OpenCV.",
1296     -1,     /* size of per-interpreter state of the module,
1297                or -1 if the module keeps state in global variables. */
1298     special_methods
1299 };
1300 
PyInit_cv2()1301 PyObject* PyInit_cv2()
1302 #else
1303 extern "C" CV_EXPORTS void initcv2();
1304 
1305 void initcv2()
1306 #endif
1307 {
1308   import_array();
1309 
1310 #include "pyopencv_generated_type_reg.h"
1311 
1312 #if PY_MAJOR_VERSION >= 3
1313   PyObject* m = PyModule_Create(&cv2_moduledef);
1314 #else
1315   PyObject* m = Py_InitModule(MODULESTR, special_methods);
1316 #endif
1317   init_submodules(m); // from "pyopencv_generated_ns_reg.h"
1318 
1319   PyObject* d = PyModule_GetDict(m);
1320 
1321   PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION));
1322 
1323   opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
1324   PyDict_SetItemString(d, "error", opencv_error);
1325 
1326 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
1327 //#define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
1328 #define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))
1329 
1330   PUBLISH(CV_8U);
1331   PUBLISH(CV_8UC1);
1332   PUBLISH(CV_8UC2);
1333   PUBLISH(CV_8UC3);
1334   PUBLISH(CV_8UC4);
1335   PUBLISH(CV_8S);
1336   PUBLISH(CV_8SC1);
1337   PUBLISH(CV_8SC2);
1338   PUBLISH(CV_8SC3);
1339   PUBLISH(CV_8SC4);
1340   PUBLISH(CV_16U);
1341   PUBLISH(CV_16UC1);
1342   PUBLISH(CV_16UC2);
1343   PUBLISH(CV_16UC3);
1344   PUBLISH(CV_16UC4);
1345   PUBLISH(CV_16S);
1346   PUBLISH(CV_16SC1);
1347   PUBLISH(CV_16SC2);
1348   PUBLISH(CV_16SC3);
1349   PUBLISH(CV_16SC4);
1350   PUBLISH(CV_32S);
1351   PUBLISH(CV_32SC1);
1352   PUBLISH(CV_32SC2);
1353   PUBLISH(CV_32SC3);
1354   PUBLISH(CV_32SC4);
1355   PUBLISH(CV_32F);
1356   PUBLISH(CV_32FC1);
1357   PUBLISH(CV_32FC2);
1358   PUBLISH(CV_32FC3);
1359   PUBLISH(CV_32FC4);
1360   PUBLISH(CV_64F);
1361   PUBLISH(CV_64FC1);
1362   PUBLISH(CV_64FC2);
1363   PUBLISH(CV_64FC3);
1364   PUBLISH(CV_64FC4);
1365 
1366 #if PY_MAJOR_VERSION >= 3
1367     return m;
1368 #endif
1369 }
1370