提交 8b29a6e4 编写于 作者: R Roman Donchenko 提交者: OpenCV Buildbot

Merge pull request #1127 from SpecLad:np-1.7

...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define MODULESTR "cv2" #define MODULESTR "cv2"
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "numpy/ndarrayobject.h" #include "numpy/ndarrayobject.h"
#include "opencv2/core/core.hpp" #include "opencv2/core/core.hpp"
...@@ -193,10 +194,10 @@ public: ...@@ -193,10 +194,10 @@ public:
if(!o) if(!o)
CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims)); CV_Error_(CV_StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
refcount = refcountFromPyObject(o); refcount = refcountFromPyObject(o);
npy_intp* _strides = PyArray_STRIDES(o); npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
for( i = 0; i < dims - (cn > 1); i++ ) for( i = 0; i < dims - (cn > 1); i++ )
step[i] = (size_t)_strides[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*) void deallocate(int* refcount, uchar*, uchar*)
...@@ -263,8 +264,10 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow ...@@ -263,8 +264,10 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow
return false; return false;
} }
PyArrayObject* oarr = (PyArrayObject*) o;
bool needcopy = false, needcast = false; 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 : int type = typenum == NPY_UBYTE ? CV_8U :
typenum == NPY_BYTE ? CV_8S : typenum == NPY_BYTE ? CV_8S :
typenum == NPY_USHORT ? CV_16U : typenum == NPY_USHORT ? CV_16U :
...@@ -289,7 +292,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow ...@@ -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) if(ndims >= CV_MAX_DIM)
{ {
failmsg("%s dimensionality (=%d) is too high", info.name, ndims); 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 ...@@ -298,8 +301,8 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow
int size[CV_MAX_DIM+1]; int size[CV_MAX_DIM+1];
size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type); size_t step[CV_MAX_DIM+1], elemsize = CV_ELEM_SIZE1(type);
const npy_intp* _sizes = PyArray_DIMS(o); const npy_intp* _sizes = PyArray_DIMS(oarr);
const npy_intp* _strides = PyArray_STRIDES(o); const npy_intp* _strides = PyArray_STRIDES(oarr);
bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX; bool ismultichannel = ndims == 3 && _sizes[2] <= CV_CN_MAX;
for( int i = ndims-1; i >= 0 && !needcopy; i-- ) 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 ...@@ -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); 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; return false;
} }
if( needcast )
o = (PyObject*)PyArray_Cast((PyArrayObject*)o, new_typenum); if( needcast ) {
else o = PyArray_Cast(oarr, new_typenum);
o = (PyObject*)PyArray_GETCONTIGUOUS((PyArrayObject*)o); oarr = (PyArrayObject*) o;
_strides = PyArray_STRIDES(o); }
else {
oarr = PyArray_GETCONTIGUOUS(oarr);
o = (PyObject*) oarr;
}
_strides = PyArray_STRIDES(oarr);
} }
for(int i = 0; i < ndims; i++) 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 ...@@ -355,7 +364,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const ArgInfo info, bool allow
return false; return false;
} }
m = Mat(ndims, size, type, PyArray_DATA(o), step); m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
if( m.data ) if( m.data )
{ {
......
...@@ -510,7 +510,11 @@ static void arrayinterface_common(PyArrayInterface *s, int mtype) ...@@ -510,7 +510,11 @@ static void arrayinterface_common(PyArrayInterface *s, int mtype)
assert(0); assert(0);
} }
#ifdef NPY_1_7_API_VERSION
s->flags = NPY_ARRAY_WRITEABLE | NPY_ARRAY_NOTSWAPPED;
#else
s->flags = NPY_WRITEABLE | NPY_NOTSWAPPED; s->flags = NPY_WRITEABLE | NPY_NOTSWAPPED;
#endif
} }
static PyObject *cvmat_array_struct(cvmat_t *cva) static PyObject *cvmat_array_struct(cvmat_t *cva)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册