1
#if defined(_MSC_VER) && (_MSC_VER >= 1800)
2
// eliminating duplicated round() declaration
8
#define MODULESTR "cv2"
9
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
10
#include <numpy/ndarrayobject.h>
12
#include "pyopencv_generated_include.h"
13
#include "opencv2/core/types_c.h"
15
#include "opencv2/opencv_modules.hpp"
17
#include "pycompat.hpp"
20
static PyObject* opencv_error = 0;
22
static int failmsg(const char *fmt, ...)
28
vsnprintf(str, sizeof(str), fmt, ap);
31
PyErr_SetString(PyExc_TypeError, str);
39
// more fields may be added if necessary
41
ArgInfo(const char * name_, bool outputarg_)
43
, outputarg(outputarg_) {}
45
// to match with older pyopencv_to function signature
46
operator const char *() const { return name; }
52
PyAllowThreads() : _state(PyEval_SaveThread()) {}
55
PyEval_RestoreThread(_state);
58
PyThreadState* _state;
64
PyEnsureGIL() : _state(PyGILState_Ensure()) {}
67
PyGILState_Release(_state);
70
PyGILState_STATE _state;
73
#define ERRWRAP2(expr) \
76
PyAllowThreads allowThreads; \
79
catch (const cv::Exception &e) \
81
PyErr_SetString(opencv_error, e.what()); \
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<Point3f> vector_Point3f;
95
typedef std::vector<Vec2f> vector_Vec2f;
96
typedef std::vector<Vec3f> vector_Vec3f;
97
typedef std::vector<Vec4f> vector_Vec4f;
98
typedef std::vector<Vec6f> vector_Vec6f;
99
typedef std::vector<Vec4i> vector_Vec4i;
100
typedef std::vector<Rect> vector_Rect;
101
typedef std::vector<Rect2d> vector_Rect2d;
102
typedef std::vector<KeyPoint> vector_KeyPoint;
103
typedef std::vector<Mat> vector_Mat;
104
typedef std::vector<DMatch> vector_DMatch;
105
typedef std::vector<String> vector_String;
106
typedef std::vector<Scalar> vector_Scalar;
108
typedef std::vector<std::vector<char> > vector_vector_char;
109
typedef std::vector<std::vector<Point> > vector_vector_Point;
110
typedef std::vector<std::vector<Point2f> > vector_vector_Point2f;
111
typedef std::vector<std::vector<Point3f> > vector_vector_Point3f;
112
typedef std::vector<std::vector<DMatch> > vector_vector_DMatch;
114
#ifdef HAVE_OPENCV_FEATURES2D
115
typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;
118
#ifdef HAVE_OPENCV_FLANN
119
typedef cvflann::flann_distance_t cvflann_flann_distance_t;
120
typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
123
#ifdef HAVE_OPENCV_STITCHING
124
typedef Stitcher::Status Status;
127
static PyObject* failmsgp(const char *fmt, ...)
133
vsnprintf(str, sizeof(str), fmt, ap);
136
PyErr_SetString(PyExc_TypeError, str);
140
class NumpyAllocator : public MatAllocator
143
NumpyAllocator() { stdAllocator = Mat::getStdAllocator(); }
146
UMatData* allocate(PyObject* o, int dims, const int* sizes, int type, size_t* step) const
148
UMatData* u = new UMatData(this);
149
u->data = u->origdata = (uchar*)PyArray_DATA((PyArrayObject*) o);
150
npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
151
for( int i = 0; i < dims - 1; i++ )
152
step[i] = (size_t)_strides[i];
153
step[dims-1] = CV_ELEM_SIZE(type);
154
u->size = sizes[0]*step[0];
159
UMatData* allocate(int dims0, const int* sizes, int type, void* data, size_t* step, int flags, UMatUsageFlags usageFlags) const
163
CV_Error(Error::StsAssert, "The data should normally be NULL!");
164
// probably this is safe to do in such extreme case
165
return stdAllocator->allocate(dims0, sizes, type, data, step, flags, usageFlags);
169
int depth = CV_MAT_DEPTH(type);
170
int cn = CV_MAT_CN(type);
171
const int f = (int)(sizeof(size_t)/8);
172
int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
173
depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
174
depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
175
depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
177
cv::AutoBuffer<npy_intp> _sizes(dims + 1);
178
for( i = 0; i < dims; i++ )
179
_sizes[i] = sizes[i];
182
PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
184
CV_Error_(Error::StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
185
return allocate(o, dims0, sizes, type, step);
188
bool allocate(UMatData* u, int accessFlags, UMatUsageFlags usageFlags) const
190
return stdAllocator->allocate(u, accessFlags, usageFlags);
193
void deallocate(UMatData* u) const
198
CV_Assert(u->urefcount >= 0);
199
CV_Assert(u->refcount >= 0);
202
PyObject* o = (PyObject*)u->userdata;
208
const MatAllocator* stdAllocator;
211
NumpyAllocator g_numpyAllocator;
214
template<typename T> static
215
bool pyopencv_to(PyObject* obj, T& p, const char* name = "<unknown>");
217
template<typename T> static
218
PyObject* pyopencv_from(const T& src);
220
enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };
222
// special case, when the convertor needs full ArgInfo structure
223
static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
226
if(!o || o == Py_None)
229
m.allocator = &g_numpyAllocator;
235
double v[] = {static_cast<double>(PyInt_AsLong((PyObject*)o)), 0., 0., 0.};
236
m = Mat(4, 1, CV_64F, v).clone();
239
if( PyFloat_Check(o) )
241
double v[] = {PyFloat_AsDouble((PyObject*)o), 0., 0., 0.};
242
m = Mat(4, 1, CV_64F, v).clone();
245
if( PyTuple_Check(o) )
247
int i, sz = (int)PyTuple_Size((PyObject*)o);
248
m = Mat(sz, 1, CV_64F);
249
for( i = 0; i < sz; i++ )
251
PyObject* oi = PyTuple_GET_ITEM(o, i);
252
if( PyInt_Check(oi) )
253
m.at<double>(i) = (double)PyInt_AsLong(oi);
254
else if( PyFloat_Check(oi) )
255
m.at<double>(i) = (double)PyFloat_AsDouble(oi);
258
failmsg("%s is not a numerical tuple", info.name);
266
if( !PyArray_Check(o) )
268
failmsg("%s is not a numpy array, neither a scalar", info.name);
272
PyArrayObject* oarr = (PyArrayObject*) o;
274
bool needcopy = false, needcast = false;
275
int typenum = PyArray_TYPE(oarr), new_typenum = typenum;
276
int type = typenum == NPY_UBYTE ? CV_8U :
277
typenum == NPY_BYTE ? CV_8S :
278
typenum == NPY_USHORT ? CV_16U :
279
typenum == NPY_SHORT ? CV_16S :
280
typenum == NPY_INT ? CV_32S :
281
typenum == NPY_INT32 ? CV_32S :
282
typenum == NPY_FLOAT ? CV_32F :
283
typenum == NPY_DOUBLE ? CV_64F : -1;
287
if( typenum == NPY_INT64 || typenum == NPY_UINT64 || typenum == NPY_LONG )
289
needcopy = needcast = true;
290
new_typenum = NPY_INT;
295
failmsg("%s data type = %d is not supported", info.name, typenum);
301
const int CV_MAX_DIM = 32;
304
int ndims = PyArray_NDIM(oarr);
305
if(ndims >= CV_MAX_DIM)
307
failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
311
int size[CV_MAX_DIM+1];
312
size_t step[CV_MAX_DIM+1];
313
size_t elemsize = CV_ELEM_SIZE1(type);
314
const npy_intp* _sizes = PyArray_DIMS(oarr);
315
const npy_intp* _strides = PyArray_STRIDES(oarr);
316
bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
318
for( int i = ndims-1; i >= 0 && !needcopy; i-- )
320
// these checks handle cases of
321
// a) multi-dimensional (ndims > 2) arrays, as well as simpler 1- and 2-dimensional cases
322
// b) transposed arrays, where _strides[] elements go in non-descending order
323
// c) flipped arrays, where some of _strides[] elements are negative
324
// the _sizes[i] > 1 is needed to avoid spurious copies when NPY_RELAXED_STRIDES is set
325
if( (i == ndims-1 && _sizes[i] > 1 && (size_t)_strides[i] != elemsize) ||
326
(i < ndims-1 && _sizes[i] > 1 && _strides[i] < _strides[i+1]) )
330
if( ismultichannel && _strides[1] != (npy_intp)elemsize*_sizes[2] )
337
failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
342
o = PyArray_Cast(oarr, new_typenum);
343
oarr = (PyArrayObject*) o;
346
oarr = PyArray_GETCONTIGUOUS(oarr);
347
o = (PyObject*) oarr;
350
_strides = PyArray_STRIDES(oarr);
353
// Normalize strides in case NPY_RELAXED_STRIDES is set
354
size_t default_step = elemsize;
355
for ( int i = ndims - 1; i >= 0; --i )
357
size[i] = (int)_sizes[i];
360
step[i] = (size_t)_strides[i];
361
default_step = step[i] * size[i];
365
step[i] = default_step;
366
default_step *= size[i];
370
// handle degenerate case
373
step[ndims] = elemsize;
380
type |= CV_MAKETYPE(0, size[2]);
383
if( ndims > 2 && !allowND )
385
failmsg("%s has more than 2 dimensions", info.name);
389
m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
390
m.u = g_numpyAllocator.allocate(o, ndims, size, type, step);
397
m.allocator = &g_numpyAllocator;
403
bool pyopencv_to(PyObject* o, Mat& m, const char* name)
405
return pyopencv_to(o, m, ArgInfo(name, 0));
409
PyObject* pyopencv_from(const Mat& m)
413
Mat temp, *p = (Mat*)&m;
414
if(!p->u || p->allocator != &g_numpyAllocator)
416
temp.allocator = &g_numpyAllocator;
417
ERRWRAP2(m.copyTo(temp));
420
PyObject* o = (PyObject*)p->u->userdata;
426
bool pyopencv_to(PyObject *o, Scalar& s, const char *name)
428
if(!o || o == Py_None)
430
if (PySequence_Check(o)) {
431
PyObject *fi = PySequence_Fast(o, name);
434
if (4 < PySequence_Fast_GET_SIZE(fi))
436
failmsg("Scalar value for argument '%s' is longer than 4", name);
439
for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
440
PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
441
if (PyFloat_Check(item) || PyInt_Check(item)) {
442
s[(int)i] = PyFloat_AsDouble(item);
444
failmsg("Scalar value for argument '%s' is not numeric", name);
450
if (PyFloat_Check(o) || PyInt_Check(o)) {
451
s[0] = PyFloat_AsDouble(o);
453
failmsg("Scalar value for argument '%s' is not numeric", name);
461
PyObject* pyopencv_from(const Scalar& src)
463
return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
467
PyObject* pyopencv_from(const bool& value)
469
return PyBool_FromLong(value);
472
#ifdef HAVE_OPENCV_STITCHING
474
PyObject* pyopencv_from(const Status& value)
476
return PyInt_FromLong(value);
481
bool pyopencv_to(PyObject* obj, bool& value, const char* name)
484
if(!obj || obj == Py_None)
486
int _val = PyObject_IsTrue(obj);
494
PyObject* pyopencv_from(const size_t& value)
496
return PyLong_FromSize_t(value);
500
bool pyopencv_to(PyObject* obj, size_t& value, const char* name)
503
if(!obj || obj == Py_None)
505
value = (int)PyLong_AsUnsignedLong(obj);
506
return value != (size_t)-1 || !PyErr_Occurred();
510
PyObject* pyopencv_from(const int& value)
512
return PyInt_FromLong(value);
515
#ifdef HAVE_OPENCV_FLANN
517
PyObject* pyopencv_from(const cvflann_flann_algorithm_t& value)
519
return PyInt_FromLong(int(value));
523
PyObject* pyopencv_from(const cvflann_flann_distance_t& value)
525
return PyInt_FromLong(int(value));
530
bool pyopencv_to(PyObject* obj, int& value, const char* name)
533
if(!obj || obj == Py_None)
536
value = (int)PyInt_AsLong(obj);
537
else if(PyLong_Check(obj))
538
value = (int)PyLong_AsLong(obj);
541
return value != -1 || !PyErr_Occurred();
545
PyObject* pyopencv_from(const uchar& value)
547
return PyInt_FromLong(value);
551
bool pyopencv_to(PyObject* obj, uchar& value, const char* name)
554
if(!obj || obj == Py_None)
556
int ivalue = (int)PyInt_AsLong(obj);
557
value = cv::saturate_cast<uchar>(ivalue);
558
return ivalue != -1 || !PyErr_Occurred();
562
PyObject* pyopencv_from(const double& value)
564
return PyFloat_FromDouble(value);
568
bool pyopencv_to(PyObject* obj, double& value, const char* name)
571
if(!obj || obj == Py_None)
573
if(!!PyInt_CheckExact(obj))
574
value = (double)PyInt_AS_LONG(obj);
576
value = PyFloat_AsDouble(obj);
577
return !PyErr_Occurred();
581
PyObject* pyopencv_from(const float& value)
583
return PyFloat_FromDouble(value);
587
bool pyopencv_to(PyObject* obj, float& value, const char* name)
590
if(!obj || obj == Py_None)
592
if(!!PyInt_CheckExact(obj))
593
value = (float)PyInt_AS_LONG(obj);
595
value = (float)PyFloat_AsDouble(obj);
596
return !PyErr_Occurred();
600
PyObject* pyopencv_from(const int64& value)
602
return PyLong_FromLongLong(value);
606
PyObject* pyopencv_from(const String& value)
608
return PyString_FromString(value.empty() ? "" : value.c_str());
612
bool pyopencv_to(PyObject* obj, String& value, const char* name)
615
if(!obj || obj == Py_None)
617
char* str = PyString_AsString(obj);
625
bool pyopencv_to(PyObject* obj, Size& sz, const char* name)
628
if(!obj || obj == Py_None)
630
return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
634
PyObject* pyopencv_from(const Size& sz)
636
return Py_BuildValue("(ii)", sz.width, sz.height);
640
bool pyopencv_to(PyObject* obj, Rect& r, const char* name)
643
if(!obj || obj == Py_None)
645
return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
649
PyObject* pyopencv_from(const Rect& r)
651
return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
655
bool pyopencv_to(PyObject* obj, Rect2d& r, const char* name)
658
if(!obj || obj == Py_None)
660
return PyArg_ParseTuple(obj, "dddd", &r.x, &r.y, &r.width, &r.height) > 0;
664
PyObject* pyopencv_from(const Rect2d& r)
666
return Py_BuildValue("(dddd)", r.x, r.y, r.width, r.height);
670
bool pyopencv_to(PyObject* obj, Range& r, const char* name)
673
if(!obj || obj == Py_None)
675
if(PyObject_Size(obj) == 0)
680
return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
684
PyObject* pyopencv_from(const Range& r)
686
return Py_BuildValue("(ii)", r.start, r.end);
690
bool pyopencv_to(PyObject* obj, Point& p, const char* name)
693
if(!obj || obj == Py_None)
695
if(!!PyComplex_CheckExact(obj))
697
Py_complex c = PyComplex_AsCComplex(obj);
698
p.x = saturate_cast<int>(c.real);
699
p.y = saturate_cast<int>(c.imag);
702
return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
706
bool pyopencv_to(PyObject* obj, Point2f& p, const char* name)
709
if(!obj || obj == Py_None)
711
if(!!PyComplex_CheckExact(obj))
713
Py_complex c = PyComplex_AsCComplex(obj);
714
p.x = saturate_cast<float>(c.real);
715
p.y = saturate_cast<float>(c.imag);
718
return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
722
bool pyopencv_to(PyObject* obj, Point2d& p, const char* name)
725
if(!obj || obj == Py_None)
727
if(!!PyComplex_CheckExact(obj))
729
Py_complex c = PyComplex_AsCComplex(obj);
730
p.x = saturate_cast<double>(c.real);
731
p.y = saturate_cast<double>(c.imag);
734
return PyArg_ParseTuple(obj, "dd", &p.x, &p.y) > 0;
738
bool pyopencv_to(PyObject* obj, Point3f& p, const char* name)
741
if(!obj || obj == Py_None)
743
return PyArg_ParseTuple(obj, "fff", &p.x, &p.y, &p.z) > 0;
747
bool pyopencv_to(PyObject* obj, Point3d& p, const char* name)
750
if(!obj || obj == Py_None)
752
return PyArg_ParseTuple(obj, "ddd", &p.x, &p.y, &p.z) > 0;
756
PyObject* pyopencv_from(const Point& p)
758
return Py_BuildValue("(ii)", p.x, p.y);
762
PyObject* pyopencv_from(const Point2f& p)
764
return Py_BuildValue("(dd)", p.x, p.y);
768
PyObject* pyopencv_from(const Point3f& p)
770
return Py_BuildValue("(ddd)", p.x, p.y, p.z);
774
bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name)
779
return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
783
PyObject* pyopencv_from(const Vec3d& v)
785
return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
789
PyObject* pyopencv_from(const Vec2d& v)
791
return Py_BuildValue("(dd)", v[0], v[1]);
795
PyObject* pyopencv_from(const Point2d& p)
797
return Py_BuildValue("(dd)", p.x, p.y);
801
PyObject* pyopencv_from(const Point3d& p)
803
return Py_BuildValue("(ddd)", p.x, p.y, p.y);
806
template<typename _Tp> struct pyopencvVecConverter
808
static bool to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
810
typedef typename DataType<_Tp>::channel_type _Cp;
811
if(!obj || obj == Py_None)
813
if (PyArray_Check(obj))
816
pyopencv_to(obj, m, info);
819
if (!PySequence_Check(obj))
821
PyObject *seq = PySequence_Fast(obj, info.name);
824
int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
827
int type = DataType<_Tp>::type;
828
int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
829
PyObject** items = PySequence_Fast_ITEMS(seq);
831
for( i = 0; i < n; i++ )
833
PyObject* item = items[i];
835
PyObject** items_i = &item;
836
_Cp* data = (_Cp*)&value[i];
838
if( channels == 2 && PyComplex_CheckExact(item) )
840
Py_complex c = PyComplex_AsCComplex(obj);
841
data[0] = saturate_cast<_Cp>(c.real);
842
data[1] = saturate_cast<_Cp>(c.imag);
847
if( PyArray_Check(item))
850
pyopencv_to(item, src, info);
851
if( src.dims != 2 || src.channels() != 1 ||
852
((src.cols != 1 || src.rows != channels) &&
853
(src.cols != channels || src.rows != 1)))
855
Mat dst(src.rows, src.cols, depth, data);
856
src.convertTo(dst, type);
857
if( dst.data != (uchar*)data )
862
seq_i = PySequence_Fast(item, info.name);
863
if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
868
items_i = PySequence_Fast_ITEMS(seq_i);
871
for( j = 0; j < channels; j++ )
873
PyObject* item_ij = items_i[j];
874
if( PyInt_Check(item_ij))
876
int v = (int)PyInt_AsLong(item_ij);
877
if( v == -1 && PyErr_Occurred() )
879
data[j] = saturate_cast<_Cp>(v);
881
else if( PyLong_Check(item_ij))
883
int v = (int)PyLong_AsLong(item_ij);
884
if( v == -1 && PyErr_Occurred() )
886
data[j] = saturate_cast<_Cp>(v);
888
else if( PyFloat_Check(item_ij))
890
double v = PyFloat_AsDouble(item_ij);
891
if( PyErr_Occurred() )
893
data[j] = saturate_cast<_Cp>(v);
906
static PyObject* from(const std::vector<_Tp>& value)
909
return PyTuple_New(0);
910
Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
911
return pyopencv_from(src);
915
template<typename _Tp>
916
bool pyopencv_to(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
918
return pyopencvVecConverter<_Tp>::to(obj, value, info);
921
template<typename _Tp>
922
PyObject* pyopencv_from(const std::vector<_Tp>& value)
924
return pyopencvVecConverter<_Tp>::from(value);
927
template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, std::vector<_Tp>& value, const ArgInfo info)
929
if(!obj || obj == Py_None)
931
if (!PySequence_Check(obj))
933
PyObject *seq = PySequence_Fast(obj, info.name);
936
int i, n = (int)PySequence_Fast_GET_SIZE(seq);
939
PyObject** items = PySequence_Fast_ITEMS(seq);
941
for( i = 0; i < n; i++ )
943
PyObject* item = items[i];
944
if(!pyopencv_to(item, value[i], info))
951
template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const std::vector<_Tp>& value)
953
int i, n = (int)value.size();
954
PyObject* seq = PyList_New(n);
955
for( i = 0; i < n; i++ )
957
PyObject* item = pyopencv_from(value[i]);
960
PyList_SET_ITEM(seq, i, item);
971
template<typename _Tp> struct pyopencvVecConverter<std::vector<_Tp> >
973
static bool to(PyObject* obj, std::vector<std::vector<_Tp> >& value, const ArgInfo info)
975
return pyopencv_to_generic_vec(obj, value, info);
978
static PyObject* from(const std::vector<std::vector<_Tp> >& value)
980
return pyopencv_from_generic_vec(value);
984
template<> struct pyopencvVecConverter<Mat>
986
static bool to(PyObject* obj, std::vector<Mat>& value, const ArgInfo info)
988
return pyopencv_to_generic_vec(obj, value, info);
991
static PyObject* from(const std::vector<Mat>& value)
993
return pyopencv_from_generic_vec(value);
997
template<> struct pyopencvVecConverter<KeyPoint>
999
static bool to(PyObject* obj, std::vector<KeyPoint>& value, const ArgInfo info)
1001
return pyopencv_to_generic_vec(obj, value, info);
1004
static PyObject* from(const std::vector<KeyPoint>& value)
1006
return pyopencv_from_generic_vec(value);
1010
template<> struct pyopencvVecConverter<DMatch>
1012
static bool to(PyObject* obj, std::vector<DMatch>& value, const ArgInfo info)
1014
return pyopencv_to_generic_vec(obj, value, info);
1017
static PyObject* from(const std::vector<DMatch>& value)
1019
return pyopencv_from_generic_vec(value);
1023
template<> struct pyopencvVecConverter<String>
1025
static bool to(PyObject* obj, std::vector<String>& value, const ArgInfo info)
1027
return pyopencv_to_generic_vec(obj, value, info);
1030
static PyObject* from(const std::vector<String>& value)
1032
return pyopencv_from_generic_vec(value);
1037
bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name)
1042
return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
1046
PyObject* pyopencv_from(const TermCriteria& src)
1048
return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
1052
bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name)
1057
return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
1061
PyObject* pyopencv_from(const RotatedRect& src)
1063
return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
1067
PyObject* pyopencv_from(const Moments& m)
1069
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}",
1070
"m00", m.m00, "m10", m.m10, "m01", m.m01,
1071
"m20", m.m20, "m11", m.m11, "m02", m.m02,
1072
"m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
1073
"mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
1074
"mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
1075
"nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
1076
"nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "nu03", m.nu03);
1079
#ifdef HAVE_OPENCV_FLANN
1081
bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name)
1085
PyObject* key = NULL;
1086
PyObject* item = NULL;
1089
if(PyDict_Check(o)) {
1090
while(PyDict_Next(o, &pos, &key, &item)) {
1091
if( !PyString_Check(key) ) {
1096
String k = PyString_AsString(key);
1097
if( PyString_Check(item) )
1099
const char* value = PyString_AsString(item);
1100
p.setString(k, value);
1102
else if( !!PyBool_Check(item) )
1103
p.setBool(k, item == Py_True);
1104
else if( PyInt_Check(item) )
1106
int value = (int)PyInt_AsLong(item);
1107
if( strcmp(k.c_str(), "algorithm") == 0 )
1108
p.setAlgorithm(value);
1112
else if( PyFloat_Check(item) )
1114
double value = PyFloat_AsDouble(item);
1115
p.setDouble(k, value);
1125
return ok && !PyErr_Occurred();
1129
bool pyopencv_to(PyObject* obj, cv::flann::SearchParams & value, const char * name)
1131
return pyopencv_to<cv::flann::IndexParams>(obj, value, name);
1135
template <typename T>
1136
bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name)
1139
return pyopencv_to(o, *p, name);
1142
#ifdef HAVE_OPENCV_FLANN
1144
bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name)
1147
bool ok = pyopencv_to(o, d, name);
1148
dist = (cvflann::flann_distance_t)d;
1154
////////////////////////////////////////////////////////////////////////////////////////////////////
1155
// TODO: REMOVE used only by ml wrapper
1158
bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name)
1163
return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
1167
bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name)
1170
if(!obj || obj == Py_None)
1172
if(PyObject_Size(obj) == 0)
1177
return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
1180
////////////////////////////////////////////////////////////////////////////////////////////////////
1182
static void OnMouse(int event, int x, int y, int flags, void* param)
1184
PyGILState_STATE gstate;
1185
gstate = PyGILState_Ensure();
1187
PyObject *o = (PyObject*)param;
1188
PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
1190
PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1196
PyGILState_Release(gstate);
1199
#ifdef HAVE_OPENCV_HIGHGUI
1200
static PyObject *pycvSetMouseCallback(PyObject*, PyObject *args, PyObject *kw)
1202
const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
1205
PyObject *param = NULL;
1207
if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, ¶m))
1209
if (!PyCallable_Check(on_mouse)) {
1210
PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
1213
if (param == NULL) {
1216
ERRWRAP2(setMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
1221
static void OnChange(int pos, void *param)
1223
PyGILState_STATE gstate;
1224
gstate = PyGILState_Ensure();
1226
PyObject *o = (PyObject*)param;
1227
PyObject *args = Py_BuildValue("(i)", pos);
1228
PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
1232
PyGILState_Release(gstate);
1235
#ifdef HAVE_OPENCV_HIGHGUI
1236
static PyObject *pycvCreateTrackbar(PyObject*, PyObject *args)
1238
PyObject *on_change;
1239
char* trackbar_name;
1241
int *value = new int;
1244
if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
1246
if (!PyCallable_Check(on_change)) {
1247
PyErr_SetString(PyExc_TypeError, "on_change must be callable");
1250
ERRWRAP2(createTrackbar(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
1255
///////////////////////////////////////////////////////////////////////////////////////
1257
static int convert_to_char(PyObject *o, char *dst, const char *name = "no_name")
1259
if (PyString_Check(o) && PyString_Size(o) == 1) {
1260
*dst = PyString_AsString(o)[0];
1264
return failmsg("Expected single character string for argument '%s'", name);
1268
#if PY_MAJOR_VERSION >= 3
1269
#define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return NULL;
1271
#define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return
1275
# pragma GCC diagnostic ignored "-Wunused-parameter"
1276
# pragma GCC diagnostic ignored "-Wmissing-field-initializers"
1279
#include "pyopencv_generated_types.h"
1280
#include "pyopencv_generated_funcs.h"
1282
static PyMethodDef special_methods[] = {
1283
#ifdef HAVE_OPENCV_HIGHGUI
1284
{"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
1285
{"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_VARARGS | METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
1290
/************************************************************************/
1299
static void init_submodule(PyObject * root, const char * name, PyMethodDef * methods, ConstDef * consts)
1301
// traverse and create nested submodules
1302
std::string s = name;
1303
size_t i = s.find('.');
1304
while (i < s.length() && i != std::string::npos)
1306
size_t j = s.find('.', i);
1307
if (j == std::string::npos)
1309
std::string short_name = s.substr(i, j-i);
1310
std::string full_name = s.substr(0, j);
1313
PyObject * d = PyModule_GetDict(root);
1314
PyObject * submod = PyDict_GetItemString(d, short_name.c_str());
1317
submod = PyImport_AddModule(full_name.c_str());
1318
PyDict_SetItemString(d, short_name.c_str(), submod);
1321
if (short_name != "")
1325
// populate module's dict
1326
PyObject * d = PyModule_GetDict(root);
1327
for (PyMethodDef * m = methods; m->ml_name != NULL; ++m)
1329
PyObject * method_obj = PyCFunction_NewEx(m, NULL, NULL);
1330
PyDict_SetItemString(d, m->ml_name, method_obj);
1331
Py_DECREF(method_obj);
1333
for (ConstDef * c = consts; c->name != NULL; ++c)
1335
PyDict_SetItemString(d, c->name, PyInt_FromLong(c->val));
1340
#include "pyopencv_generated_ns_reg.h"
1342
static int to_ok(PyTypeObject *to)
1344
to->tp_alloc = PyType_GenericAlloc;
1345
to->tp_new = PyType_GenericNew;
1346
to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
1347
return (PyType_Ready(to) == 0);
1351
#if PY_MAJOR_VERSION >= 3
1352
extern "C" CV_EXPORTS PyObject* PyInit_cv2();
1353
static struct PyModuleDef cv2_moduledef =
1355
PyModuleDef_HEAD_INIT,
1357
"Python wrapper for OpenCV.",
1358
-1, /* size of per-interpreter state of the module,
1359
or -1 if the module keeps state in global variables. */
1363
PyObject* PyInit_cv2()
1365
extern "C" CV_EXPORTS void initcv2();
1372
#include "pyopencv_generated_type_reg.h"
1374
#if PY_MAJOR_VERSION >= 3
1375
PyObject* m = PyModule_Create(&cv2_moduledef);
1377
PyObject* m = Py_InitModule(MODULESTR, special_methods);
1379
init_submodules(m); // from "pyopencv_generated_ns_reg.h"
1381
PyObject* d = PyModule_GetDict(m);
1383
PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION));
1385
opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
1386
PyDict_SetItemString(d, "error", opencv_error);
1388
#define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
1389
//#define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
1390
#define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))
1428
#if PY_MAJOR_VERSION >= 3