From 3a4e06e2899444605454122aa4d297823c603a2e Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 31 May 2011 15:43:11 +0000 Subject: [PATCH] resolved ticket #1104 (processing of transposed numpy arrays) --- modules/python/src2/cv2.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modules/python/src2/cv2.cpp b/modules/python/src2/cv2.cpp index 07fa7f60a..511a3f0a8 100644 --- a/modules/python/src2/cv2.cpp +++ b/modules/python/src2/cv2.cpp @@ -179,6 +179,7 @@ static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "" 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); + bool transposed = false; for(int i = 0; i < ndims; i++) { @@ -192,6 +193,13 @@ static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "" ndims++; } + if( ndims >= 2 && step[0] < step[1] ) + { + std::swap(size[0], size[1]); + std::swap(step[0], step[1]); + transposed = true; + } + if( ndims == 3 && size[2] <= CV_CN_MAX && step[1] == elemsize*size[2] ) { ndims--; @@ -213,6 +221,14 @@ static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "" // (since Mat destructor will decrement the reference counter) }; m.allocator = &g_numpyAllocator; + + if( transposed ) + { + Mat tmp; + tmp.allocator = &g_numpyAllocator; + transpose(m, tmp); + m = tmp; + } return true; }