From 11367e2c3d1f57c0ef527432da87c3ee9e1a6c0b Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Tue, 2 Oct 2012 14:34:17 +0400 Subject: [PATCH] added GpuMat support to OutputArray --- modules/core/include/opencv2/core/core.hpp | 49 ++++++++++++---------- modules/core/src/matrix.cpp | 29 +++++++++++++ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 44941aff45..c3a808f5e8 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -1372,6 +1372,7 @@ public: template _OutputArray(Mat_<_Tp>& m); template _OutputArray(Matx<_Tp, m, n>& matx); template _OutputArray(_Tp* vec, int n); + _OutputArray(gpu::GpuMat& d_mat); _OutputArray(const Mat& m); template _OutputArray(const vector<_Tp>& vec); @@ -1381,11 +1382,13 @@ public: template _OutputArray(const Mat_<_Tp>& m); template _OutputArray(const Matx<_Tp, m, n>& matx); template _OutputArray(const _Tp* vec, int n); + _OutputArray(const gpu::GpuMat& d_mat); virtual bool fixedSize() const; virtual bool fixedType() const; virtual bool needed() const; virtual Mat& getMatRef(int i=-1) const; + virtual gpu::GpuMat& getGpuMatRef() const; virtual void create(Size sz, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const; virtual void create(int rows, int cols, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const; virtual void create(int dims, const int* size, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const; @@ -2257,10 +2260,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 @@ -2283,12 +2286,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 @@ -4509,15 +4512,15 @@ template<> struct ParamType { typedef float const_param_type; typedef float member_type; - + enum { type = Param::FLOAT }; }; - + template<> struct ParamType { typedef unsigned const_param_type; typedef unsigned member_type; - + enum { type = Param::UNSIGNED_INT }; }; @@ -4525,7 +4528,7 @@ template<> struct ParamType { typedef uint64 const_param_type; typedef uint64 member_type; - + enum { type = Param::UINT64 }; }; @@ -4556,20 +4559,20 @@ public: getByIndex(index, space_delete, ParamType::type, (void*)&val); return val; } - + bool has(const string& name) const; - + bool check() const; - + void about(const string& message); - + void printMessage() const; void printErrors() const; protected: void getByName(const string& name, bool space_delete, int type, void* dst) const; void getByIndex(int index, bool space_delete, int type, void* dst) const; - + struct Impl; Impl* impl; }; @@ -4595,11 +4598,11 @@ public: ~Mutex(); Mutex(const Mutex& m); Mutex& operator = (const Mutex& m); - + void lock(); bool trylock(); void unlock(); - + struct Impl; protected: Impl* impl; @@ -4607,10 +4610,10 @@ protected: class CV_EXPORTS AutoLock { -public: +public: AutoLock(Mutex& m) : mutex(&m) { mutex->lock(); } ~AutoLock() { mutex->unlock(); } -protected: +protected: Mutex* mutex; }; diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index aaaac10fb5..2d61b381c5 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -1284,9 +1284,11 @@ _OutputArray::_OutputArray() {} _OutputArray::~_OutputArray() {} _OutputArray::_OutputArray(Mat& m) : _InputArray(m) {} _OutputArray::_OutputArray(vector& vec) : _InputArray(vec) {} +_OutputArray::_OutputArray(gpu::GpuMat& d_mat) : _InputArray(d_mat) {} _OutputArray::_OutputArray(const Mat& m) : _InputArray(m) {flags |= FIXED_SIZE|FIXED_TYPE;} _OutputArray::_OutputArray(const vector& vec) : _InputArray(vec) {flags |= FIXED_SIZE;} +_OutputArray::_OutputArray(const gpu::GpuMat& d_mat) : _InputArray(d_mat) {flags |= FIXED_SIZE|FIXED_TYPE;} bool _OutputArray::fixedSize() const @@ -1309,6 +1311,13 @@ void _OutputArray::create(Size _sz, int mtype, int i, bool allowTransposed, int ((Mat*)obj)->create(_sz, mtype); return; } + if( k == GPU_MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 ) + { + CV_Assert(!fixedSize() || ((gpu::GpuMat*)obj)->size() == _sz); + CV_Assert(!fixedType() || ((gpu::GpuMat*)obj)->type() == mtype); + ((gpu::GpuMat*)obj)->create(_sz, mtype); + return; + } int sizes[] = {_sz.height, _sz.width}; create(2, sizes, mtype, i, allowTransposed, fixedDepthMask); } @@ -1323,6 +1332,13 @@ void _OutputArray::create(int rows, int cols, int mtype, int i, bool allowTransp ((Mat*)obj)->create(rows, cols, mtype); return; } + if( k == GPU_MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 ) + { + CV_Assert(!fixedSize() || ((gpu::GpuMat*)obj)->size() == Size(cols, rows)); + CV_Assert(!fixedType() || ((gpu::GpuMat*)obj)->type() == mtype); + ((gpu::GpuMat*)obj)->create(rows, cols, mtype); + return; + } int sizes[] = {rows, cols}; create(2, sizes, mtype, i, allowTransposed, fixedDepthMask); } @@ -1536,6 +1552,12 @@ void _OutputArray::release() const return; } + if( k == GPU_MAT ) + { + ((gpu::GpuMat*)obj)->release(); + return; + } + if( k == NONE ) return; @@ -1594,6 +1616,13 @@ Mat& _OutputArray::getMatRef(int i) const } } +gpu::GpuMat& _OutputArray::getGpuMatRef() const +{ + int k = kind(); + CV_Assert( k == GPU_MAT ); + return *(gpu::GpuMat*)obj; +} + static _OutputArray _none; OutputArray noArray() { return _none; }