diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index 64c4ad9ff36ca931b67ccfee81d76f7526a34fab..665f25ce751377feef81726ef67700f970c51915 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -6,6 +6,7 @@ #define MODULESTR "cv2" +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include "numpy/ndarrayobject.h" #include "opencv2/core/core.hpp" @@ -193,10 +194,10 @@ public: if(!o) CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims)); refcount = refcountFromPyObject(o); - npy_intp* _strides = PyArray_STRIDES(o); + npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o); for( i = 0; i < dims - (cn > 1); i++ ) step[i] = (size_t)_strides[i]; - datastart = data = (uchar*)PyArray_DATA(o); + datastart = data = (uchar*)PyArray_DATA((PyArrayObject*) o); } void deallocate(int* refcount, uchar*, uchar*) @@ -263,8 +264,10 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow return false; } + PyArrayObject* oarr = (PyArrayObject*) o; + bool needcopy = false, needcast = false; - int typenum = PyArray_TYPE(o), new_typenum = typenum; + int typenum = PyArray_TYPE(oarr), new_typenum = typenum; int type = typenum == NPY_UBYTE ? CV_8U : typenum == NPY_BYTE ? CV_8S : typenum == NPY_USHORT ? CV_16U : @@ -289,7 +292,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow } } - int ndims = PyArray_NDIM(o); + int ndims = PyArray_NDIM(oarr); if(ndims >= CV_MAX_DIM) { failmsg("%s dimensionality (=%d) is too high", info.name, ndims); @@ -298,8 +301,8 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow int size[CV_MAX_DIM+1]; size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type); - const npy_intp* _sizes = PyArray_DIMS(o); - const npy_intp* _strides = PyArray_STRIDES(o); + const npy_intp* _sizes = PyArray_DIMS(oarr); + const npy_intp* _strides = PyArray_STRIDES(oarr); bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX; for( int i = ndims-1; i >= 0 && !needcopy; i-- ) @@ -323,11 +326,17 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow failmsg("Layout of the output array %s is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)", info.name); return false; } - if( needcast ) - o = (PyObject*)PyArray_Cast((PyArrayObject*)o, new_typenum); - else - o = (PyObject*)PyArray_GETCONTIGUOUS((PyArrayObject*)o); - _strides = PyArray_STRIDES(o); + + if( needcast ) { + o = PyArray_Cast(oarr, new_typenum); + oarr = (PyArrayObject*) o; + } + else { + oarr = PyArray_GETCONTIGUOUS(oarr); + o = (PyObject*) oarr; + } + + _strides = PyArray_STRIDES(oarr); } for(int i = 0; i < ndims; i++) @@ -355,7 +364,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow return false; } - m = Mat(ndims, size, type, PyArray_DATA(o), step); + m = Mat(ndims, size, type, PyArray_DATA(oarr), step); if( m.data ) { diff --git a/modules/python/src2/cv2.cv.hpp b/modules/python/src2/cv2.cv.hpp index 06c37cbb3ff407a2a670377a4febb190fcf6ce36..31bb77687bed25a4ddda663c52561c5f261229f5 100644 --- a/modules/python/src2/cv2.cv.hpp +++ b/modules/python/src2/cv2.cv.hpp @@ -510,7 +510,11 @@ static void arrayinterface_common(PyArrayInterface *s, int mtype) assert(0); } +#ifdef NPY_1_7_API_VERSION + s->flags = NPY_ARRAY_WRITEABLE | NPY_ARRAY_NOTSWAPPED; +#else s->flags = NPY_WRITEABLE | NPY_NOTSWAPPED; +#endif } static PyObject *cvmat_array_struct(cvmat_t *cva)