From ff071d2cf686b22015938e1ca6f32b50b1a18d25 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Mon, 2 Apr 2012 17:19:57 +0000 Subject: [PATCH] added Algorithm::get/set/addParam(vector) (to be used by EM) --- modules/core/include/opencv2/core/core.hpp | 17 ++++++++- modules/core/include/opencv2/core/operations.hpp | 6 ++- modules/core/src/algorithm.cpp | 47 ++++++++++++++++++++++++ modules/core/src/persistence.cpp | 26 ++++++++++++- 4 files changed, 92 insertions(+), 4 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index 4c52d21..39ab773 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -4273,6 +4273,7 @@ public: void set(const string& name, bool value); void set(const string& name, const string& value); void set(const string& name, const Mat& value); + void set(const string& name, const vector& value); void set(const string& name, const Ptr& value); void set(const char* name, int value); @@ -4280,6 +4281,7 @@ public: void set(const char* name, bool value); void set(const char* name, const string& value); void set(const char* name, const Mat& value); + void set(const char* name, const vector& value); void set(const char* name, const Ptr& value); string paramHelp(const string& name) const; @@ -4348,6 +4350,11 @@ public: void (Algorithm::*setter)(const Mat&)=0, const string& help=string()); void addParam(Algorithm& algo, const char* name, + vector& value, bool readOnly=false, + vector (Algorithm::*getter)()=0, + void (Algorithm::*setter)(const vector&)=0, + const string& help=string()); + void addParam(Algorithm& algo, const char* name, Ptr& value, bool readOnly=false, Ptr (Algorithm::*getter)()=0, void (Algorithm::*setter)(const Ptr&)=0, @@ -4359,7 +4366,7 @@ protected: struct CV_EXPORTS Param { - enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, ALGORITHM=5 }; + enum { INT=0, BOOLEAN=1, REAL=2, STRING=3, MAT=4, MAT_VECTOR=5, ALGORITHM=6 }; Param(); Param(int _type, bool _readonly, int _offset, @@ -4414,6 +4421,14 @@ template<> struct ParamType enum { type = Param::MAT }; }; +template<> struct ParamType > +{ + typedef const vector& const_param_type; + typedef vector member_type; + + enum { type = Param::MAT_VECTOR }; +}; + template<> struct ParamType { typedef const Ptr& const_param_type; diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index d0fdc71..6e6db9f 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -2856,7 +2856,8 @@ operator << ( FileStorage& fs, const vector<_Tp>& vec ) CV_EXPORTS_W void write( FileStorage& fs, const string& name, const Mat& value ); CV_EXPORTS void write( FileStorage& fs, const string& name, const SparseMat& value ); - +CV_EXPORTS void write( FileStorage& fs, const string& name, const vector& value ); + template static inline FileStorage& operator << (FileStorage& fs, const _Tp& value) { if( !fs.isOpened() ) @@ -2956,7 +2957,8 @@ static inline void read(const FileNode& node, string& value, const string& defau } CV_EXPORTS_W void read(const FileNode& node, Mat& mat, const Mat& default_mat=Mat() ); -CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat=SparseMat() ); +CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat=SparseMat() ); +CV_EXPORTS void read(const FileNode& node, vector& mat, const vector& default_mat_vector=vector() ); inline FileNode::operator int() const { diff --git a/modules/core/src/algorithm.cpp b/modules/core/src/algorithm.cpp index e0ab6c6..eee94b7 100644 --- a/modules/core/src/algorithm.cpp +++ b/modules/core/src/algorithm.cpp @@ -202,6 +202,11 @@ void Algorithm::set(const string& name, const Mat& value) info()->set(this, name.c_str(), ParamType::type, &value); } +void Algorithm::set(const string& name, const vector& value) +{ + info()->set(this, name.c_str(), ParamType >::type, &value); +} + void Algorithm::set(const string& name, const Ptr& value) { info()->set(this, name.c_str(), ParamType::type, &value); @@ -232,6 +237,11 @@ void Algorithm::set(const char* name, const Mat& value) info()->set(this, name, ParamType::type, &value); } +void Algorithm::set(const char* name, const vector& value) +{ + info()->set(this, name, ParamType >::type, &value); +} + void Algorithm::set(const char* name, const Ptr& value) { info()->set(this, name, ParamType::type, &value); @@ -298,6 +308,8 @@ void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const cv::write(fs, pname, algo->get(pname)); else if( p.type == Param::MAT ) cv::write(fs, pname, algo->get(pname)); + else if( p.type == Param::MAT_VECTOR ) + cv::write(fs, pname, algo->get >(pname)); else if( p.type == Param::ALGORITHM ) { WriteStructContext ws(fs, pname, CV_NODE_MAP); @@ -334,6 +346,12 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const cv::read(fn, m); algo->set(pname, m); } + else if( p.type == Param::MAT_VECTOR ) + { + vector mv; + cv::read(fn, mv); + algo->set(pname, mv); + } else if( p.type == Param::ALGORITHM ) { Ptr nestedAlgo = Algorithm::_create((string)n["name"]); @@ -358,6 +376,7 @@ union GetSetParam double (Algorithm::*get_double)() const; string (Algorithm::*get_string)() const; Mat (Algorithm::*get_mat)() const; + vector (Algorithm::*get_mat_vector)() const; Ptr (Algorithm::*get_algo)() const; void (Algorithm::*set_int)(int); @@ -365,6 +384,7 @@ union GetSetParam void (Algorithm::*set_double)(double); void (Algorithm::*set_string)(const string&); void (Algorithm::*set_mat)(const Mat&); + void (Algorithm::*set_mat_vector)(const vector&); void (Algorithm::*set_algo)(const Ptr&); }; @@ -436,6 +456,16 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo else *(Mat*)((uchar*)algo + p->offset) = val; } + else if( argType == Param::MAT_VECTOR ) + { + CV_Assert( p->type == Param::MAT_VECTOR ); + + const vector& val = *(const vector*)value; + if( p->setter ) + (algo->*f.set_mat_vector)(val); + else + *(vector*)((uchar*)algo + p->offset) = val; + } else if( argType == Param::ALGORITHM ) { CV_Assert( p->type == Param::ALGORITHM ); @@ -505,6 +535,13 @@ void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, vo *(Mat*)value = p->getter ? (algo->*f.get_mat)() : *(Mat*)((uchar*)algo + p->offset); } + else if( argType == Param::MAT_VECTOR ) + { + CV_Assert( p->type == Param::MAT ); + + *(vector*)value = p->getter ? (algo->*f.get_mat_vector)() : + *(vector*)((uchar*)algo + p->offset); + } else if( argType == Param::ALGORITHM ) { CV_Assert( p->type == Param::ALGORITHM ); @@ -604,6 +641,16 @@ void AlgorithmInfo::addParam(Algorithm& algo, const char* name, addParam_(algo, name, ParamType::type, &value, readOnly, (Algorithm::Getter)getter, (Algorithm::Setter)setter, help); } + +void AlgorithmInfo::addParam(Algorithm& algo, const char* name, + vector& value, bool readOnly, + vector (Algorithm::*getter)(), + void (Algorithm::*setter)(const vector&), + const string& help) +{ + addParam_(algo, name, ParamType >::type, &value, readOnly, + (Algorithm::Getter)getter, (Algorithm::Setter)setter, help); +} void AlgorithmInfo::addParam(Algorithm& algo, const char* name, Ptr& value, bool readOnly, diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index e829580..5e90a53 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -5358,7 +5358,13 @@ void write( FileStorage& fs, const string& name, const SparseMat& value ) Ptr mat = (CvSparseMat*)value; cvWrite( *fs, name.size() ? name.c_str() : 0, mat ); } - + +void write( FileStorage& fs, const string& name, const vector& value ) +{ + WriteStructContext ws(fs, name, CV_NODE_SEQ); + for( size_t i = 0; i < value.size(); i++ ) + write(fs, string(), value[i]); +} WriteStructContext::WriteStructContext(FileStorage& _fs, const string& name, int flags, const string& typeName) : fs(&_fs) @@ -5406,6 +5412,24 @@ void read( const FileNode& node, SparseMat& mat, const SparseMat& default_mat ) CV_Assert(CV_IS_SPARSE_MAT(m)); SparseMat(m).copyTo(mat); } + +void read( const FileNode& node, vector& mat_vector, const vector& default_mat_vector ) +{ + if( node.empty() ) + { + mat_vector = default_mat_vector; + return; + } + + FileNodeIterator it = node.begin(), it_end = node.end(); + mat_vector.clear(); + for( ; it != it_end; ++it ) + { + Mat m; + *it >> m; + mat_vector.push_back(m); + } +} } -- 2.7.4