From 423b721d9732a25b7966ac8cb972c543b56b1146 Mon Sep 17 00:00:00 2001 From: Maria Dimashova Date: Wed, 18 Apr 2012 14:03:35 +0000 Subject: [PATCH] fixed AlgorithmInfo::read for read only parameters (thanks to Vadim) --- modules/core/include/opencv2/core/core.hpp | 4 +- modules/core/src/algorithm.cpp | 59 +++++++++++++--------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/modules/core/include/opencv2/core/core.hpp b/modules/core/include/opencv2/core/core.hpp index b21430c002..a2cb7ff4eb 100644 --- a/modules/core/include/opencv2/core/core.hpp +++ b/modules/core/include/opencv2/core/core.hpp @@ -4312,10 +4312,10 @@ public: class CV_EXPORTS AlgorithmInfo { public: + friend class Algorithm; AlgorithmInfo(const string& name, Algorithm::Constructor create); ~AlgorithmInfo(); void get(const Algorithm* algo, const char* name, int argType, void* value) const; - void set(Algorithm* algo, const char* name, int argType, const void* value) const; void addParam_(Algorithm& algo, const char* name, int argType, void* value, bool readOnly, Algorithm::Getter getter, Algorithm::Setter setter, @@ -4365,6 +4365,8 @@ public: const string& help=string()); protected: AlgorithmInfoData* data; + void set(Algorithm* algo, const char* name, int argType, + const void* value, bool force=false) const; }; diff --git a/modules/core/src/algorithm.cpp b/modules/core/src/algorithm.cpp index ab6ccc4e91..65c3fa8b04 100644 --- a/modules/core/src/algorithm.cpp +++ b/modules/core/src/algorithm.cpp @@ -296,9 +296,9 @@ AlgorithmInfo::~AlgorithmInfo() void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const { - size_t i = 0, n = data->params.vec.size(); + size_t i = 0, nparams = data->params.vec.size(); cv::write(fs, "name", algo->name()); - for( i = 0; i < n; i++ ) + for( i = 0; i < nparams; i++ ) { const Param& p = data->params.vec[i].second; const string& pname = data->params.vec[i].first; @@ -327,9 +327,10 @@ void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const { - size_t i = 0, n = data->params.vec.size(); + size_t i = 0, nparams = data->params.vec.size(); + AlgorithmInfo* info = algo->info(); - for( i = 0; i < n; i++ ) + for( i = 0; i < nparams; i++ ) { const Param& p = data->params.vec[i].second; const string& pname = data->params.vec[i].first; @@ -337,31 +338,43 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const if( n.empty() ) continue; if( p.type == Param::INT ) - algo->set(pname, (int)n); + { + int val = (int)n; + info->set(algo, pname.c_str(), p.type, &val, true); + } else if( p.type == Param::BOOLEAN ) - algo->set(pname, (int)n != 0); + { + bool val = (int)n != 0; + info->set(algo, pname.c_str(), p.type, &val, true); + } else if( p.type == Param::REAL ) - algo->set(pname, (double)n); + { + double val = (double)n; + info->set(algo, pname.c_str(), p.type, &val, true); + } else if( p.type == Param::STRING ) - algo->set(pname, (string)n); + { + string val = (string)n; + info->set(algo, pname.c_str(), p.type, &val, true); + } else if( p.type == Param::MAT ) { Mat m; cv::read(n, m); - algo->set(pname, m); + info->set(algo, pname.c_str(), p.type, &m, true); } else if( p.type == Param::MAT_VECTOR ) { vector mv; cv::read(n, mv); - algo->set(pname, mv); + info->set(algo, pname.c_str(), p.type, &mv, true); } else if( p.type == Param::ALGORITHM ) { Ptr nestedAlgo = Algorithm::_create((string)n["name"]); CV_Assert( !nestedAlgo.empty() ); nestedAlgo->read(n); - algo->set(pname, nestedAlgo); + info->set(algo, pname.c_str(), p.type, &nestedAlgo, true); } else CV_Error( CV_StsUnsupportedFormat, "unknown/unsupported parameter type"); @@ -391,24 +404,24 @@ union GetSetParam void (Algorithm::*set_mat_vector)(const vector&); void (Algorithm::*set_algo)(const Ptr&); }; - -void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const void* value) const + +void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const void* value, bool force) const { const Param* p = findstr(data->params, name); - + if( !p ) CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "") ); - - if( p->readonly ) + + if( !force && p->readonly ) CV_Error_( CV_StsError, ("Parameter '%s' is readonly", name)); - + GetSetParam f; f.set_int = p->setter; - + if( argType == Param::INT || argType == Param::BOOLEAN || argType == Param::REAL ) { CV_Assert( p->type == Param::INT || p->type == Param::REAL || p->type == Param::BOOLEAN ); - + if( p->type == Param::INT ) { int val = argType == Param::INT ? *(const int*)value : @@ -443,7 +456,7 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo else if( argType == Param::STRING ) { CV_Assert( p->type == Param::STRING ); - + const string& val = *(const string*)value; if( p->setter ) (algo->*f.set_string)(val); @@ -453,7 +466,7 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo else if( argType == Param::MAT ) { CV_Assert( p->type == Param::MAT ); - + const Mat& val = *(const Mat*)value; if( p->setter ) (algo->*f.set_mat)(val); @@ -463,7 +476,7 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo 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); @@ -473,7 +486,7 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo else if( argType == Param::ALGORITHM ) { CV_Assert( p->type == Param::ALGORITHM ); - + const Ptr& val = *(const Ptr*)value; if( p->setter ) (algo->*f.set_algo)(val);