cv2.cpp 34.2 KB
Newer Older
1 2 3 4 5 6 7 8
#include <Python.h>

#if !PYTHON_USE_NUMPY
#error "The module can only be built if NumPy is available"
#endif

#define MODULESTR "cv2"

9
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
10
#include "numpy/ndarrayobject.h"
11 12

#include "opencv2/core/core.hpp"
13
#include "opencv2/contrib/contrib.hpp"
14
#include "opencv2/flann/miniflann.hpp"
V
Vadim Pisarevsky 已提交
15 16 17 18 19 20 21
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/video/background_segm.hpp"
22
#include "opencv2/photo/photo.hpp"
V
Vadim Pisarevsky 已提交
23
#include "opencv2/highgui/highgui.hpp"
24

25
#include "opencv2/opencv_modules.hpp"
26

27
#ifdef HAVE_OPENCV_NONFREE
28
#  include "opencv2/nonfree/nonfree.hpp"
29 30
#endif

31 32 33
using cv::flann::IndexParams;
using cv::flann::SearchParams;

34 35 36 37 38
static PyObject* opencv_error = 0;

static int failmsg(const char *fmt, ...)
{
    char str[1000];
39

40 41 42 43
    va_list ap;
    va_start(ap, fmt);
    vsnprintf(str, sizeof(str), fmt, ap);
    va_end(ap);
44

45 46 47 48
    PyErr_SetString(PyExc_TypeError, str);
    return 0;
}

49 50 51 52 53 54
struct ArgInfo
{
    const char * name;
    bool outputarg;
    // more fields may be added if necessary

55
    ArgInfo(const char * name_, bool outputarg_)
56 57 58 59 60 61 62
        : name(name_)
        , outputarg(outputarg_) {}

    // to match with older pyopencv_to function signature
    operator const char *() const { return name; }
};

63 64 65 66
class PyAllowThreads
{
public:
    PyAllowThreads() : _state(PyEval_SaveThread()) {}
67
    ~PyAllowThreads()
68 69 70 71 72 73 74
    {
        PyEval_RestoreThread(_state);
    }
private:
    PyThreadState* _state;
};

A
Alexander Mordvintsev 已提交
75 76 77 78
class PyEnsureGIL
{
public:
    PyEnsureGIL() : _state(PyGILState_Ensure()) {}
79
    ~PyEnsureGIL()
A
Alexander Mordvintsev 已提交
80 81 82 83 84 85 86
    {
        PyGILState_Release(_state);
    }
private:
    PyGILState_STATE _state;
};

87 88 89
#define ERRWRAP2(expr) \
try \
{ \
90
    PyAllowThreads allowThreads; \
91 92 93 94 95 96 97 98
    expr; \
} \
catch (const cv::Exception &e) \
{ \
    PyErr_SetString(opencv_error, e.what()); \
    return 0; \
}

V
Vadim Pisarevsky 已提交
99 100 101 102 103 104 105 106 107 108
using namespace cv;

typedef vector<uchar> vector_uchar;
typedef vector<int> vector_int;
typedef vector<float> vector_float;
typedef vector<double> vector_double;
typedef vector<Point> vector_Point;
typedef vector<Point2f> vector_Point2f;
typedef vector<Vec2f> vector_Vec2f;
typedef vector<Vec3f> vector_Vec3f;
109 110
typedef vector<Vec4f> vector_Vec4f;
typedef vector<Vec6f> vector_Vec6f;
V
Vadim Pisarevsky 已提交
111 112 113 114
typedef vector<Vec4i> vector_Vec4i;
typedef vector<Rect> vector_Rect;
typedef vector<KeyPoint> vector_KeyPoint;
typedef vector<Mat> vector_Mat;
115
typedef vector<DMatch> vector_DMatch;
V
Vadim Pisarevsky 已提交
116
typedef vector<string> vector_string;
V
Vadim Pisarevsky 已提交
117 118 119
typedef vector<vector<Point> > vector_vector_Point;
typedef vector<vector<Point2f> > vector_vector_Point2f;
typedef vector<vector<Point3f> > vector_vector_Point3f;
120 121
typedef vector<vector<DMatch> > vector_vector_DMatch;

V
Vadim Pisarevsky 已提交
122
typedef Ptr<Algorithm> Ptr_Algorithm;
123 124
typedef Ptr<FeatureDetector> Ptr_FeatureDetector;
typedef Ptr<DescriptorExtractor> Ptr_DescriptorExtractor;
125
typedef Ptr<Feature2D> Ptr_Feature2D;
126
typedef Ptr<DescriptorMatcher> Ptr_DescriptorMatcher;
127
typedef Ptr<CLAHE> Ptr_CLAHE;
V
Vadim Pisarevsky 已提交
128

129 130
typedef SimpleBlobDetector::Params SimpleBlobDetector_Params;

131 132 133 134 135
typedef cvflann::flann_distance_t cvflann_flann_distance_t;
typedef cvflann::flann_algorithm_t cvflann_flann_algorithm_t;
typedef Ptr<flann::IndexParams> Ptr_flann_IndexParams;
typedef Ptr<flann::SearchParams> Ptr_flann_SearchParams;

136 137 138
typedef Ptr<FaceRecognizer> Ptr_FaceRecognizer;
typedef vector<Scalar> vector_Scalar;

V
Vadim Pisarevsky 已提交
139 140 141 142 143 144 145 146 147 148 149 150 151
static PyObject* failmsgp(const char *fmt, ...)
{
  char str[1000];

  va_list ap;
  va_start(ap, fmt);
  vsnprintf(str, sizeof(str), fmt, ap);
  va_end(ap);

  PyErr_SetString(PyExc_TypeError, str);
  return 0;
}

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
    (0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);

static inline PyObject* pyObjectFromRefcount(const int* refcount)
{
    return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
}

static inline int* refcountFromPyObject(const PyObject* obj)
{
    return (int*)((size_t)obj + REFCOUNT_OFFSET);
}

