From aebed446b16149aa024eea631f70778fbf8cbc4d Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 18 May 2012 12:46:44 +0000 Subject: [PATCH] Partly merged the trunk r8322 --- modules/core/include/opencv2/core/core.hpp | 23 ++++--- modules/core/include/opencv2/core/mat.hpp | 39 +++++++---- modules/core/src/convert.cpp | 76 +++++++++++----------- modules/core/src/matrix.cpp | 15 ++++- 4 files changed, 92 insertions(+), 61 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index a2bb752de..3a53f5370 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -1305,6 +1305,7 @@ public: template _InputArray(const vector<_Tp>& vec); template _InputArray(const vector >& vec); _InputArray(const vector& vec); + template _InputArray(const vector >& vec); template _InputArray(const Mat_<_Tp>& m); template _InputArray(const Matx<_Tp, m, n>& matx); _InputArray(const Scalar& s); @@ -1360,6 +1361,7 @@ public: template _OutputArray(vector<_Tp>& vec); template _OutputArray(vector >& vec); _OutputArray(vector& vec); + template _OutputArray(vector >& vec); template _OutputArray(Mat_<_Tp>& m); template _OutputArray(Matx<_Tp, m, n>& matx); template _OutputArray(_Tp* vec, int n); @@ -1368,6 +1370,7 @@ public: template _OutputArray(const vector<_Tp>& vec); template _OutputArray(const vector >& vec); _OutputArray(const vector& vec); + template _OutputArray(const vector >& vec); template _OutputArray(const Mat_<_Tp>& m); template _OutputArray(const Matx<_Tp, m, n>& matx); template _OutputArray(const _Tp* vec, int n); @@ -2247,10 +2250,10 @@ CV_EXPORTS_W bool solve(InputArray src1, InputArray src2, enum { - SORT_EVERY_ROW=0, - SORT_EVERY_COLUMN=1, - SORT_ASCENDING=0, - SORT_DESCENDING=16 + SORT_EVERY_ROW=0, + SORT_EVERY_COLUMN=1, + SORT_ASCENDING=0, + SORT_DESCENDING=16 }; //! sorts independently each matrix row or each matrix column @@ -2273,12 +2276,12 @@ CV_EXPORTS_W bool eigen(InputArray src, bool computeEigenvectors, enum { - COVAR_SCRAMBLED=0, - COVAR_NORMAL=1, - COVAR_USE_AVG=2, - COVAR_SCALE=4, - COVAR_ROWS=8, - COVAR_COLS=16 + COVAR_SCRAMBLED=0, + COVAR_NORMAL=1, + COVAR_USE_AVG=2, + COVAR_SCALE=4, + COVAR_ROWS=8, + COVAR_COLS=16 }; //! computes covariation matrix of a set of samples diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index d9ab8d777..29234b073 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -1118,6 +1118,9 @@ template inline _InputArray::_InputArray(const vector<_Tp>& vec) template inline _InputArray::_InputArray(const vector >& vec) : flags(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type), obj((void*)&vec) {} +template inline _InputArray::_InputArray(const vector >& vec) + : flags(FIXED_TYPE + STD_VECTOR_MAT + DataType<_Tp>::type), obj((void*)&vec) {} + template inline _InputArray::_InputArray(const Matx<_Tp, m, n>& mtx) : flags(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type), obj((void*)&mtx), sz(n, m) {} @@ -1130,18 +1133,32 @@ inline _InputArray::_InputArray(const Scalar& s) template inline _InputArray::_InputArray(const Mat_<_Tp>& m) : flags(FIXED_TYPE + MAT + DataType<_Tp>::type), obj((void*)&m) {} -template inline _OutputArray::_OutputArray(vector<_Tp>& vec) : _InputArray(vec) {} -template inline _OutputArray::_OutputArray(vector >& vec) : _InputArray(vec) {} -template inline _OutputArray::_OutputArray(Mat_<_Tp>& m) : _InputArray(m) {} -template inline _OutputArray::_OutputArray(Matx<_Tp, m, n>& mtx) : _InputArray(mtx) {} -template inline _OutputArray::_OutputArray(_Tp* vec, int n) : _InputArray(vec, n) {} +template inline _OutputArray::_OutputArray(vector<_Tp>& vec) + : _InputArray(vec) {} +template inline _OutputArray::_OutputArray(vector >& vec) + : _InputArray(vec) {} +template inline _OutputArray::_OutputArray(vector >& vec) + : _InputArray(vec) {} +template inline _OutputArray::_OutputArray(Mat_<_Tp>& m) + : _InputArray(m) {} +template inline _OutputArray::_OutputArray(Matx<_Tp, m, n>& mtx) + : _InputArray(mtx) {} +template inline _OutputArray::_OutputArray(_Tp* vec, int n) + : _InputArray(vec, n) {} - -template inline _OutputArray::_OutputArray(const vector<_Tp>& vec) : _InputArray(vec) {flags |= FIXED_SIZE;} -template inline _OutputArray::_OutputArray(const vector >& vec) : _InputArray(vec) {flags |= FIXED_SIZE;} -template inline _OutputArray::_OutputArray(const Mat_<_Tp>& m) : _InputArray(m) {flags |= FIXED_SIZE;} -template inline _OutputArray::_OutputArray(const Matx<_Tp, m, n>& mtx) : _InputArray(mtx) {} -template inline _OutputArray::_OutputArray(const _Tp* vec, int n) : _InputArray(vec, n) {} +template inline _OutputArray::_OutputArray(const vector<_Tp>& vec) + : _InputArray(vec) {flags |= FIXED_SIZE;} +template inline _OutputArray::_OutputArray(const vector >& vec) + : _InputArray(vec) {flags |= FIXED_SIZE;} +template inline _OutputArray::_OutputArray(const vector >& vec) + : _InputArray(vec) {flags |= FIXED_SIZE;} + +template inline _OutputArray::_OutputArray(const Mat_<_Tp>& m) + : _InputArray(m) {flags |= FIXED_SIZE;} +template inline _OutputArray::_OutputArray(const Matx<_Tp, m, n>& mtx) + : _InputArray(mtx) {} +template inline _OutputArray::_OutputArray(const _Tp* vec, int n) + : _InputArray(vec, n) {} //////////////////////////////////// Matrix Expressions ///////////////////////////////////////// diff --git a/modules/core/src/convert.cpp b/modules/core/src/convert.cpp index 043b5aa87..090c1cbb7 100644 --- a/modules/core/src/convert.cpp +++ b/modules/core/src/convert.cpp @@ -619,28 +619,28 @@ cvtScale_( const short* src, size_t sstep, sstep /= sizeof(src[0]); dstep /= sizeof(dst[0]); - for( ; size.height--; src += sstep, dst += dstep ) + for( ; size.height--; src += sstep, dst += dstep ) { int x = 0; - #if CV_SSE2 - if(USE_SSE2) + #if CV_SSE2 + if(USE_SSE2) { __m128 scale128 = _mm_set1_ps (scale); __m128 shift128 = _mm_set1_ps (shift); - for(; x <= size.width - 8; x += 8 ) - { - __m128i r0 = _mm_loadl_epi64((const __m128i*)(src + x)); + for(; x <= size.width - 8; x += 8 ) + { + __m128i r0 = _mm_loadl_epi64((const __m128i*)(src + x)); __m128i r1 = _mm_loadl_epi64((const __m128i*)(src + x + 4)); - __m128 rf0 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r0, r0), 16)); + __m128 rf0 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r0, r0), 16)); __m128 rf1 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r1, r1), 16)); rf0 = _mm_add_ps(_mm_mul_ps(rf0, scale128), shift128); rf1 = _mm_add_ps(_mm_mul_ps(rf1, scale128), shift128); - r0 = _mm_cvtps_epi32(rf0); - r1 = _mm_cvtps_epi32(rf1); - r0 = _mm_packs_epi32(r0, r1); - _mm_storeu_si128((__m128i*)(dst + x), r0); - } - } + r0 = _mm_cvtps_epi32(rf0); + r1 = _mm_cvtps_epi32(rf1); + r0 = _mm_packs_epi32(r0, r1); + _mm_storeu_si128((__m128i*)(dst + x), r0); + } + } #endif for(; x < size.width; x++ ) @@ -659,17 +659,17 @@ cvt_( const T* src, size_t sstep, for( ; size.height--; src += sstep, dst += dstep ) { int x = 0; - #if CV_ENABLE_UNROLLED - for( ; x <= size.width - 4; x += 4 ) - { - DT t0, t1; - t0 = saturate_cast
(src[x]); - t1 = saturate_cast
(src[x+1]); - dst[x] = t0; dst[x+1] = t1; - t0 = saturate_cast
(src[x+2]); - t1 = saturate_cast
(src[x+3]); - dst[x+2] = t0; dst[x+3] = t1; - } + #if CV_ENABLE_UNROLLED + for( ; x <= size.width - 4; x += 4 ) + { + DT t0, t1; + t0 = saturate_cast
(src[x]); + t1 = saturate_cast
(src[x+1]); + dst[x] = t0; dst[x+1] = t1; + t0 = saturate_cast
(src[x+2]); + t1 = saturate_cast
(src[x+3]); + dst[x+2] = t0; dst[x+3] = t1; + } #endif for( ; x < size.width; x++ ) dst[x] = saturate_cast
(src[x]); @@ -687,20 +687,20 @@ cvt_( const float* src, size_t sstep, for( ; size.height--; src += sstep, dst += dstep ) { int x = 0; - #if CV_SSE2 - if(USE_SSE2){ - for( ; x <= size.width - 8; x += 8 ) - { - __m128 src128 = _mm_loadu_ps (src + x); - __m128i src_int128 = _mm_cvtps_epi32 (src128); - - src128 = _mm_loadu_ps (src + x + 4); - __m128i src1_int128 = _mm_cvtps_epi32 (src128); - - src1_int128 = _mm_packs_epi32(src_int128, src1_int128); - _mm_storeu_si128((__m128i*)(dst + x),src1_int128); - } - } + #if CV_SSE2 + if(USE_SSE2){ + for( ; x <= size.width - 8; x += 8 ) + { + __m128 src128 = _mm_loadu_ps (src + x); + __m128i src_int128 = _mm_cvtps_epi32 (src128); + + src128 = _mm_loadu_ps (src + x + 4); + __m128i src1_int128 = _mm_cvtps_epi32 (src128); + + src1_int128 = _mm_packs_epi32(src_int128, src1_int128); + _mm_storeu_si128((__m128i*)(dst + x),src1_int128); + } + } #endif for( ; x < size.width; x++ ) dst[x] = saturate_cast(src[x]); diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 89d2bbfd4..670388d74 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -1470,10 +1470,21 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow if( i < 0 ) { CV_Assert( dims == 2 && (size[0] == 1 || size[1] == 1 || size[0]*size[1] == 0) ); - size_t len = size[0]*size[1] > 0 ? size[0] + size[1] - 1 : 0; + size_t len = size[0]*size[1] > 0 ? size[0] + size[1] - 1 : 0, len0 = v.size(); - CV_Assert(!fixedSize() || len == v.size()); + CV_Assert(!fixedSize() || len == len0); v.resize(len); + if( fixedType() ) + { + int type = CV_MAT_TYPE(flags); + for( size_t j = len0; j < len; j++ ) + { + if( v[i].type() == type ) + continue; + CV_Assert( v[i].empty() ); + v[i].flags = (v[i].flags & ~CV_MAT_TYPE_MASK) | type; + } + } return; }