From: Vadim Pisarevsky Date: Wed, 29 Apr 2015 12:36:45 +0000 (+0300) Subject: added vector support (http://code.opencv.org/issues/3826) X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~2497^2~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=135fa85e8f9cfb4a226d1902735ebd327c0e7f17;p=platform%2Fupstream%2Fopencv.git added vector support (code.opencv.org/issues/3826) --- diff --git a/modules/core/include/opencv2/core/mat.hpp b/modules/core/include/opencv2/core/mat.hpp index 315d498..45f3cef 100644 --- a/modules/core/include/opencv2/core/mat.hpp +++ b/modules/core/include/opencv2/core/mat.hpp @@ -163,7 +163,8 @@ public: CUDA_HOST_MEM = 8 << KIND_SHIFT, CUDA_GPU_MAT = 9 << KIND_SHIFT, UMAT =10 << KIND_SHIFT, - STD_VECTOR_UMAT =11 << KIND_SHIFT + STD_VECTOR_UMAT =11 << KIND_SHIFT, + STD_BOOL_VECTOR =12 << KIND_SHIFT }; _InputArray(); @@ -173,6 +174,7 @@ public: _InputArray(const std::vector& vec); template _InputArray(const Mat_<_Tp>& m); template _InputArray(const std::vector<_Tp>& vec); + _InputArray(const std::vector& vec); template _InputArray(const std::vector >& vec); template _InputArray(const std::vector >& vec); template _InputArray(const _Tp* vec, int n); @@ -284,6 +286,7 @@ public: _OutputArray(cuda::HostMem& cuda_mem); template _OutputArray(cudev::GpuMat_<_Tp>& m); template _OutputArray(std::vector<_Tp>& vec); + _OutputArray(std::vector& vec); template _OutputArray(std::vector >& vec); template _OutputArray(std::vector >& vec); template _OutputArray(Mat_<_Tp>& m); @@ -340,6 +343,7 @@ public: _InputOutputArray(cuda::HostMem& cuda_mem); template _InputOutputArray(cudev::GpuMat_<_Tp>& m); template _InputOutputArray(std::vector<_Tp>& vec); + _InputOutputArray(std::vector& vec); template _InputOutputArray(std::vector >& vec); template _InputOutputArray(std::vector >& vec); template _InputOutputArray(Mat_<_Tp>& m); diff --git a/modules/core/include/opencv2/core/mat.inl.hpp b/modules/core/include/opencv2/core/mat.inl.hpp index 535baa1..1727e7e 100644 --- a/modules/core/include/opencv2/core/mat.inl.hpp +++ b/modules/core/include/opencv2/core/mat.inl.hpp @@ -77,6 +77,10 @@ template inline _InputArray::_InputArray(const std::vector<_Tp>& vec) { init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_READ, &vec); } +inline +_InputArray::_InputArray(const std::vector& vec) +{ init(FIXED_TYPE + STD_BOOL_VECTOR + DataType::type + ACCESS_READ, &vec); } + template inline _InputArray::_InputArray(const std::vector >& vec) { init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_READ, &vec); } @@ -140,6 +144,10 @@ template inline _OutputArray::_OutputArray(std::vector<_Tp>& vec) { init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); } +inline +_OutputArray::_OutputArray(std::vector&) +{ CV_Error(Error::StsUnsupportedFormat, "std::vector cannot be an output array\n"); } + template inline _OutputArray::_OutputArray(std::vector >& vec) { init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); } @@ -227,6 +235,9 @@ template inline _InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec) { init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); } +inline _InputOutputArray::_InputOutputArray(std::vector&) +{ CV_Error(Error::StsUnsupportedFormat, "std::vector cannot be an input/output array\n"); } + template inline _InputOutputArray::_InputOutputArray(std::vector >& vec) { init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); } diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 829a009..9b77a4c 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -1154,6 +1154,21 @@ Mat _InputArray::getMat_(int i) const return !v.empty() ? Mat(size(), t, (void*)&v[0]) : Mat(); } + if( k == STD_BOOL_VECTOR ) + { + CV_Assert( i < 0 ); + int t = CV_8U; + const std::vector& v = *(const std::vector*)obj; + int j, n = (int)v.size(); + if( n == 0 ) + return Mat(); + Mat m(1, n, t); + uchar* dst = m.data; + for( j = 0; j < n; j++ ) + dst[j] = (uchar)v[j]; + return m; + } + if( k == NONE ) return Mat(); @@ -1481,6 +1496,13 @@ Size _InputArray::size(int i) const return szb == szi ? Size((int)szb, 1) : Size((int)(szb/CV_ELEM_SIZE(flags)), 1); } + if( k == STD_BOOL_VECTOR ) + { + CV_Assert( i < 0 ); + const std::vector& v = *(const std::vector*)obj; + return Size((int)v.size(), 1); + } + if( k == NONE ) return Size(); @@ -1661,7 +1683,7 @@ int _InputArray::dims(int i) const return 2; } - if( k == STD_VECTOR ) + if( k == STD_VECTOR || k == STD_BOOL_VECTOR ) { CV_Assert( i < 0 ); return 2; @@ -1773,7 +1795,7 @@ int _InputArray::type(int i) const if( k == EXPR ) return ((const MatExpr*)obj)->type(); - if( k == MATX || k == STD_VECTOR || k == STD_VECTOR_VECTOR ) + if( k == MATX || k == STD_VECTOR || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR ) return CV_MAT_TYPE(flags); if( k == NONE ) @@ -1848,6 +1870,12 @@ bool _InputArray::empty() const return v.empty(); } + if( k == STD_BOOL_VECTOR ) + { + const std::vector& v = *(const std::vector*)obj; + return v.empty(); + } + if( k == NONE ) return true; @@ -1892,7 +1920,8 @@ bool _InputArray::isContinuous(int i) const if( k == UMAT ) return i < 0 ? ((const UMat*)obj)->isContinuous() : true; - if( k == EXPR || k == MATX || k == STD_VECTOR || k == NONE || k == STD_VECTOR_VECTOR) + if( k == EXPR || k == MATX || k == STD_VECTOR || + k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR ) return true; if( k == STD_VECTOR_MAT ) @@ -1923,7 +1952,8 @@ bool _InputArray::isSubmatrix(int i) const if( k == UMAT ) return i < 0 ? ((const UMat*)obj)->isSubmatrix() : false; - if( k == EXPR || k == MATX || k == STD_VECTOR || k == NONE || k == STD_VECTOR_VECTOR) + if( k == EXPR || k == MATX || k == STD_VECTOR || + k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR ) return false; if( k == STD_VECTOR_MAT ) @@ -1961,7 +1991,8 @@ size_t _InputArray::offset(int i) const return ((const UMat*)obj)->offset; } - if( k == EXPR || k == MATX || k == STD_VECTOR || k == NONE || k == STD_VECTOR_VECTOR) + if( k == EXPR || k == MATX || k == STD_VECTOR || + k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR ) return 0; if( k == STD_VECTOR_MAT ) @@ -2008,7 +2039,8 @@ size_t _InputArray::step(int i) const return ((const UMat*)obj)->step; } - if( k == EXPR || k == MATX || k == STD_VECTOR || k == NONE || k == STD_VECTOR_VECTOR) + if( k == EXPR || k == MATX || k == STD_VECTOR || + k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR ) return 0; if( k == STD_VECTOR_MAT ) @@ -2043,7 +2075,7 @@ void _InputArray::copyTo(const _OutputArray& arr) const if( k == NONE ) arr.release(); - else if( k == MAT || k == MATX || k == STD_VECTOR ) + else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR ) { Mat m = getMat(); m.copyTo(arr); @@ -2068,7 +2100,7 @@ void _InputArray::copyTo(const _OutputArray& arr, const _InputArray & mask) cons if( k == NONE ) arr.release(); - else if( k == MAT || k == MATX || k == STD_VECTOR ) + else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR ) { Mat m = getMat(); m.copyTo(arr, mask); diff --git a/modules/core/test/test_arithm.cpp b/modules/core/test/test_arithm.cpp index 77a17b6..8bd45ee 100644 --- a/modules/core/test/test_arithm.cpp +++ b/modules/core/test/test_arithm.cpp @@ -1801,3 +1801,18 @@ TEST(Core_FindNonZero, singular) findNonZero(img, pts2); ASSERT_TRUE(pts.empty() && pts2.empty()); } + +TEST(Core_BoolVector, support) +{ + std::vector test; + int i, n = 205; + int nz = 0; + test.resize(n); + for( i = 0; i < n; i++ ) + { + test[i] = theRNG().uniform(0, 2) != 0; + nz += (int)test[i]; + } + ASSERT_EQ( nz, countNonZero(test) ); + ASSERT_FLOAT_EQ((float)nz/n, (float)(mean(test)[0])); +}