class NumpyAllocator : public MatAllocator
{
public:
    NumpyAllocator() {}
    ~NumpyAllocator() {}
170

171 172 173
    void allocate(int dims, const int* sizes, int type, int*& refcount,
                  uchar*& datastart, uchar*& data, size_t* step)
    {
A
Alexander Mordvintsev 已提交
174 175
        PyEnsureGIL gil;

176 177 178 179 180 181 182 183 184 185 186 187 188
        int depth = CV_MAT_DEPTH(type);
        int cn = CV_MAT_CN(type);
        const int f = (int)(sizeof(size_t)/8);
        int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
                      depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
                      depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
                      depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
        int i;
        npy_intp _sizes[CV_MAX_DIM+1];
        for( i = 0; i < dims; i++ )
            _sizes[i] = sizes[i];
        if( cn > 1 )
        {
189
            /*if( _sizes[dims-1] == 1 )
190
                _sizes[dims-1] = cn;
191
            else*/
192 193 194 195 196 197
                _sizes[dims++] = cn;
        }
        PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
        if(!o)
            CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
        refcount = refcountFromPyObject(o);
198
        npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
V
Vadim Pisarevsky 已提交
199
        for( i = 0; i < dims - (cn > 1); i++ )
200
            step[i] = (size_t)_strides[i];
201
        datastart = data = (uchar*)PyArray_DATA((PyArrayObject*) o);
202
    }
203

A
Andrey Kamaev 已提交
204
    void deallocate(int* refcount, uchar*, uchar*)
205
    {
A
Alexander Mordvintsev 已提交
206
        PyEnsureGIL gil;
207 208 209
        if( !refcount )
            return;
        PyObject* o = pyObjectFromRefcount(refcount);
V
Vadim Pisarevsky 已提交
210
        Py_INCREF(o);
211 212 213 214 215
        Py_DECREF(o);
    }
};

NumpyAllocator g_numpyAllocator;
216

217 218
enum { ARG_NONE = 0, ARG_MAT = 1, ARG_SCALAR = 2 };

219 220
// special case, when the convertor needs full ArgInfo structure
static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allowND=true)
221
{
V
Vadim Pisarevsky 已提交
222 223 224 225 226 227
    if(!o || o == Py_None)
    {
        if( !m.data )
            m.allocator = &g_numpyAllocator;
        return true;
    }
228

229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
    if( PyInt_Check(o) )
    {
        double v[] = {PyInt_AsLong((PyObject*)o), 0., 0., 0.};
        m = Mat(4, 1, CV_64F, v).clone();
        return true;
    }
    if( PyFloat_Check(o) )
    {
        double v[] = {PyFloat_AsDouble((PyObject*)o), 0., 0., 0.};
        m = Mat(4, 1, CV_64F, v).clone();
        return true;
    }
    if( PyTuple_Check(o) )
    {
        int i, sz = (int)PyTuple_Size((PyObject*)o);
        m = Mat(sz, 1, CV_64F);
        for( i = 0; i < sz; i++ )
        {
            PyObject* oi = PyTuple_GET_ITEM(o, i);
            if( PyInt_Check(oi) )
                m.at<double>(i) = (double)PyInt_AsLong(oi);
            else if( PyFloat_Check(oi) )
                m.at<double>(i) = (double)PyFloat_AsDouble(oi);
            else
            {
                failmsg("%s is not a numerical tuple", info.name);
                m.release();
                return false;
            }
        }
        return true;
    }

V
Vadim Pisarevsky 已提交
262 263
    if( !PyArray_Check(o) )
    {
264
        failmsg("%s is not a numpy array, neither a scalar", info.name);
V
Vadim Pisarevsky 已提交
265
        return false;
266
    }
267

268 269
    PyArrayObject* oarr = (PyArrayObject*) o;

270
    bool needcopy = false, needcast = false;
271
    int typenum = PyArray_TYPE(oarr), new_typenum = typenum;
272 273 274 275
    int type = typenum == NPY_UBYTE ? CV_8U :
               typenum == NPY_BYTE ? CV_8S :
               typenum == NPY_USHORT ? CV_16U :
               typenum == NPY_SHORT ? CV_16S :
276
               typenum == NPY_INT ? CV_32S :
277
               typenum == NPY_INT32 ? CV_32S :
278 279
               typenum == NPY_FLOAT ? CV_32F :
               typenum == NPY_DOUBLE ? CV_64F : -1;
280

281 282
    if( type < 0 )
    {
283 284 285
        if( typenum == NPY_INT64 || typenum == NPY_UINT64 || type == NPY_LONG )
        {
            needcopy = needcast = true;
286
            new_typenum = NPY_INT;
287 288 289 290 291 292 293
            type = CV_32S;
        }
        else
        {
            failmsg("%s data type = %d is not supported", info.name, typenum);
            return false;
        }
294
    }
295

296
    int ndims = PyArray_NDIM(oarr);
297 298
    if(ndims >= CV_MAX_DIM)
    {
299
        failmsg("%s dimensionality (=%d) is too high", info.name, ndims);
V
Vadim Pisarevsky 已提交
300
        return false;
301
    }
302

303
    int size[CV_MAX_DIM+1];
V
Vadim Pisarevsky 已提交
304
    size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
305 306
    const npy_intp* _sizes = PyArray_DIMS(oarr);
    const npy_intp* _strides = PyArray_STRIDES(oarr);
307 308
    bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;

309 310 311 312 313 314 315 316 317 318
    for( int i = ndims-1; i >= 0 && !needcopy; i-- )
    {
        // these checks handle cases of
        //  a) multi-dimensional (ndims > 2) arrays, as well as simpler 1- and 2-dimensional cases
        //  b) transposed arrays, where _strides[] elements go in non-descending order
        //  c) flipped arrays, where some of _strides[] elements are negative
        if( (i == ndims-1 && (size_t)_strides[i] != elemsize) ||
            (i < ndims-1 && _strides[i] < _strides[i+1]) )
            needcopy = true;
    }
319

320 321 322
    if( ismultichannel && _strides[1] != (npy_intp)elemsize*_sizes[2] )
        needcopy = true;

323 324 325 326
    if (needcopy)
    {
        if (info.outputarg)
        {
327
            failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name);
328 329
            return false;
        }
330 331 332 333 334 335 336 337 338 339 340

        if( needcast ) {
            o = PyArray_Cast(oarr, new_typenum);
            oarr = (PyArrayObject*) o;
        }
        else {
            oarr = PyArray_GETCONTIGUOUS(oarr);
            o = (PyObject*) oarr;
        }

        _strides = PyArray_STRIDES(oarr);
341
    }
342

343 344 345 346 347
    for(int i = 0; i < ndims; i++)
    {
        size[i] = (int)_sizes[i];
        step[i] = (size_t)_strides[i];
    }
