From e5872cd8bb34d4e6a47c983548ad6cbf5baceafc Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Tue, 1 Jun 2010 13:53:20 +0000 Subject: [PATCH] now C++ classes can be read/written with cvRead/cvWrite/cvLoad/cvSave. Tested on HOGDescriptor --- .../core/include/opencv2/core/operations.hpp | 45 ++++++++++++ .../include/opencv2/objdetect/objdetect.hpp | 9 +++ modules/objdetect/src/hog.cpp | 73 ++++++++++++++----- 3 files changed, 108 insertions(+), 19 deletions(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 8e02a6816e..b0b56bbd6d 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -2622,6 +2622,51 @@ template inline bool operator != (const SeqIterator<_Tp>& a, return !(a == b); } + +template struct CV_EXPORTS RTTIImpl +{ +public: + static int isInstance(const void* ptr) + { + static _ClsName dummy; + return *(const void**)&dummy == *(const void**)ptr; + } + static void release(void** dbptr) + { + if(dbptr && *dbptr) + { + delete (_ClsName*)*dbptr; + *dbptr = 0; + } + } + static void* read(CvFileStorage* fs, CvFileNode* n) + { + FileNode fn(fs, n); + _ClsName* obj = new _ClsName; + if(obj->read(fn)) + return obj; + delete obj; + return 0; + } + + static void write(CvFileStorage* _fs, const char* name, const void* ptr, CvAttrList) + { + if(ptr && _fs) + { + FileStorage fs(_fs); + fs.fs.addref(); + ((const _ClsName*)ptr)->write(fs, string(name)); + } + } + + static void* clone(const void* ptr) + { + if(!ptr) + return 0; + return new _ClsName(*(const _ClsName*)ptr); + } +}; + } #endif // __cplusplus diff --git a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp index db1bc25a21..78e8d3ffa8 100644 --- a/modules/objdetect/include/opencv2/objdetect/objdetect.hpp +++ b/modules/objdetect/include/opencv2/objdetect/objdetect.hpp @@ -257,6 +257,11 @@ public: load(filename); } + HOGDescriptor(const HOGDescriptor& d) + { + d.copyTo(*this); + } + virtual ~HOGDescriptor() {} size_t getDescriptorSize() const; @@ -265,8 +270,12 @@ public: virtual void setSVMDetector(const vector& _svmdetector); + virtual bool read(FileNode& fn); + virtual void write(FileStorage& fs, const String& objname) const; + virtual bool load(const String& filename, const String& objname=String()); virtual void save(const String& filename, const String& objname=String()) const; + virtual void copyTo(HOGDescriptor& c) const; virtual void compute(const Mat& img, vector& descriptors, diff --git a/modules/objdetect/src/hog.cpp b/modules/objdetect/src/hog.cpp index b237282c8f..9b6c30f89a 100644 --- a/modules/objdetect/src/hog.cpp +++ b/modules/objdetect/src/hog.cpp @@ -87,10 +87,10 @@ void HOGDescriptor::setSVMDetector(const vector& _svmDetector) CV_Assert( checkDetectorSize() ); } -bool HOGDescriptor::load(const String& filename, const String& objname) +#define CV_TYPE_NAME_HOG_DESCRIPTOR "opencv-object-detector-hog" + +bool HOGDescriptor::read(FileNode& obj) { - FileStorage fs(filename, FileStorage::READ); - FileNode obj = !objname.empty() ? fs[objname] : fs.getFirstTopLevelNode(); if( !obj.isMap() ) return false; FileNodeIterator it = obj["winSize"].begin(); @@ -107,7 +107,7 @@ bool HOGDescriptor::load(const String& filename, const String& objname) obj["histogramNormType"] >> histogramNormType; obj["L2HysThreshold"] >> L2HysThreshold; obj["gammaCorrection"] >> gammaCorrection; - + FileNode vecNode = obj["SVMDetector"]; if( vecNode.isSeq() ) { @@ -116,27 +116,56 @@ bool HOGDescriptor::load(const String& filename, const String& objname) } return true; } - -void HOGDescriptor::save(const String& filename, const String& objName) const + +void HOGDescriptor::write(FileStorage& fs, const String& objName) const { - FileStorage fs(filename, FileStorage::WRITE); - fs << (!objName.empty() ? objName : FileStorage::getDefaultObjectName(filename)) << "{"; - - fs << "winSize" << winSize - << "blockSize" << blockSize - << "blockStride" << blockStride - << "cellSize" << cellSize - << "nbins" << nbins - << "derivAperture" << derivAperture - << "winSigma" << getWinSigma() - << "histogramNormType" << histogramNormType - << "L2HysThreshold" << L2HysThreshold - << "gammaCorrection" << gammaCorrection; + if( !objName.empty() ) + fs << objName; + + fs << "{" CV_TYPE_NAME_HOG_DESCRIPTOR + << "winSize" << winSize + << "blockSize" << blockSize + << "blockStride" << blockStride + << "cellSize" << cellSize + << "nbins" << nbins + << "derivAperture" << derivAperture + << "winSigma" << getWinSigma() + << "histogramNormType" << histogramNormType + << "L2HysThreshold" << L2HysThreshold + << "gammaCorrection" << gammaCorrection; if( !svmDetector.empty() ) fs << "SVMDetector" << "[:" << svmDetector << "]"; fs << "}"; } + +bool HOGDescriptor::load(const String& filename, const String& objname) +{ + FileStorage fs(filename, FileStorage::READ); + FileNode obj = !objname.empty() ? fs[objname] : fs.getFirstTopLevelNode(); + return read(obj); +} + +void HOGDescriptor::save(const String& filename, const String& objName) const +{ + FileStorage fs(filename, FileStorage::WRITE); + write(fs, !objName.empty() ? objName : FileStorage::getDefaultObjectName(filename)); +} +void HOGDescriptor::copyTo(HOGDescriptor& c) const +{ + c.winSize = winSize; + c.blockSize = blockSize; + c.blockStride = blockStride; + c.cellSize = cellSize; + c.nbins = nbins; + c.derivAperture = derivAperture; + c.winSigma = winSigma; + c.histogramNormType = histogramNormType; + c.L2HysThreshold = L2HysThreshold; + c.gammaCorrection = gammaCorrection; + c.svmDetector = svmDetector; +} + void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle, Size paddingTL, Size paddingBR) const { @@ -870,6 +899,12 @@ void HOGDescriptor::detectMultiScale( groupRectangles(foundLocations, groupThreshold, 0.2); } + +typedef RTTIImpl HOGRTTI; + +CvType hog_type( CV_TYPE_NAME_HOG_DESCRIPTOR, HOGRTTI::isInstance, + HOGRTTI::release, HOGRTTI::read, HOGRTTI::write, HOGRTTI::clone); + vector HOGDescriptor::getDefaultPeopleDetector() { static const float detector[] = { -- GitLab