fixed AlgorithmInfo::read for read only parameters (thanks to Vadim)

This commit is contained in:
Maria Dimashova 2012-04-18 14:03:35 +00:00
parent 78ee81c409
commit 423b721d97
2 changed files with 39 additions and 24 deletions

View File

@ -4312,10 +4312,10 @@ public:
class CV_EXPORTS AlgorithmInfo class CV_EXPORTS AlgorithmInfo
{ {
public: public:
friend class Algorithm;
AlgorithmInfo(const string& name, Algorithm::Constructor create); AlgorithmInfo(const string& name, Algorithm::Constructor create);
~AlgorithmInfo(); ~AlgorithmInfo();
void get(const Algorithm* algo, const char* name, int argType, void* value) const; 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 addParam_(Algorithm& algo, const char* name, int argType,
void* value, bool readOnly, void* value, bool readOnly,
Algorithm::Getter getter, Algorithm::Setter setter, Algorithm::Getter getter, Algorithm::Setter setter,
@ -4365,6 +4365,8 @@ public:
const string& help=string()); const string& help=string());
protected: protected:
AlgorithmInfoData* data; AlgorithmInfoData* data;
void set(Algorithm* algo, const char* name, int argType,
const void* value, bool force=false) const;
}; };

View File

@ -296,9 +296,9 @@ AlgorithmInfo::~AlgorithmInfo()
void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const 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()); 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 Param& p = data->params.vec[i].second;
const string& pname = data->params.vec[i].first; 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 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 Param& p = data->params.vec[i].second;
const string& pname = data->params.vec[i].first; const string& pname = data->params.vec[i].first;
@ -337,31 +338,43 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const
if( n.empty() ) if( n.empty() )
continue; continue;
if( p.type == Param::INT ) 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 ) 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 ) 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 ) 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 ) else if( p.type == Param::MAT )
{ {
Mat m; Mat m;
cv::read(n, 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 ) else if( p.type == Param::MAT_VECTOR )
{ {
vector<Mat> mv; vector<Mat> mv;
cv::read(n, 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 ) else if( p.type == Param::ALGORITHM )
{ {
Ptr<Algorithm> nestedAlgo = Algorithm::_create((string)n["name"]); Ptr<Algorithm> nestedAlgo = Algorithm::_create((string)n["name"]);
CV_Assert( !nestedAlgo.empty() ); CV_Assert( !nestedAlgo.empty() );
nestedAlgo->read(n); nestedAlgo->read(n);
algo->set(pname, nestedAlgo); info->set(algo, pname.c_str(), p.type, &nestedAlgo, true);
} }
else else
CV_Error( CV_StsUnsupportedFormat, "unknown/unsupported parameter type"); CV_Error( CV_StsUnsupportedFormat, "unknown/unsupported parameter type");
@ -391,24 +404,24 @@ union GetSetParam
void (Algorithm::*set_mat_vector)(const vector<Mat>&); void (Algorithm::*set_mat_vector)(const vector<Mat>&);
void (Algorithm::*set_algo)(const Ptr<Algorithm>&); void (Algorithm::*set_algo)(const Ptr<Algorithm>&);
}; };
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); const Param* p = findstr(data->params, name);
if( !p ) if( !p )
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") ); CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") );
if( p->readonly ) if( !force && p->readonly )
CV_Error_( CV_StsError, ("Parameter '%s' is readonly", name)); CV_Error_( CV_StsError, ("Parameter '%s' is readonly", name));
GetSetParam f; GetSetParam f;
f.set_int = p->setter; f.set_int = p->setter;
if( argType == Param::INT || argType == Param::BOOLEAN || argType == Param::REAL ) if( argType == Param::INT || argType == Param::BOOLEAN || argType == Param::REAL )
{ {
CV_Assert( p->type == Param::INT || p->type == Param::REAL || p->type == Param::BOOLEAN ); CV_Assert( p->type == Param::INT || p->type == Param::REAL || p->type == Param::BOOLEAN );
if( p->type == Param::INT ) if( p->type == Param::INT )
{ {
int val = argType == Param::INT ? *(const int*)value : 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 ) else if( argType == Param::STRING )
{ {
CV_Assert( p->type == Param::STRING ); CV_Assert( p->type == Param::STRING );
const string& val = *(const string*)value; const string& val = *(const string*)value;
if( p->setter ) if( p->setter )
(algo->*f.set_string)(val); (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 ) else if( argType == Param::MAT )
{ {
CV_Assert( p->type == Param::MAT ); CV_Assert( p->type == Param::MAT );
const Mat& val = *(const Mat*)value; const Mat& val = *(const Mat*)value;
if( p->setter ) if( p->setter )
(algo->*f.set_mat)(val); (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 ) else if( argType == Param::MAT_VECTOR )
{ {
CV_Assert( p->type == Param::MAT_VECTOR ); CV_Assert( p->type == Param::MAT_VECTOR );
const vector<Mat>& val = *(const vector<Mat>*)value; const vector<Mat>& val = *(const vector<Mat>*)value;
if( p->setter ) if( p->setter )
(algo->*f.set_mat_vector)(val); (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 ) else if( argType == Param::ALGORITHM )
{ {
CV_Assert( p->type == Param::ALGORITHM ); CV_Assert( p->type == Param::ALGORITHM );
const Ptr<Algorithm>& val = *(const Ptr<Algorithm>*)value; const Ptr<Algorithm>& val = *(const Ptr<Algorithm>*)value;
if( p->setter ) if( p->setter )
(algo->*f.set_algo)(val); (algo->*f.set_algo)(val);