348

349 350
    // handle degenerate case
    if( ndims == 0) {
351 352 353 354
        size[ndims] = 1;
        step[ndims] = elemsize;
        ndims++;
    }
355

356
    if( ismultichannel )
V
Vadim Pisarevsky 已提交
357 358 359 360
    {
        ndims--;
        type |= CV_MAKETYPE(0, size[2]);
    }
361

V
Vadim Pisarevsky 已提交
362
    if( ndims > 2 && !allowND )
363
    {
364
        failmsg("%s has more than 2 dimensions", info.name);
V
Vadim Pisarevsky 已提交
365
        return false;
366
    }
367

368
    m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
369

370 371 372
    if( m.data )
    {
        m.refcount = refcountFromPyObject(o);
373 374 375 376 377
        if (!needcopy)
        {
            m.addref(); // protect the original numpy array from deallocation
                        // (since Mat destructor will decrement the reference counter)
        }
378 379
    };
    m.allocator = &g_numpyAllocator;
380

V
Vadim Pisarevsky 已提交
381
    return true;
382 383
}

V
Vadim Pisarevsky 已提交
384
static PyObject* pyopencv_from(const Mat& m)
385
{
386
    if( !m.data )
387
        Py_RETURN_NONE;
V
Vadim Pisarevsky 已提交
388 389 390
    Mat temp, *p = (Mat*)&m;
    if(!p->refcount || p->allocator != &g_numpyAllocator)
    {
V
Vadim Pisarevsky 已提交
391
        temp.allocator = &g_numpyAllocator;
392
        ERRWRAP2(m.copyTo(temp));
V
Vadim Pisarevsky 已提交
393 394 395 396
        p = &temp;
    }
    p->addref();
    return pyObjectFromRefcount(p->refcount);
397 398
}

V
Vadim Pisarevsky 已提交
399
static bool pyopencv_to(PyObject *o, Scalar& s, const char *name = "<unknown>")
400
{
V
Vadim Pisarevsky 已提交
401 402
    if(!o || o == Py_None)
        return true;
403 404 405
    if (PySequence_Check(o)) {
        PyObject *fi = PySequence_Fast(o, name);
        if (fi == NULL)
V
Vadim Pisarevsky 已提交
406
            return false;
407 408 409
        if (4 < PySequence_Fast_GET_SIZE(fi))
        {
            failmsg("Scalar value for argument '%s' is longer than 4", name);
V
Vadim Pisarevsky 已提交
410
            return false;
411 412 413 414
        }
        for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) {
            PyObject *item = PySequence_Fast_GET_ITEM(fi, i);
            if (PyFloat_Check(item) || PyInt_Check(item)) {
415
                s[(int)i] = PyFloat_AsDouble(item);
416 417
            } else {
                failmsg("Scalar value for argument '%s' is not numeric", name);
V
Vadim Pisarevsky 已提交
418
                return false;
419 420 421 422 423 424 425 426
            }
        }
        Py_DECREF(fi);
    } else {
        if (PyFloat_Check(o) || PyInt_Check(o)) {
            s[0] = PyFloat_AsDouble(o);
        } else {
            failmsg("Scalar value for argument '%s' is not numeric", name);
V
Vadim Pisarevsky 已提交
427
            return false;
428 429
        }
    }
V
Vadim Pisarevsky 已提交
430
    return true;
431 432
}

V
Vadim Pisarevsky 已提交
433 434 435 436
static inline PyObject* pyopencv_from(const Scalar& src)
{
    return Py_BuildValue("(dddd)", src[0], src[1], src[2], src[3]);
}
437

V
Vadim Pisarevsky 已提交
438
static PyObject* pyopencv_from(bool value)
439
{
V
Vadim Pisarevsky 已提交
440 441 442 443 444
    return PyBool_FromLong(value);
}

static bool pyopencv_to(PyObject* obj, bool& value, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
445
    (void)name;
V
Vadim Pisarevsky 已提交
446 447 448 449 450 451 452 453 454 455 456 457 458
    if(!obj || obj == Py_None)
        return true;
    int _val = PyObject_IsTrue(obj);
    if(_val < 0)
        return false;
    value = _val > 0;
    return true;
}

static PyObject* pyopencv_from(size_t value)
{
    return PyLong_FromUnsignedLong((unsigned long)value);
}
459

460 461
static bool pyopencv_to(PyObject* obj, size_t& value, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
462
    (void)name;
463 464 465
    if(!obj || obj == Py_None)
        return true;
    value = (int)PyLong_AsUnsignedLong(obj);
466
    return value != (size_t)-1 || !PyErr_Occurred();
467 468
}

V
Vadim Pisarevsky 已提交
469 470 471
static PyObject* pyopencv_from(int value)
{
    return PyInt_FromLong(value);
472 473
}

A
Andrey Kamaev 已提交
474 475 476 477 478 479 480 481 482 483
static PyObject* pyopencv_from(cvflann_flann_algorithm_t value)
{
    return PyInt_FromLong(int(value));
}

static PyObject* pyopencv_from(cvflann_flann_distance_t value)
{
    return PyInt_FromLong(int(value));
}

V
Vadim Pisarevsky 已提交
484
static bool pyopencv_to(PyObject* obj, int& value, const char* name = "<unknown>")
485
{
A
Andrey Kamaev 已提交
486
    (void)name;
487 488
    if(!obj || obj == Py_None)
        return true;
489 490 491 492 493 494
    if(PyInt_Check(obj))
        value = (int)PyInt_AsLong(obj);
    else if(PyLong_Check(obj))
        value = (int)PyLong_AsLong(obj);
    else
        return false;
495 496 497 498 499 500 501 502 503
    return value != -1 || !PyErr_Occurred();
}

static PyObject* pyopencv_from(uchar value)
{
    return PyInt_FromLong(value);
}

static bool pyopencv_to(PyObject* obj, uchar& value, const char* name = "<unknown>")
504
{
A
Andrey Kamaev 已提交
505
    (void)name;
V
Vadim Pisarevsky 已提交
506 507
    if(!obj || obj == Py_None)
        return true;
508 509 510
    int ivalue = (int)PyInt_AsLong(obj);
    value = cv::saturate_cast<uchar>(ivalue);
    return ivalue != -1 || !PyErr_Occurred();
V
Vadim Pisarevsky 已提交
511 512 513 514 515 516 517 518 519
}

static PyObject* pyopencv_from(double value)
{
    return PyFloat_FromDouble(value);
}

static bool pyopencv_to(PyObject* obj, double& value, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
520
    (void)name;
V
Vadim Pisarevsky 已提交
521 522
    if(!obj || obj == Py_None)
        return true;
523
    if(!!PyInt_CheckExact(obj))
V
Vadim Pisarevsky 已提交
524
        value = (double)PyInt_AS_LONG(obj);
525
    else
V
Vadim Pisarevsky 已提交
526 527
        value = PyFloat_AsDouble(obj);
    return !PyErr_Occurred();
528 529
}

V
Vadim Pisarevsky 已提交
530
static PyObject* pyopencv_from(float value)
531
{
V
Vadim Pisarevsky 已提交
532
    return PyFloat_FromDouble(value);
533
}
V
Vadim Pisarevsky 已提交
534 535

static bool pyopencv_to(PyObject* obj, float& value, const char* name = "<unknown>")
536
{
A
Andrey Kamaev 已提交
537
    (void)name;
V
Vadim Pisarevsky 已提交
538 539
    if(!obj || obj == Py_None)
        return true;
540
    if(!!PyInt_CheckExact(obj))
V
Vadim Pisarevsky 已提交
541 542 543 544
        value = (float)PyInt_AS_LONG(obj);
    else
        value = (float)PyFloat_AsDouble(obj);
    return !PyErr_Occurred();
545 546
}

547 548 549 550 551
static PyObject* pyopencv_from(int64 value)
{
    return PyFloat_FromDouble((double)value);
}

V
Vadim Pisarevsky 已提交
552 553 554 555
static PyObject* pyopencv_from(const string& value)
{
    return PyString_FromString(value.empty() ? "" : value.c_str());
}
556

V
Vadim Pisarevsky 已提交
557
static bool pyopencv_to(PyObject* obj, string& value, const char* name = "<unknown>")
558
{
A
Andrey Kamaev 已提交
559
    (void)name;
V
Vadim Pisarevsky 已提交
560 561 562 563 564 565 566 567 568 569 570
    if(!obj || obj == Py_None)
        return true;
    char* str = PyString_AsString(obj);
    if(!str)
        return false;
    value = string(str);
    return true;
}

static inline bool pyopencv_to(PyObject* obj, Size& sz, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
571
    (void)name;
V
Vadim Pisarevsky 已提交
572 573
    if(!obj || obj == Py_None)
        return true;
A
Alexander Mordvintsev 已提交
574
    return PyArg_ParseTuple(obj, "ii", &sz.width, &sz.height) > 0;
V
Vadim Pisarevsky 已提交
575 576 577 578 579 580 581 582 583
}

static inline PyObject* pyopencv_from(const Size& sz)
{
    return Py_BuildValue("(ii)", sz.width, sz.height);
}

static inline bool pyopencv_to(PyObject* obj, Rect& r, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
584
    (void)name;
V
Vadim Pisarevsky 已提交
585 586
    if(!obj || obj == Py_None)
        return true;
A
Alexander Mordvintsev 已提交
587
    return PyArg_ParseTuple(obj, "iiii", &r.x, &r.y, &r.width, &r.height) > 0;
V
Vadim Pisarevsky 已提交
588 589 590 591 592 593 594 595 596
}

static inline PyObject* pyopencv_from(const Rect& r)
{
    return Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height);
}

static inline bool pyopencv_to(PyObject* obj, Range& r, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
597
    (void)name;
V
Vadim Pisarevsky 已提交
598 599 600
    if(!obj || obj == Py_None)
        return true;
    if(PyObject_Size(obj) == 0)
601
    {
V
Vadim Pisarevsky 已提交
602 603
        r = Range::all();
        return true;
604
    }
A
Alexander Mordvintsev 已提交
605
    return PyArg_ParseTuple(obj, "ii", &r.start, &r.end) > 0;
V
Vadim Pisarevsky 已提交
606 607 608 609 610 611 612 613 614
}

static inline PyObject* pyopencv_from(const Range& r)
{
    return Py_BuildValue("(ii)", r.start, r.end);
}

static inline bool pyopencv_to(PyObject* obj, CvSlice& r, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
615
    (void)name;
V
Vadim Pisarevsky 已提交
616 617 618 619 620 621 622
    if(!obj || obj == Py_None)
        return true;
    if(PyObject_Size(obj) == 0)
    {
        r = CV_WHOLE_SEQ;
        return true;
    }
A
Alexander Mordvintsev 已提交
623
    return PyArg_ParseTuple(obj, "ii", &r.start_index, &r.end_index) > 0;
V
Vadim Pisarevsky 已提交
624
}
625

V
Vadim Pisarevsky 已提交
626 627 628
static inline PyObject* pyopencv_from(const CvSlice& r)
{
    return Py_BuildValue("(ii)", r.start_index, r.end_index);
629 630
}

V
Vadim Pisarevsky 已提交
631 632
static inline bool pyopencv_to(PyObject* obj, Point& p, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
633
    (void)name;
V
Vadim Pisarevsky 已提交
634 635
    if(!obj || obj == Py_None)
        return true;
636
    if(!!PyComplex_CheckExact(obj))
V
Vadim Pisarevsky 已提交
637 638 639 640 641 642
    {
        Py_complex c = PyComplex_AsCComplex(obj);
        p.x = saturate_cast<int>(c.real);
        p.y = saturate_cast<int>(c.imag);
        return true;
    }
A
Alexander Mordvintsev 已提交
643
    return PyArg_ParseTuple(obj, "ii", &p.x, &p.y) > 0;
V
Vadim Pisarevsky 已提交
644 645 646 647
}

static inline bool pyopencv_to(PyObject* obj, Point2f& p, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
648
    (void)name;
V
Vadim Pisarevsky 已提交
649 650
    if(!obj || obj == Py_None)
        return true;
651
    if(!!PyComplex_CheckExact(obj))
652
    {
V
Vadim Pisarevsky 已提交
653 654 655 656 657
        Py_complex c = PyComplex_AsCComplex(obj);
        p.x = saturate_cast<float>(c.real);
        p.y = saturate_cast<float>(c.imag);
        return true;
    }
A
Alexander Mordvintsev 已提交
658
    return PyArg_ParseTuple(obj, "ff", &p.x, &p.y) > 0;
V
Vadim Pisarevsky 已提交
659 660 661 662 663 664 665 666 667 668 669 670 671 672
}

static inline PyObject* pyopencv_from(const Point& p)
{
    return Py_BuildValue("(ii)", p.x, p.y);
}

static inline PyObject* pyopencv_from(const Point2f& p)
{
    return Py_BuildValue("(dd)", p.x, p.y);
}

static inline bool pyopencv_to(PyObject* obj, Vec3d& v, const char* name = "<unknown>")
{
A
Andrey Kamaev 已提交
673
    (void)name;
V
Vadim Pisarevsky 已提交
674 675
    if(!obj)
        return true;
A
Alexander Mordvintsev 已提交
676
    return PyArg_ParseTuple(obj, "ddd", &v[0], &v[1], &v[2]) > 0;
V
Vadim Pisarevsky 已提交
677 678 679 680 681 682 683 684 685 686 687 688 689 690
}

static inline PyObject* pyopencv_from(const Vec3d& v)
{
    return Py_BuildValue("(ddd)", v[0], v[1], v[2]);
}

static inline PyObject* pyopencv_from(const Point2d& p)
{
    return Py_BuildValue("(dd)", p.x, p.y);
}

template<typename _Tp> struct pyopencvVecConverter
{
691
    static bool to(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
692 693
    {
        typedef typename DataType<_Tp>::channel_type _Cp;
V
Vadim Pisarevsky 已提交
694
        if(!obj || obj == Py_None)
V
Vadim Pisarevsky 已提交
695 696 697 698
            return true;
        if (PyArray_Check(obj))
        {
            Mat m;
699
            pyopencv_to(obj, m, info);
V
Vadim Pisarevsky 已提交
700 701 702 703
            m.copyTo(value);
        }
        if (!PySequence_Check(obj))
            return false;
704
        PyObject *seq = PySequence_Fast(obj, info.name);
V
Vadim Pisarevsky 已提交
705 706 707 708
        if (seq == NULL)
            return false;
        int i, j, n = (int)PySequence_Fast_GET_SIZE(seq);
        value.resize(n);
709

V
Vadim Pisarevsky 已提交
710 711 712
        int type = DataType<_Tp>::type;
        int depth = CV_MAT_DEPTH(type), channels = CV_MAT_CN(type);
        PyObject** items = PySequence_Fast_ITEMS(seq);
713

V
Vadim Pisarevsky 已提交
714 715 716 717 718 719
        for( i = 0; i < n; i++ )
        {
            PyObject* item = items[i];
            PyObject* seq_i = 0;
            PyObject** items_i = &item;
            _Cp* data = (_Cp*)&value[i];
720

V
Vadim Pisarevsky 已提交
721 722 723 724 725 726 727 728 729
            if( channels == 2 && PyComplex_CheckExact(item) )
            {
                Py_complex c = PyComplex_AsCComplex(obj);
                data[0] = saturate_cast<_Cp>(c.real);
                data[1] = saturate_cast<_Cp>(c.imag);
                continue;
            }
            if( channels > 1 )
            {
V
Vadim Pisarevsky 已提交
730
                if( PyArray_Check(item))
V
Vadim Pisarevsky 已提交
731 732
                {
                    Mat src;
733
                    pyopencv_to(item, src, info);
V
Vadim Pisarevsky 已提交
734 735 736 737 738 739 740 741 742 743
                    if( src.dims != 2 || src.channels() != 1 ||
                       ((src.cols != 1 || src.rows != channels) &&
                        (src.cols != channels || src.rows != 1)))
                        break;
                    Mat dst(src.rows, src.cols, depth, data);
                    src.convertTo(dst, type);
                    if( dst.data != (uchar*)data )
                        break;
                    continue;
                }
744

745
                seq_i = PySequence_Fast(item, info.name);
V
Vadim Pisarevsky 已提交
746 747 748 749 750 751 752
                if( !seq_i || (int)PySequence_Fast_GET_SIZE(seq_i) != channels )
                {
                    Py_XDECREF(seq_i);
                    break;
                }
                items_i = PySequence_Fast_ITEMS(seq_i);
            }
753

V
Vadim Pisarevsky 已提交
754 755 756 757 758
            for( j = 0; j < channels; j++ )
            {
                PyObject* item_ij = items_i[j];
                if( PyInt_Check(item_ij))
                {
759 760 761 762 763 764 765 766
                    int v = (int)PyInt_AsLong(item_ij);
                    if( v == -1 && PyErr_Occurred() )
                        break;
                    data[j] = saturate_cast<_Cp>(v);
                }
                else if( PyLong_Check(item_ij))
                {
                    int v = (int)PyLong_AsLong(item_ij);
V
Vadim Pisarevsky 已提交
767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
                    if( v == -1 && PyErr_Occurred() )
                        break;
                    data[j] = saturate_cast<_Cp>(v);
                }
                else if( PyFloat_Check(item_ij))
                {
                    double v = PyFloat_AsDouble(item_ij);
                    if( PyErr_Occurred() )
                        break;
                    data[j] = saturate_cast<_Cp>(v);
                }
                else
                    break;
            }
            Py_XDECREF(seq_i);
            if( j < channels )
                break;
        }
        Py_DECREF(seq);
        return i == n;
787
    }
788

V
Vadim Pisarevsky 已提交
789 790 791 792 793 794 795 796 797 798
    static PyObject* from(const vector<_Tp>& value)
    {
        if(value.empty())
            return PyTuple_New(0);
        Mat src((int)value.size(), DataType<_Tp>::channels, DataType<_Tp>::depth, (uchar*)&value[0]);
        return pyopencv_from(src);
    }
};


799
template<typename _Tp> static inline bool pyopencv_to(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
800
{
801
    return pyopencvVecConverter<_Tp>::to(obj, value, info);
V
Vadim Pisarevsky 已提交
802 803 804 805 806 807 808 809
}

template<typename _Tp> static inline PyObject* pyopencv_from(const vector<_Tp>& value)
{
    return pyopencvVecConverter<_Tp>::from(value);
}

static PyObject* pyopencv_from(const KeyPoint&);
810
static PyObject* pyopencv_from(const DMatch&);
V
Vadim Pisarevsky 已提交
811

812
template<typename _Tp> static inline bool pyopencv_to_generic_vec(PyObject* obj, vector<_Tp>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
813
{
V
Vadim Pisarevsky 已提交
814 815
    if(!obj || obj == Py_None)
       return true;
V
Vadim Pisarevsky 已提交
816 817
    if (!PySequence_Check(obj))
        return false;
818
    PyObject *seq = PySequence_Fast(obj, info.name);
V
Vadim Pisarevsky 已提交
819 820 821 822
    if (seq == NULL)
        return false;
    int i, n = (int)PySequence_Fast_GET_SIZE(seq);
    value.resize(n);
823

V
Vadim Pisarevsky 已提交
824
    PyObject** items = PySequence_Fast_ITEMS(seq);
825

V
Vadim Pisarevsky 已提交
826 827 828
    for( i = 0; i < n; i++ )
    {
        PyObject* item = items[i];
829
        if(!pyopencv_to(item, value[i], info))
V
Vadim Pisarevsky 已提交
830 831 832 833 834 835 836 837 838
            break;
    }
    Py_DECREF(seq);
    return i == n;
}

template<typename _Tp> static inline PyObject* pyopencv_from_generic_vec(const vector<_Tp>& value)
{
    int i, n = (int)value.size();
V
Vadim Pisarevsky 已提交
839
    PyObject* seq = PyList_New(n);
V
Vadim Pisarevsky 已提交
840
    for( i = 0; i < n; i++ )
841
    {
V
Vadim Pisarevsky 已提交
842 843 844
        PyObject* item = pyopencv_from(value[i]);
        if(!item)
            break;
V
Vadim Pisarevsky 已提交
845
        PyList_SET_ITEM(seq, i, item);
V
Vadim Pisarevsky 已提交
846 847
    }
    if( i < n )
848
    {
V
Vadim Pisarevsky 已提交
849
        Py_DECREF(seq);
850 851
        return 0;
    }
V
Vadim Pisarevsky 已提交
852 853 854 855 856 857 858 859 860 861
    return seq;
}


template<typename _Tp> struct pyopencvVecConverter<vector<_Tp> >
{
    static bool to(PyObject* obj, vector<vector<_Tp> >& value, const char* name="<unknown>")
    {
        return pyopencv_to_generic_vec(obj, value, name);
    }
862

V
Vadim Pisarevsky 已提交
863 864 865 866 867 868 869 870
    static PyObject* from(const vector<vector<_Tp> >& value)
    {
        return pyopencv_from_generic_vec(value);
    }
};

template<> struct pyopencvVecConverter<Mat>
{
871
    static bool to(PyObject* obj, vector<Mat>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
872
    {
873
        return pyopencv_to_generic_vec(obj, value, info);
V
Vadim Pisarevsky 已提交
874
    }
875

V
Vadim Pisarevsky 已提交
876 877 878 879 880
    static PyObject* from(const vector<Mat>& value)
    {
        return pyopencv_from_generic_vec(value);
    }
};
881

V
Vadim Pisarevsky 已提交
882
template<> struct pyopencvVecConverter<KeyPoint>
883
{
884
    static bool to(PyObject* obj, vector<KeyPoint>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
885
    {
886
        return pyopencv_to_generic_vec(obj, value, info);
V
Vadim Pisarevsky 已提交
887
    }
888

V
Vadim Pisarevsky 已提交
889 890 891 892 893 894
    static PyObject* from(const vector<KeyPoint>& value)
    {
        return pyopencv_from_generic_vec(value);
    }
};

895 896
template<> struct pyopencvVecConverter<DMatch>
{
897
    static bool to(PyObject* obj, vector<DMatch>& value, const ArgInfo info)
898
    {
899
        return pyopencv_to_generic_vec(obj, value, info);
900
    }
901

902 903 904 905 906 907
    static PyObject* from(const vector<DMatch>& value)
    {
        return pyopencv_from_generic_vec(value);
    }
};

V
Vadim Pisarevsky 已提交
908 909
template<> struct pyopencvVecConverter<string>
{
910
    static bool to(PyObject* obj, vector<string>& value, const ArgInfo info)
V
Vadim Pisarevsky 已提交
911
    {
912
        return pyopencv_to_generic_vec(obj, value, info);
V
Vadim Pisarevsky 已提交
913
    }
914

V
Vadim Pisarevsky 已提交
915 916 917 918 919 920
    static PyObject* from(const vector<string>& value)
    {
        return pyopencv_from_generic_vec(value);
    }
};

921

V
Vadim Pisarevsky 已提交
922
static inline bool pyopencv_to(PyObject *obj, CvTermCriteria& dst, const char *name="<unknown>")
923
{
A
Andrey Kamaev 已提交
924
    (void)name;
V
Vadim Pisarevsky 已提交
925 926 927
    if(!obj)
        return true;
    return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.max_iter, &dst.epsilon) > 0;
928 929
}

V
Vadim Pisarevsky 已提交
930
static inline PyObject* pyopencv_from(const CvTermCriteria& src)
931
{
V
Vadim Pisarevsky 已提交
932
    return Py_BuildValue("(iid)", src.type, src.max_iter, src.epsilon);
933 934
}

V
Vadim Pisarevsky 已提交
935
static inline bool pyopencv_to(PyObject *obj, TermCriteria& dst, const char *name="<unknown>")
936
{
A
Andrey Kamaev 已提交
937
    (void)name;
V
Vadim Pisarevsky 已提交
938 939 940
    if(!obj)
        return true;
    return PyArg_ParseTuple(obj, "iid", &dst.type, &dst.maxCount, &dst.epsilon) > 0;
941 942
}

V
Vadim Pisarevsky 已提交
943
static inline PyObject* pyopencv_from(const TermCriteria& src)
944
{
V
Vadim Pisarevsky 已提交
945
    return Py_BuildValue("(iid)", src.type, src.maxCount, src.epsilon);
946 947
}

V
Vadim Pisarevsky 已提交
948
static inline bool pyopencv_to(PyObject *obj, RotatedRect& dst, const char *name="<unknown>")
949
{
A
Andrey Kamaev 已提交
950
    (void)name;
V
Vadim Pisarevsky 已提交
951 952 953
    if(!obj)
        return true;
    return PyArg_ParseTuple(obj, "(ff)(ff)f", &dst.center.x, &dst.center.y, &dst.size.width, &dst.size.height, &dst.angle) > 0;
954 955
}

V
Vadim Pisarevsky 已提交
956
static inline PyObject* pyopencv_from(const RotatedRect& src)
957
{
V
Vadim Pisarevsky 已提交
958
    return Py_BuildValue("((ff)(ff)f)", src.center.x, src.center.y, src.size.width, src.size.height, src.angle);
959 960
}

V
Vadim Pisarevsky 已提交
961
static inline PyObject* pyopencv_from(const Moments& m)
962
{
V
Vadim Pisarevsky 已提交
963 964 965 966 967 968 969
    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}",
                         "m00", m.m00, "m10", m.m10, "m01", m.m01,
                         "m20", m.m20, "m11", m.m11, "m02", m.m02,
                         "m30", m.m30, "m21", m.m21, "m12", m.m12, "m03", m.m03,
                         "mu20", m.mu20, "mu11", m.mu11, "mu02", m.mu02,
                         "mu30", m.mu30, "mu21", m.mu21, "mu12", m.mu12, "mu03", m.mu03,
                         "nu20", m.nu20, "nu11", m.nu11, "nu02", m.nu02,
970
                         "nu30", m.nu30, "nu21", m.nu21, "nu12", m.nu12, "nu03", m.nu03);
971 972
}

973 974 975 976 977 978 979
static inline PyObject* pyopencv_from(const CvDTreeNode* node)
{
    double value = node->value;
    int ivalue = cvRound(value);
    return value == ivalue ? PyInt_FromLong(ivalue) : PyFloat_FromDouble(value);
}

980 981
static bool pyopencv_to(PyObject *o, cv::flann::IndexParams& p, const char *name="<unknown>")
{
A
Andrey Kamaev 已提交
982
    (void)name;
983
    bool ok = false;
984 985
    PyObject* keys = PyObject_CallMethod(o,(char*)"keys",0);
    PyObject* values = PyObject_CallMethod(o,(char*)"values",0);
986

987 988 989 990 991 992 993 994 995 996 997
    if( keys && values )
    {
        int i, n = (int)PyList_GET_SIZE(keys);
        for( i = 0; i < n; i++ )
        {
            PyObject* key = PyList_GET_ITEM(keys, i);
            PyObject* item = PyList_GET_ITEM(values, i);
            if( !PyString_Check(key) )
                break;
            std::string k = PyString_AsString(key);
            if( PyString_Check(item) )
998 999 1000 1001
            {
                const char* value = PyString_AsString(item);
                p.setString(k, value);
            }
1002
            else if( !!PyBool_Check(item) )
1003
                p.setBool(k, item == Py_True);
1004
            else if( PyInt_Check(item) )
1005 1006 1007 1008 1009 1010 1011
            {
                int value = (int)PyInt_AsLong(item);
                if( strcmp(k.c_str(), "algorithm") == 0 )
                    p.setAlgorithm(value);
                else
                    p.setInt(k, value);
            }
1012
            else if( PyFloat_Check(item) )
1013 1014 1015 1016
            {
                double value = PyFloat_AsDouble(item);
                p.setDouble(k, value);
            }
1017 1018 1019 1020 1021
            else
                break;
        }
        ok = i == n && !PyErr_Occurred();
    }
1022

1023 1024 1025 1026 1027
    Py_XDECREF(keys);
    Py_XDECREF(values);
    return ok;
}

1028 1029 1030 1031 1032 1033 1034 1035
template <class T>
static bool pyopencv_to(PyObject *o, Ptr<T>& p, const char *name="<unknown>")
{
    p = new T();
    return pyopencv_to(o, *p, name);
}


1036
static bool pyopencv_to(PyObject *o, cvflann::flann_distance_t& dist, const char *name="<unknown>")
1037
{
1038
    int d = (int)dist;
1039
    bool ok = pyopencv_to(o, d, name);
1040
    dist = (cvflann::flann_distance_t)d;
1041 1042
    return ok;
}
1043 1044 1045 1046 1047 1048 1049

////////////////////////////////////////////////////////////////////////////////////////////////////

static void OnMouse(int event, int x, int y, int flags, void* param)
{
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();
1050

1051 1052
    PyObject *o = (PyObject*)param;
    PyObject *args = Py_BuildValue("iiiiO", event, x, y, flags, PyTuple_GetItem(o, 1));
1053

1054 1055 1056 1057 1058 1059 1060 1061 1062
    PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
    if (r == NULL)
        PyErr_Print();
    else
        Py_DECREF(r);
    Py_DECREF(args);
    PyGILState_Release(gstate);
}

A
Andrey Kamaev 已提交
1063
static PyObject *pycvSetMouseCallback(PyObject*, PyObject *args, PyObject *kw)
1064 1065 1066 1067 1068
{
    const char *keywords[] = { "window_name", "on_mouse", "param", NULL };
    char* name;
    PyObject *on_mouse;
    PyObject *param = NULL;
1069

1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
    if (!PyArg_ParseTupleAndKeywords(args, kw, "sO|O", (char**)keywords, &name, &on_mouse, &param))
        return NULL;
    if (!PyCallable_Check(on_mouse)) {
        PyErr_SetString(PyExc_TypeError, "on_mouse must be callable");
        return NULL;
    }
    if (param == NULL) {
        param = Py_None;
    }
    ERRWRAP2(cvSetMouseCallback(name, OnMouse, Py_BuildValue("OO", on_mouse, param)));
    Py_RETURN_NONE;
}

1083
static void OnChange(int pos, void *param)
1084 1085 1086
{
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();
1087

1088 1089 1090 1091 1092 1093 1094 1095 1096
    PyObject *o = (PyObject*)param;
    PyObject *args = Py_BuildValue("(i)", pos);
    PyObject *r = PyObject_Call(PyTuple_GetItem(o, 0), args, NULL);
    if (r == NULL)
        PyErr_Print();
    Py_DECREF(args);
    PyGILState_Release(gstate);
}

A
Andrey Kamaev 已提交
1097
static PyObject *pycvCreateTrackbar(PyObject*, PyObject *args)
1098 1099 1100 1101 1102 1103
{
    PyObject *on_change;
    char* trackbar_name;
    char* window_name;
    int *value = new int;
    int count;
1104

1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
    if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
        return NULL;
    if (!PyCallable_Check(on_change)) {
        PyErr_SetString(PyExc_TypeError, "on_change must be callable");
        return NULL;
    }
    ERRWRAP2(cvCreateTrackbar2(trackbar_name, window_name, value, count, OnChange, Py_BuildValue("OO", on_change, Py_None)));
    Py_RETURN_NONE;
}

///////////////////////////////////////////////////////////////////////////////////////

1117 1118
#define MKTYPE2(NAME) pyopencv_##NAME##_specials(); if (!to_ok(&pyopencv_##NAME##_Type)) return

A
Andrey Kamaev 已提交
1119 1120 1121 1122 1123
#ifdef __GNUC__
#  pragma GCC diagnostic ignored "-Wunused-parameter"
#  pragma GCC diagnostic ignored "-Wmissing-field-initializers"
#endif

1124 1125 1126 1127 1128 1129
#include "pyopencv_generated_types.h"
#include "pyopencv_generated_funcs.h"

static PyMethodDef methods[] = {

#include "pyopencv_generated_func_tab.h"
1130 1131
  {"createTrackbar", pycvCreateTrackbar, METH_VARARGS, "createTrackbar(trackbarName, windowName, value, count, onChange) -> None"},
  {"setMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_KEYWORDS, "setMouseCallback(windowName, onMouse [, param]) -> None"},
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
  {NULL, NULL},
};

/************************************************************************/
/* Module init */

static int to_ok(PyTypeObject *to)
{
  to->tp_alloc = PyType_GenericAlloc;
  to->tp_new = PyType_GenericNew;
  to->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE;
  return (PyType_Ready(to) == 0);
}

1146 1147
#include "cv2.cv.hpp"

1148 1149 1150 1151
extern "C"
#if defined WIN32 || defined _WIN32
__declspec(dllexport)
#endif
1152
void initcv2();
1153 1154 1155 1156 1157 1158

void initcv2()
{
#if PYTHON_USE_NUMPY
    import_array();
#endif
1159

1160 1161
#if PYTHON_USE_NUMPY
#include "pyopencv_generated_type_reg.h"
1162
#endif
1163

1164
  PyObject* m = Py_InitModule(MODULESTR, methods);
1165 1166
  PyObject* d = PyModule_GetDict(m);

V
Vadim Pisarevsky 已提交
1167
  PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION));
1168 1169 1170

  opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
  PyDict_SetItemString(d, "error", opencv_error);
1171

1172
  PyObject* cv_m = init_cv();
1173

1174
  PyDict_SetItemString(d, "cv", cv_m);
1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251

#define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
#define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
#define PUBLISH2(I, value) PyDict_SetItemString(d, #I, PyLong_FromLong(value))

  PUBLISHU(IPL_DEPTH_8U);
  PUBLISHU(IPL_DEPTH_8S);
  PUBLISHU(IPL_DEPTH_16U);
  PUBLISHU(IPL_DEPTH_16S);
  PUBLISHU(IPL_DEPTH_32S);
  PUBLISHU(IPL_DEPTH_32F);
  PUBLISHU(IPL_DEPTH_64F);

  PUBLISH(CV_LOAD_IMAGE_COLOR);
  PUBLISH(CV_LOAD_IMAGE_GRAYSCALE);
  PUBLISH(CV_LOAD_IMAGE_UNCHANGED);
  PUBLISH(CV_HIST_ARRAY);
  PUBLISH(CV_HIST_SPARSE);
  PUBLISH(CV_8U);
  PUBLISH(CV_8UC1);
  PUBLISH(CV_8UC2);
  PUBLISH(CV_8UC3);
  PUBLISH(CV_8UC4);
  PUBLISH(CV_8S);
  PUBLISH(CV_8SC1);
  PUBLISH(CV_8SC2);
  PUBLISH(CV_8SC3);
  PUBLISH(CV_8SC4);
  PUBLISH(CV_16U);
  PUBLISH(CV_16UC1);
  PUBLISH(CV_16UC2);
  PUBLISH(CV_16UC3);
  PUBLISH(CV_16UC4);
  PUBLISH(CV_16S);
  PUBLISH(CV_16SC1);
  PUBLISH(CV_16SC2);
  PUBLISH(CV_16SC3);
  PUBLISH(CV_16SC4);
  PUBLISH(CV_32S);
  PUBLISH(CV_32SC1);
  PUBLISH(CV_32SC2);
  PUBLISH(CV_32SC3);
  PUBLISH(CV_32SC4);
  PUBLISH(CV_32F);
  PUBLISH(CV_32FC1);
  PUBLISH(CV_32FC2);
  PUBLISH(CV_32FC3);
  PUBLISH(CV_32FC4);
  PUBLISH(CV_64F);
  PUBLISH(CV_64FC1);
  PUBLISH(CV_64FC2);
  PUBLISH(CV_64FC3);
  PUBLISH(CV_64FC4);
  PUBLISH(CV_NEXT_AROUND_ORG);
  PUBLISH(CV_NEXT_AROUND_DST);
  PUBLISH(CV_PREV_AROUND_ORG);
  PUBLISH(CV_PREV_AROUND_DST);
  PUBLISH(CV_NEXT_AROUND_LEFT);
  PUBLISH(CV_NEXT_AROUND_RIGHT);
  PUBLISH(CV_PREV_AROUND_LEFT);
  PUBLISH(CV_PREV_AROUND_RIGHT);

  PUBLISH(CV_WINDOW_AUTOSIZE);

  PUBLISH(CV_PTLOC_INSIDE);
  PUBLISH(CV_PTLOC_ON_EDGE);
  PUBLISH(CV_PTLOC_VERTEX);
  PUBLISH(CV_PTLOC_OUTSIDE_RECT);

  PUBLISH(GC_BGD);
  PUBLISH(GC_FGD);
  PUBLISH(GC_PR_BGD);
  PUBLISH(GC_PR_FGD);
  PUBLISH(GC_INIT_WITH_RECT);
  PUBLISH(GC_INIT_WITH_MASK);
  PUBLISH(GC_EVAL);

1252 1253 1254 1255 1256 1257 1258
  PUBLISH(CV_ROW_SAMPLE);
  PUBLISH(CV_VAR_NUMERICAL);
  PUBLISH(CV_VAR_ORDERED);
  PUBLISH(CV_VAR_CATEGORICAL);

  PUBLISH(CV_AA);

1259 1260
#include "pyopencv_generated_const_reg.h"
}