From dae0dc9c8cda9fa86d8efb3e62b661273cac7888 Mon Sep 17 00:00:00 2001 From: jaco Date: Thu, 12 Jun 2014 19:28:53 +0200 Subject: [PATCH] BING Objectness porting progress --- .../opencv2/saliency/saliencyBaseClasses.hpp | 10 +- .../saliency/saliencySpecializedClasses.hpp | 23 +- modules/saliency/src/CmFile.cpp | 129 ++++ modules/saliency/src/CmFile.h | 78 +++ .../ObjNessB2W8HSV.idx.yml.gz | Bin 0 -> 167 bytes .../ObjNessB2W8HSV.wS1.yml.gz | Bin 0 -> 606 bytes .../ObjNessB2W8HSV.wS2.yml.gz | Bin 0 -> 526 bytes .../ObjNessB2W8I.idx.yml.gz | Bin 0 -> 164 bytes .../ObjNessB2W8I.wS1.yml.gz | Bin 0 -> 600 bytes .../ObjNessB2W8I.wS2.yml.gz | Bin 0 -> 529 bytes .../ObjNessB2W8MAXBGR.idx.yml.gz | Bin 0 -> 169 bytes .../ObjNessB2W8MAXBGR.wS1.yml.gz | Bin 0 -> 610 bytes .../ObjNessB2W8MAXBGR.wS2.yml.gz | Bin 0 -> 531 bytes modules/saliency/src/motionSaliencyPBAS.cpp | 2 +- modules/saliency/src/objectnessBING.cpp | 645 +++++++++--------- modules/saliency/src/saliency_init.cpp | 5 +- .../src/staticSaliencySpectralResidual.cpp | 2 +- 17 files changed, 548 insertions(+), 346 deletions(-) create mode 100644 modules/saliency/src/CmFile.cpp create mode 100644 modules/saliency/src/CmFile.h create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8HSV.idx.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8HSV.wS1.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8HSV.wS2.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.idx.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.wS1.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.wS2.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.idx.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS1.yml.gz create mode 100644 modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS2.yml.gz diff --git a/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp b/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp index d80a1f039..32699d5f6 100644 --- a/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp +++ b/modules/saliency/include/opencv2/saliency/saliencyBaseClasses.hpp @@ -74,7 +74,7 @@ class CV_EXPORTS_W Saliency : public virtual Algorithm * \return true if the saliency map is computed, false otherwise */ //bool computeSaliency( const Mat& image, Mat& saliencyMap ); - bool computeSaliency( const InputArray& image, OutputArray& saliencyMap ); + bool computeSaliency( const InputArray image, OutputArray saliencyMap ); /** * \brief Get the name of the specific saliency type @@ -84,7 +84,7 @@ class CV_EXPORTS_W Saliency : public virtual Algorithm protected: //virtual bool computeSaliencyImpl( const Mat& image, Mat& saliencyMap ) = 0; - virtual bool computeSaliencyImpl( const InputArray& image, OutputArray& saliencyMap ) = 0; + virtual bool computeSaliencyImpl( const InputArray image, OutputArray saliencyMap ) = 0; String className; }; @@ -96,7 +96,7 @@ class CV_EXPORTS_W StaticSaliency : public virtual Saliency bool computeBinaryMap( const Mat& saliencyMap, Mat& binaryMap ); protected: - virtual bool computeSaliencyImpl( const InputArray& image, OutputArray& saliencyMap ) = 0; + virtual bool computeSaliencyImpl( const InputArray image, OutputArray saliencyMap ) = 0; }; @@ -106,7 +106,7 @@ class CV_EXPORTS_W MotionSaliency : public virtual Saliency protected: - virtual bool computeSaliencyImpl( const InputArray& image, OutputArray& saliencyMap ) = 0; + virtual bool computeSaliencyImpl( const InputArray image, OutputArray saliencyMap ) = 0; }; @@ -116,7 +116,7 @@ class CV_EXPORTS_W Objectness : public virtual Saliency { protected: - virtual bool computeSaliencyImpl( const InputArray& image, OutputArray& saliencyMap ) = 0; + virtual bool computeSaliencyImpl( const InputArray image, OutputArray saliencyMap ) = 0; }; diff --git a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp index 296caa3e8..f610fa64d 100644 --- a/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp +++ b/modules/saliency/include/opencv2/saliency/saliencySpecializedClasses.hpp @@ -90,7 +90,7 @@ class CV_EXPORTS_W StaticSaliencySpectralResidual : public StaticSaliency void write( FileStorage& fs ) const; protected: - bool computeSaliencyImpl( const InputArray& src, OutputArray& dst ); + bool computeSaliencyImpl( const InputArray src, OutputArray dst ); AlgorithmInfo* info() const; //{ return 0; } CV_PROP_RW Ptr resizedImageSize; @@ -124,7 +124,7 @@ class CV_EXPORTS_W MotionSaliencyPBAS : public MotionSaliency void write( FileStorage& fs ) const; protected: - bool computeSaliencyImpl( const InputArray& src, OutputArray& dst ); + bool computeSaliencyImpl( const InputArray src, OutputArray dst ); AlgorithmInfo* info() const; // { return 0; } private: @@ -154,7 +154,8 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness // The trained model should be prepared before calling this function: loadTrainedModel() or trainStageI() + trainStageII(). // Use numDet to control the final number of proposed bounding boxes, and number of per size (scale and aspect ratio) void getObjBndBoxes(CMat &img3u, ValStructVec &valBoxes, int numDetPerSize = 120); - void getObjBndBoxesForImage(Mat img, ValStructVec &boxes, int numDetPerSize); + void getObjBndBoxesForSingleImage(Mat img, ValStructVec &boxes, int numDetPerSize); + vector getobjectnessValues(); void setColorSpace(int clr = MAXBGR); @@ -167,18 +168,19 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness protected: - bool computeSaliencyImpl( const InputArray& src, OutputArray& dst ); + bool computeSaliencyImpl( const InputArray src, OutputArray dst ); AlgorithmInfo* info() const; //{ return 0; } private: // Parameters - const double _base, _logBase; // base for window size quantization - const int _W; // As described in the paper: #Size, Size(_W, _H) of feature window. - const int _NSS; // Size for non-maximal suppress - const int _maxT, _minT, _numT; // The minimal and maximal dimensions of the template + double _base, _logBase; // base for window size quantization + int _W; // As described in the paper: #Size, Size(_W, _H) of feature window. + int _NSS; // Size for non-maximal suppress + int _maxT, _minT, _numT; // The minimal and maximal dimensions of the template int _Clr; // static const char* _clrName[3]; + //TODO Probably remove this parameters //DataSetVOC &_voc; // The dataset for training, testing std:: string _modelName, _trainDirSI, _bbResDir; @@ -187,6 +189,11 @@ class CV_EXPORTS_W ObjectnessBING : public Objectness FilterTIG _tigF; // TIG filter Mat _svmReW1f; // Re-weight parameters learned at stage II. + // List of the rectangles' objectness value, in the same order as + // vector objectnessBoundingBox returned by the algorithm (in computeSaliencyImpl function) + vector objectnessValues; + //vector objectnessBoundingBox; + private: // Help functions bool filtersLoaded() {int n = _svmSzIdxs.size(); return n > 0 && _svmReW1f.size() == Size(2, n) && _svmFilter.size() == Size(_W, _W);} diff --git a/modules/saliency/src/CmFile.cpp b/modules/saliency/src/CmFile.cpp new file mode 100644 index 000000000..bde1eaeab --- /dev/null +++ b/modules/saliency/src/CmFile.cpp @@ -0,0 +1,129 @@ +#include "kyheader.h" +#include "CmFile.h" + + +// Get image names from a wildcard. Eg: GetNames("D:\\*.jpg", imgNames); +int CmFile::GetNames(CStr &_nameW, vecS &_names, string _dir) +{ + _dir = GetFolder(_nameW); + _names.clear(); + + DIR *dir; + struct dirent *ent; + if((dir = opendir(_dir.c_str()))!=NULL){ + //print all the files and directories within directory + while((ent = readdir(dir))!=NULL){ + if(ent->d_name[0] == '.') + continue; + if(ent->d_type ==4) + continue; + _names.push_back(ent->d_name); + } + closedir(dir); + } else { + perror(""); + return EXIT_FAILURE; + } + return (int)_names.size(); +} +int CmFile::GetSubFolders(CStr &folder, vecS &subFolders) +{ + subFolders.clear(); + string nameWC = GetFolder(folder);//folder + "/*"; + + DIR *dir; + struct dirent *ent; + if((dir = opendir(nameWC.c_str()))!=NULL){ + while((ent = readdir(dir))!=NULL){ + if(ent->d_name[0] == '.') + continue; + if(ent->d_type == 4){ + subFolders.push_back(ent->d_name); + } + } + closedir(dir); + } else { + perror(""); + return EXIT_FAILURE; + } + return (int)subFolders.size(); +} +int CmFile::GetNames(CStr& rootFolder, CStr &fileW, vecS &names) +{ + GetNames(rootFolder + fileW, names); + vecS subFolders, tmpNames; + int subNum = CmFile::GetSubFolders(rootFolder, subFolders);// + for (int i = 0; i < subNum; i++){ + subFolders[i] += "/"; + int subNum = GetNames(rootFolder + subFolders[i], fileW, tmpNames); + for (int j = 0; j < subNum; j++) + names.push_back(subFolders[i] + tmpNames[j]); + } + return (int)names.size(); +} +int CmFile::GetNamesNE(CStr& nameWC, vecS &names, string dir, string ext) +{ + int fNum = GetNames(nameWC, names, dir); + ext = GetExtention(nameWC); + for (int i = 0; i < fNum; i++) + names[i] = GetNameNE(names[i]); + return fNum; +} +int CmFile::GetNamesNE(CStr& rootFolder, CStr &fileW, vecS &names) +{ + int fNum = GetNames(rootFolder, fileW, names); + int extS = GetExtention(fileW).size(); + for (int i = 0; i < fNum; i++) + names[i].resize(names[i].size() - extS); + return fNum; +} +bool CmFile::MkDir(CStr &_path) +{ + if(_path.size() == 0) + return false; + static char buffer[1024]; + strcpy(buffer, _S(_path)); +#ifdef _WIN32 + for (int i = 0; buffer[i] != 0; i ++) { + if (buffer[i] == '\\' || buffer[i] == '/') { + buffer[i] = '\0'; + CreateDirectoryA(buffer, 0); + buffer[i] = '/'; + } + } + return CreateDirectoryA(_S(_path), 0); +#else + for (int i = 0; buffer[i] != 0; i ++) { + if (buffer[i] == '\\' || buffer[i] == '/') { + buffer[i] = '\0'; + mkdir(buffer, 0); + buffer[i] = '/'; + } + } + return mkdir(_S(_path), 0); +#endif +} +void CmFile::loadStrList(CStr &fName, vecS & strs, bool flag) +{ + ifstream fIn(fName); + string line; + //vecS strs; + while(getline(fIn, line)){ + unsigned sz = line.size(); + if(flag) + line.resize(sz - 1); + printf("%s\n",_S(line)); + strs.push_back(line); + } + //return strs; +} +bool CmFile::writeStrList(CStr &fName, const vecS &strs) +{ + FILE *f = fopen(_S(fName), "w"); + if (f == NULL) + return false; + for (size_t i = 0; i < strs.size(); i++) + fprintf(f, "%s\n", _S(strs[i])); + fclose(f); + return true; +} diff --git a/modules/saliency/src/CmFile.h b/modules/saliency/src/CmFile.h new file mode 100644 index 000000000..e20d14852 --- /dev/null +++ b/modules/saliency/src/CmFile.h @@ -0,0 +1,78 @@ +#pragma once + +#ifdef _WIN32 +#include +#else +#include +#include +#include +#include +#endif + +struct CmFile +{ + + static inline string GetFolder(CStr& path); + static inline string GetName(CStr& path); + static inline string GetNameNE(CStr& path); + static inline string GetPathNE(CStr& path); + + // Get file names from a wildcard. Eg: GetNames("D:\\*.jpg", imgNames); + static int GetNames(CStr &nameW, vecS &names, std::string _dir = std::string()); + static int GetNames(CStr& rootFolder, CStr &fileW, vecS &names); + static int GetNamesNE(CStr& nameWC, vecS &names, string dir = string(), string ext = string()); + static int GetNamesNE(CStr& rootFolder, CStr &fileW, vecS &names); + static inline string GetExtention(CStr name); + + static int GetSubFolders(CStr& folder, vecS& subFolders); + + static inline string GetWkDir(); + + static bool MkDir(CStr& path); + static void loadStrList(CStr &fName, vecS &strs, bool flag=false); + static bool writeStrList(CStr &fName, const vecS &strs); +}; + +/************************************************************************/ +/* Implementation of inline functions */ +/************************************************************************/ +string CmFile::GetFolder(CStr& path) +{ + return path.substr(0, path.find_last_of("\\/")+1); +} + +string CmFile::GetName(CStr& path) +{ + int start = path.find_last_of("\\/")+1; + int end = path.find_last_not_of(' ')+1; + return path.substr(start, end - start); +} + +string CmFile::GetNameNE(CStr& path) +{ + int start = path.find_last_of("\\/")+1; + int end = path.find_last_of('.'); + if (end >= 0) + return path.substr(start, end - start); + else + return path.substr(start, path.find_last_not_of(' ')+1 - start); +} + +string CmFile::GetPathNE(CStr& path) +{ + int end = path.find_last_of('.'); + if (end >= 0) + return path.substr(0, end); + else + return path.substr(0, path.find_last_not_of(' ') + 1); +} + +string CmFile::GetExtention(CStr name) +{ + return name.substr(name.find_last_of('.')); +} + +/************************************************************************/ +/* Implementations */ +/************************************************************************/ + diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8HSV.idx.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8HSV.idx.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..0fa0845b5ce82c059b7e4aab733aee19f76c78b7 GIT binary patch literal 167 zcmV;Y09gMYiwFP!00000109S#3&KDUMEm@TNny82cF$L9USNDmDf?0Y%jM>9m2v6#d5dzNYnOJKdblfQTAQ)O#pQ5CwN#9d)40A zHP&nI(fmu=%T(f>I7Z#58&#ufRE?@p Vb!3jr@s!JPPJU>ydb+FLRZl-Wd-Zb9jn3YD{`UI%?(Vs~&lhjs?UyG{Zhl?=y!^fUadCh9 z_3zoTEVnm*?)FQLzn3@Px4&2S`{m0xySli)*e@TKT{L!aFY4Djvhzh+C8c@ywYC+U&epI8*u@x6_sk0PKW|alU8^ zEA)|3AMi;Ek?>k?cmSI%%d^&N+$x;BZ#1-#MOw=Iu8q5wsIB-O+C(tB>*(&I4YUCk zk8OI8Srt#3kWY-2BnB^k)JK`BTdl{-PMT&nKp6AJ0XK#2l-nd}={>3@zztBfpi*Pu z4Nysx;pN6N$+=X=_k&$1h|AXdTbqNd-no4E1zEXqYIQ%110LuT*@cWJIX ztT~M#{2>^kI{myi)T8|K`9DY8Mr0@HKJ-F#Nr({!jB9h#i9Hbi5`mQ27u`Jj;gJ-Vu$pu9k&m(?d)j$s^c0l~kMgiG~HF zk%TP*mku=k?v~ zw|^JQvfOU}?$!%MKi_PB^m9Lcxmzz^_lN7d>-F++Sy6+`2q4(3fUcHRwhT96wklv1 zycuVtI9GwM`tAPfjUJ&OF&e3P7+6T}n@Fi-p|hc=yF122J_1!8(2p4blw3s04Tfgo+Gq2Oy|{00HBF z2O?0x`$-@q>M|~zGD3nd)NxUoBnj(ez6Sy_Rr13mhx)8Gc0bn$lj67|$E@Ve)v`H9iI_5wttZwh+Yf-eIT>4Oe_Yka6-Z}D z%@fz85{OeHYG^@O2Awm?R?kX_634}8=u+O&bh{p-^w$_Lk$XUEEMd>fNsh81Mfp1z QEuSv_1L8D%k5&W#0RANPzyJUM literal 0 HcmV?d00001 diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.idx.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.idx.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..825f50f4871216c175be24c3bc06f5c346bb6725 GIT binary patch literal 164 zcmV;V09*ebiwFP!00000109S#55h1EMECxR>%eAE?NBJ$U_;_#L!ir`m)ow5ab<^U?UCo<)jpf|_)!mi_sszG;S)WqO1%kpc1`s< zcy#|#54Fb$g+K)+mPFS58daleR2`Wk Sb3ElroU2X0xb?e=qTa6{s8LDclq+ToS)zRy!mnU>+t>Z;qJ?y zvt?QCZhzk&mmHs0x8L^9>xbj=d7NEeK3pD`56hubb$6DMn?uu!rISSTH1RD~GA^sI zSmW__{DM3!vYfZHpwuqSwQaGHM>Iz5Ef$L8UYbwKpuKtu66ZUis@B z9D*qugt7fzDZxxYttV&>fP*Asn^WK*g}p)a4UdzWf@IMX>88n%+n75Zp{`oRZPrn0 z*<0nD9{9Qy6z7Q-eITxRtp|_v9Bl9-csbZd|3i|9l$K9G$Vfq<%@#gn_k^L){y*6{ z6NsjaNNbQ!PK*edH7Hhnccp3+1|4Pp0i?twqM9e&*-ab#v;l;BBjJLY_d?=Q*85X} z2GL!tJ-V!VheK8#QKqOjOr3rDAR%DFl>F2_SPC0vNE@&RKTdE#*S;?4Y9RLp$FEC@ z7zWeG$SL5XU|3v+^`@>6#0_a&Q$Z%i*1(I?&k!Ozq>;6=pOlAS3L1F_6aa|%T_!*y mF%JWVO|Bs9J}C3e;5#1lhhFf<_GhwuJo^iKIwXkE1ONb@GbWn= literal 0 HcmV?d00001 diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.wS2.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8I.wS2.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..4fe4afc4609eae2722e8d3feca9cc493b9fa9ba3 GIT binary patch literal 529 zcmV+s0`C1EiwFP!0000017(v-uM;s0h4=jxxeHcwBERC;-N6ot#}XmLqW4lH5Kwem z0Y4w-(GdgHEHY{4_?*wqlXuTvy*yxs-JAO_uTPiDb9!qp4(aah{Nwcf;pg)0czyi* zdzVsrJpZ~J5?Nb6oWHhpTYkJA(x<*SUXO?LJ}os9fO0iHEx`M1=7 zP;(HK3Mo^yu_3tq3nQ zIdN?WnxiIE0!p0+;++DL=!m*uL>~3%#)#1hJI^FtD88g3qY{OXRZ<+;H_;jroz5xX zS0uH+9mT&@CTz{RMD26k_Xg3&x@!6>@TWy0@{tT-UtAhG}l*5PpDC?YGb=Y)f_ z@kG*v*u46zgjtKRIFIgZ83_tErvW$S&6!kacCib^Ya6WDR-#aqnSJ93ixrp!ORjEM z>ka-GNG;{2%vsn=3Gx4;1v#v@rbrG=tQPI>1{TXgpYCf{Bjx>|SL{^wx z;+P|mz&o!@cZ89Ir!r?$E$duu7_k}26pHU8t_=64j4KjBK?2i&=$T`!Fz00zYS&%k TO4JTJec1g0sxRXCR0IG3^b!36 literal 0 HcmV?d00001 diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.idx.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.idx.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..197d9bf371c24b45a1e074d4c7f8da980551b2e9 GIT binary patch literal 169 zcmV;a09OAWiwFP!00000109U94uU`sM0>tsEbLap?up`c(AbD3HfoFoA_Ydp08u~R zIX9VPZr{5dAG2cZbs9(8%WYHleQx`-$PW2x=P??!uliZNCy#RInr{T4Yd^h*rJ+~t zon1q{4j#?FltbxpLM%{$3Fd-@AQddR;aeRuV-ki?NtIa1jlWDK+zDgUjk-}asz%kQ X8dXQ;$Q)0(1n1}nlMGLk$p8QV@PtZI literal 0 HcmV?d00001 diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS1.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS1.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..cb838e9ef9c021668d37dc0746c3d9357be67ef4 GIT binary patch literal 610 zcmV-o0-gOIiwFP!0000016@?hZWJ*Pyyq(>2X3s@FT1<joxHvJ_U88C;auLw#o34RSMT=A>FM3C+n?9J zcRwy4@4x;%S(fGg?$5)1iGF*1_kFv)dE75w`m>wM$IJclY1vuv6tnbpyCZwKNC_ot z!ZFrX)Ht}Ruj^jhe_kRfSe(W-FPzofbHV_&c})`;@3oMqR7pF6L3;_eYORiaQ9L}& zskd*P4!PG*&W#?ipq1(ojua+gW1V!Qn2Ce9?yKINxc3Xd2LL7Ks_+8tbtS7Z+Vp$A}q$W-;%_+1o&u#j!y?2s71 zWK1EKhU31((znbT+jeck8Q&c9ECLsYlM_r?S<1ZFNQ9rF$RB%B5Z}s wGQI-%DnL@vY8ycZ5GfAoA<`ylYB7vB2#pA}iVV>jk>&HrKT1;o+}H#F0G_ZeV*mgE literal 0 HcmV?d00001 diff --git a/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS2.yml.gz b/modules/saliency/src/ObjectnessTrainedModel/ObjNessB2W8MAXBGR.wS2.yml.gz new file mode 100644 index 0000000000000000000000000000000000000000..e5fb8445b6da7991dddd1f3031b2bd2aafa65a1b GIT binary patch literal 531 zcmV+u0_^=CiwFP!0000018tK#Z&N`Kg?s;sO+iJxn)lAQOBxyi5)B|kVSi)%Mrs=l$>H zkM;iH>)%Bwxov1m`mPq_dz6Ispa=aP)Y zJ!BN9d3AE;YUsJ^nbA`s&DK2T2)vpS8~H>&GRjumVn*~DmP8oSn2+Pni(;99^^G4d zz(i02<`*%hM&1yP 1 && filters1f.size() == Size(_W, _W) && filters1f.type() == CV_32F); - _svmFilter = filters1f; - - if (!matRead(s2, _svmReW1f) || _svmReW1f.size() != Size(2, _svmSzIdxs.size())){ - _svmReW1f = Mat(); - return -1; - } - return 1; + if( modelName.size() == 0 ) + modelName = _modelName; + CStr s1 = modelName + ".wS1", s2 = modelName + ".wS2", sI = modelName + ".idx"; + Mat filters1f, reW1f, idx1i, show3u; + if( !matRead( s1, filters1f ) || !matRead( sI, idx1i ) ) + { + printf( "Can't load model: %s or %s\n", _S( s1 ), _S( sI ) ); + return 0; + } + + //filters1f = aFilter(0.8f, 8); + //normalize(filters1f, filters1f, p, 1, NORM_MINMAX); + + normalize( filters1f, show3u, 1, 255, NORM_MINMAX, CV_8U ); + _tigF.update( filters1f ); + //_tigF.reconstruct(filters1f); + + _svmSzIdxs = idx1i; + CV_Assert( _svmSzIdxs.size() > 1 && filters1f.size() == Size(_W, _W) && filters1f.type() == CV_32F ); + _svmFilter = filters1f; + + if( !matRead( s2, _svmReW1f ) || _svmReW1f.size() != Size( 2, _svmSzIdxs.size() ) ) + { + _svmReW1f = Mat(); + return -1; + } + return 1; } -void ObjectnessBING::predictBBoxSI(CMat &img3u, ValStructVec &valBoxes, vecI &sz, int NUM_WIN_PSZ, bool fast) +void ObjectnessBING::predictBBoxSI( CMat &img3u, ValStructVec &valBoxes, vecI &sz, int NUM_WIN_PSZ, bool fast ) { - const int numSz = _svmSzIdxs.size(); - const int imgW = img3u.cols, imgH = img3u.rows; - valBoxes.reserve(10000); - sz.clear(); sz.reserve(10000); - for (int ir = numSz - 1; ir >= 0; ir--){ - int r = _svmSzIdxs[ir]; - int height = cvRound(pow(_base, r/_numT + _minT)), width = cvRound(pow(_base, r%_numT + _minT)); - if (height > imgH * _base || width > imgW * _base) - continue; - - height = min(height, imgH), width = min(width, imgW); - Mat im3u, matchCost1f, mag1u; - resize(img3u, im3u, Size(cvRound(_W*imgW*1.0/width), cvRound(_W*imgH*1.0/height))); - gradientMag(im3u, mag1u); - - //imwrite(_voc.localDir + format("%d.png", r), mag1u); - //Mat mag1f; - //mag1u.convertTo(mag1f, CV_32F); - //matchTemplate(mag1f, _svmFilter, matchCost1f, CV_TM_CCORR); - - matchCost1f = _tigF.matchTemplate(mag1u); - - ValStructVec matchCost; - nonMaxSup(matchCost1f, matchCost, _NSS, NUM_WIN_PSZ, fast); - - // Find true locations and match values - double ratioX = width/_W, ratioY = height/_W; - int iMax = min(matchCost.size(), NUM_WIN_PSZ); - for (int i = 0; i < iMax; i++){ - float mVal = matchCost(i); - Point pnt = matchCost[i]; - Vec4i box(cvRound(pnt.x * ratioX), cvRound(pnt.y*ratioY)); - box[2] = cvRound(min(box[0] + width, imgW)); - box[3] = cvRound(min(box[1] + height, imgH)); - box[0] ++; - box[1] ++; - valBoxes.pushBack(mVal, box); - sz.push_back(ir); - } + const int numSz = _svmSzIdxs.size(); + const int imgW = img3u.cols, imgH = img3u.rows; + valBoxes.reserve( 10000 ); + sz.clear(); + sz.reserve( 10000 ); + for ( int ir = numSz - 1; ir >= 0; ir-- ) + { + int r = _svmSzIdxs[ir]; + int height = cvRound( pow( _base, r / _numT + _minT ) ), width = cvRound( pow( _base, r % _numT + _minT ) ); + if( height > imgH * _base || width > imgW * _base ) + continue; + + height = min( height, imgH ), width = min( width, imgW ); + Mat im3u, matchCost1f, mag1u; + resize( img3u, im3u, Size( cvRound( _W * imgW * 1.0 / width ), cvRound( _W * imgH * 1.0 / height ) ) ); + gradientMag( im3u, mag1u ); + + //imwrite(_voc.localDir + format("%d.png", r), mag1u); + //Mat mag1f; + //mag1u.convertTo(mag1f, CV_32F); + //matchTemplate(mag1f, _svmFilter, matchCost1f, CV_TM_CCORR); + + matchCost1f = _tigF.matchTemplate( mag1u ); + + ValStructVec matchCost; + nonMaxSup( matchCost1f, matchCost, _NSS, NUM_WIN_PSZ, fast ); + + // Find true locations and match values + double ratioX = width / _W, ratioY = height / _W; + int iMax = min( matchCost.size(), NUM_WIN_PSZ ); + for ( int i = 0; i < iMax; i++ ) + { + float mVal = matchCost( i ); + Point pnt = matchCost[i]; + Vec4i box( cvRound( pnt.x * ratioX ), cvRound( pnt.y * ratioY ) ); + box[2] = cvRound( min( box[0] + width, imgW ) ); + box[3] = cvRound( min( box[1] + height, imgH ) ); + box[0]++; + box[1]++; + valBoxes.pushBack( mVal, box ); + sz.push_back( ir ); } + } } -void ObjectnessBING::predictBBoxSII(ValStructVec &valBoxes, const vecI &sz) +void ObjectnessBING::predictBBoxSII( ValStructVec &valBoxes, const vecI &sz ) { - int numI = valBoxes.size(); - for (int i = 0; i < numI; i++){ - const float* svmIIw = _svmReW1f.ptr(sz[i]); - valBoxes(i) = valBoxes(i) * svmIIw[0] + svmIIw[1]; - } - valBoxes.sort(); + int numI = valBoxes.size(); + for ( int i = 0; i < numI; i++ ) + { + const float* svmIIw = _svmReW1f.ptr( sz[i] ); + valBoxes( i ) = valBoxes( i ) * svmIIw[0] + svmIIw[1]; + } + //valBoxes.sort(); + // Ascending order. At the top there are the values with lower + // values of ​​objectness, ie more likely to have objects in the their corresponding rectangles. + valBoxes.sort( false ); } // Get potential bounding boxes, each of which is represented by a Vec4i for (minX, minY, maxX, maxY). // The trained model should be prepared before calling this function: loadTrainedModel() or trainStageI() + trainStageII(). // Use numDet to control the final number of proposed bounding boxes, and number of per size (scale and aspect ratio) -void ObjectnessBING::getObjBndBoxes(CMat &img3u, ValStructVec &valBoxes, int numDetPerSize) +void ObjectnessBING::getObjBndBoxes( CMat &img3u, ValStructVec &valBoxes, int numDetPerSize ) { - //CV_Assert_(filtersLoaded() , ("SVM filters should be initialized before getting object proposals\n")); - vecI sz; - predictBBoxSI(img3u, valBoxes, sz, numDetPerSize, false); - predictBBoxSII(valBoxes, sz); - return; + //CV_Assert_(filtersLoaded() , ("SVM filters should be initialized before getting object proposals\n")); + vecI sz; + predictBBoxSI( img3u, valBoxes, sz, numDetPerSize, false ); + predictBBoxSII( valBoxes, sz ); + return; } -void ObjectnessBING::nonMaxSup(CMat &matchCost1f, ValStructVec &matchCost, int NSS, int maxPoint, bool fast) +void ObjectnessBING::nonMaxSup( CMat &matchCost1f, ValStructVec &matchCost, int NSS, int maxPoint, bool fast ) { - const int _h = matchCost1f.rows, _w = matchCost1f.cols; - Mat isMax1u = Mat::ones(_h, _w, CV_8U), costSmooth1f; - ValStructVec valPnt; - matchCost.reserve(_h * _w); - valPnt.reserve(_h * _w); - if (fast){ - blur(matchCost1f, costSmooth1f, Size(3, 3)); - for (int r = 0; r < _h; r++){ - const float* d = matchCost1f.ptr(r); - const float* ds = costSmooth1f.ptr(r); - for (int c = 0; c < _w; c++) - if (d[c] >= ds[c]) - valPnt.pushBack(d[c], Point(c, r)); - } + const int _h = matchCost1f.rows, _w = matchCost1f.cols; + Mat isMax1u = Mat::ones( _h, _w, CV_8U ), costSmooth1f; + ValStructVec valPnt; + matchCost.reserve( _h * _w ); + valPnt.reserve( _h * _w ); + if( fast ) + { + blur( matchCost1f, costSmooth1f, Size( 3, 3 ) ); + for ( int r = 0; r < _h; r++ ) + { + const float* d = matchCost1f.ptr( r ); + const float* ds = costSmooth1f.ptr( r ); + for ( int c = 0; c < _w; c++ ) + if( d[c] >= ds[c] ) + valPnt.pushBack( d[c], Point( c, r ) ); } - else{ - for (int r = 0; r < _h; r++){ - const float* d = matchCost1f.ptr(r); - for (int c = 0; c < _w; c++) - valPnt.pushBack(d[c], Point(c, r)); - } + } + else + { + for ( int r = 0; r < _h; r++ ) + { + const float* d = matchCost1f.ptr( r ); + for ( int c = 0; c < _w; c++ ) + valPnt.pushBack( d[c], Point( c, r ) ); } + } - valPnt.sort(); - for (int i = 0; i < valPnt.size(); i++){ - Point &pnt = valPnt[i]; - if (isMax1u.at(pnt)){ - matchCost.pushBack(valPnt(i), pnt); - for (int dy = -NSS; dy <= NSS; dy++) for (int dx = -NSS; dx <= NSS; dx++){ - Point neighbor = pnt + Point(dx, dy); - if (!CHK_IND(neighbor)) - continue; - isMax1u.at(neighbor) = false; - } + valPnt.sort(); + for ( int i = 0; i < valPnt.size(); i++ ) + { + Point &pnt = valPnt[i]; + if( isMax1u.at( pnt ) ) + { + matchCost.pushBack( valPnt( i ), pnt ); + for ( int dy = -NSS; dy <= NSS; dy++ ) + for ( int dx = -NSS; dx <= NSS; dx++ ) + { + Point neighbor = pnt + Point( dx, dy ); + if( !CHK_IND( neighbor ) ) + continue; + isMax1u.at( neighbor ) = false; } - if (matchCost.size() >= maxPoint) - return; } + if( matchCost.size() >= maxPoint ) + return; + } } -void ObjectnessBING::gradientMag(CMat &imgBGR3u, Mat &mag1u) +void ObjectnessBING::gradientMag( CMat &imgBGR3u, Mat &mag1u ) { - switch (_Clr){ + switch ( _Clr ) + { case MAXBGR: - gradientRGB(imgBGR3u, mag1u); break; + gradientRGB( imgBGR3u, mag1u ); + break; case G: - gradientGray(imgBGR3u, mag1u); break; + gradientGray( imgBGR3u, mag1u ); + break; case HSV: - gradientHSV(imgBGR3u, mag1u); break; + gradientHSV( imgBGR3u, mag1u ); + break; default: - printf("Error: not recognized color space\n"); - } + printf( "Error: not recognized color space\n" ); + } } -void ObjectnessBING::gradientRGB(CMat &bgr3u, Mat &mag1u) +void ObjectnessBING::gradientRGB( CMat &bgr3u, Mat &mag1u ) { - const int H = bgr3u.rows, W = bgr3u.cols; - Mat Ix(H, W, CV_32S), Iy(H, W, CV_32S); - - // Left/right most column Ix - for (int y = 0; y < H; y++){ - Ix.at(y, 0) = bgrMaxDist(bgr3u.at(y, 1), bgr3u.at(y, 0))*2; - Ix.at(y, W-1) = bgrMaxDist(bgr3u.at(y, W-1), bgr3u.at(y, W-2))*2; - } - - // Top/bottom most column Iy - for (int x = 0; x < W; x++) { - Iy.at(0, x) = bgrMaxDist(bgr3u.at(1, x), bgr3u.at(0, x))*2; - Iy.at(H-1, x) = bgrMaxDist(bgr3u.at(H-1, x), bgr3u.at(H-2, x))*2; - } - - // Find the gradient for inner regions - for (int y = 0; y < H; y++){ - const Vec3b *dataP = bgr3u.ptr(y); - for (int x = 2; x < W; x++) - Ix.at(y, x-1) = bgrMaxDist(dataP[x-2], dataP[x]); // bgr3u.at(y, x+1), bgr3u.at(y, x-1)); - } - for (int y = 1; y < H-1; y++){ - const Vec3b *tP = bgr3u.ptr(y-1); - const Vec3b *bP = bgr3u.ptr(y+1); - for (int x = 0; x < W; x++) - Iy.at(y, x) = bgrMaxDist(tP[x], bP[x]); - } - gradientXY(Ix, Iy, mag1u); + const int H = bgr3u.rows, W = bgr3u.cols; + Mat Ix( H, W, CV_32S ), Iy( H, W, CV_32S ); + + // Left/right most column Ix + for ( int y = 0; y < H; y++ ) + { + Ix.at( y, 0 ) = bgrMaxDist( bgr3u.at( y, 1 ), bgr3u.at( y, 0 ) ) * 2; + Ix.at( y, W - 1 ) = bgrMaxDist( bgr3u.at( y, W - 1 ), bgr3u.at( y, W - 2 ) ) * 2; + } + + // Top/bottom most column Iy + for ( int x = 0; x < W; x++ ) + { + Iy.at( 0, x ) = bgrMaxDist( bgr3u.at( 1, x ), bgr3u.at( 0, x ) ) * 2; + Iy.at( H - 1, x ) = bgrMaxDist( bgr3u.at( H - 1, x ), bgr3u.at( H - 2, x ) ) * 2; + } + + // Find the gradient for inner regions + for ( int y = 0; y < H; y++ ) + { + const Vec3b *dataP = bgr3u.ptr( y ); + for ( int x = 2; x < W; x++ ) + Ix.at( y, x - 1 ) = bgrMaxDist( dataP[x - 2], dataP[x] ); // bgr3u.at(y, x+1), bgr3u.at(y, x-1)); + } + for ( int y = 1; y < H - 1; y++ ) + { + const Vec3b *tP = bgr3u.ptr( y - 1 ); + const Vec3b *bP = bgr3u.ptr( y + 1 ); + for ( int x = 0; x < W; x++ ) + Iy.at( y, x ) = bgrMaxDist( tP[x], bP[x] ); + } + gradientXY( Ix, Iy, mag1u ); } -void ObjectnessBING::gradientGray(CMat &bgr3u, Mat &mag1u) +void ObjectnessBING::gradientGray( CMat &bgr3u, Mat &mag1u ) { - Mat g1u; - cvtColor(bgr3u, g1u, COLOR_BGR2GRAY); - const int H = g1u.rows, W = g1u.cols; - Mat Ix(H, W, CV_32S), Iy(H, W, CV_32S); - - // Left/right most column Ix - for (int y = 0; y < H; y++){ - Ix.at(y, 0) = abs(g1u.at(y, 1) - g1u.at(y, 0)) * 2; - Ix.at(y, W-1) = abs(g1u.at(y, W-1) - g1u.at(y, W-2)) * 2; - } - - // Top/bottom most column Iy - for (int x = 0; x < W; x++) { - Iy.at(0, x) = abs(g1u.at(1, x) - g1u.at(0, x)) * 2; - Iy.at(H-1, x) = abs(g1u.at(H-1, x) - g1u.at(H-2, x)) * 2; - } - - // Find the gradient for inner regions - for (int y = 0; y < H; y++) - for (int x = 1; x < W-1; x++) - Ix.at(y, x) = abs(g1u.at(y, x+1) - g1u.at(y, x-1)); - for (int y = 1; y < H-1; y++) - for (int x = 0; x < W; x++) - Iy.at(y, x) = abs(g1u.at(y+1, x) - g1u.at(y-1, x)); - - gradientXY(Ix, Iy, mag1u); + Mat g1u; + cvtColor( bgr3u, g1u, COLOR_BGR2GRAY ); + const int H = g1u.rows, W = g1u.cols; + Mat Ix( H, W, CV_32S ), Iy( H, W, CV_32S ); + + // Left/right most column Ix + for ( int y = 0; y < H; y++ ) + { + Ix.at( y, 0 ) = abs( g1u.at( y, 1 ) - g1u.at( y, 0 ) ) * 2; + Ix.at( y, W - 1 ) = abs( g1u.at( y, W - 1 ) - g1u.at( y, W - 2 ) ) * 2; + } + + // Top/bottom most column Iy + for ( int x = 0; x < W; x++ ) + { + Iy.at( 0, x ) = abs( g1u.at( 1, x ) - g1u.at( 0, x ) ) * 2; + Iy.at( H - 1, x ) = abs( g1u.at( H - 1, x ) - g1u.at( H - 2, x ) ) * 2; + } + + // Find the gradient for inner regions + for ( int y = 0; y < H; y++ ) + for ( int x = 1; x < W - 1; x++ ) + Ix.at( y, x ) = abs( g1u.at( y, x + 1 ) - g1u.at( y, x - 1 ) ); + for ( int y = 1; y < H - 1; y++ ) + for ( int x = 0; x < W; x++ ) + Iy.at( y, x ) = abs( g1u.at( y + 1, x ) - g1u.at( y - 1, x ) ); + + gradientXY( Ix, Iy, mag1u ); } - -void ObjectnessBING::gradientHSV(CMat &bgr3u, Mat &mag1u) +void ObjectnessBING::gradientHSV( CMat &bgr3u, Mat &mag1u ) { - Mat hsv3u; - cvtColor(bgr3u, hsv3u, COLOR_BGR2HSV); - const int H = hsv3u.rows, W = hsv3u.cols; - Mat Ix(H, W, CV_32S), Iy(H, W, CV_32S); - - // Left/right most column Ix - for (int y = 0; y < H; y++){ - Ix.at(y, 0) = vecDist3b(hsv3u.at(y, 1), hsv3u.at(y, 0)); - Ix.at(y, W-1) = vecDist3b(hsv3u.at(y, W-1), hsv3u.at(y, W-2)); - } - - // Top/bottom most column Iy - for (int x = 0; x < W; x++) { - Iy.at(0, x) = vecDist3b(hsv3u.at(1, x), hsv3u.at(0, x)); - Iy.at(H-1, x) = vecDist3b(hsv3u.at(H-1, x), hsv3u.at(H-2, x)); - } - - // Find the gradient for inner regions - for (int y = 0; y < H; y++) - for (int x = 1; x < W-1; x++) - Ix.at(y, x) = vecDist3b(hsv3u.at(y, x+1), hsv3u.at(y, x-1))/2; - for (int y = 1; y < H-1; y++) - for (int x = 0; x < W; x++) - Iy.at(y, x) = vecDist3b(hsv3u.at(y+1, x), hsv3u.at(y-1, x))/2; - - gradientXY(Ix, Iy, mag1u); + Mat hsv3u; + cvtColor( bgr3u, hsv3u, COLOR_BGR2HSV ); + const int H = hsv3u.rows, W = hsv3u.cols; + Mat Ix( H, W, CV_32S ), Iy( H, W, CV_32S ); + + // Left/right most column Ix + for ( int y = 0; y < H; y++ ) + { + Ix.at( y, 0 ) = vecDist3b( hsv3u.at( y, 1 ), hsv3u.at( y, 0 ) ); + Ix.at( y, W - 1 ) = vecDist3b( hsv3u.at( y, W - 1 ), hsv3u.at( y, W - 2 ) ); + } + + // Top/bottom most column Iy + for ( int x = 0; x < W; x++ ) + { + Iy.at( 0, x ) = vecDist3b( hsv3u.at( 1, x ), hsv3u.at( 0, x ) ); + Iy.at( H - 1, x ) = vecDist3b( hsv3u.at( H - 1, x ), hsv3u.at( H - 2, x ) ); + } + + // Find the gradient for inner regions + for ( int y = 0; y < H; y++ ) + for ( int x = 1; x < W - 1; x++ ) + Ix.at( y, x ) = vecDist3b( hsv3u.at( y, x + 1 ), hsv3u.at( y, x - 1 ) ) / 2; + for ( int y = 1; y < H - 1; y++ ) + for ( int x = 0; x < W; x++ ) + Iy.at( y, x ) = vecDist3b( hsv3u.at( y + 1, x ), hsv3u.at( y - 1, x ) ) / 2; + + gradientXY( Ix, Iy, mag1u ); } -void ObjectnessBING::gradientXY(CMat &x1i, CMat &y1i, Mat &mag1u) +void ObjectnessBING::gradientXY( CMat &x1i, CMat &y1i, Mat &mag1u ) { - const int H = x1i.rows, W = x1i.cols; - mag1u.create(H, W, CV_8U); - for (int r = 0; r < H; r++){ - const int *x = x1i.ptr(r), *y = y1i.ptr(r); - byte* m = mag1u.ptr(r); - for (int c = 0; c < W; c++) - m[c] = min(x[c] + y[c], 255); //((int)sqrt(sqr(x[c]) + sqr(y[c])), 255); - } + const int H = x1i.rows, W = x1i.cols; + mag1u.create( H, W, CV_8U ); + for ( int r = 0; r < H; r++ ) + { + const int *x = x1i.ptr( r ), *y = y1i.ptr( r ); + byte* m = mag1u.ptr( r ); + for ( int c = 0; c < W; c++ ) + m[c] = min( x[c] + y[c], 255 ); //((int)sqrt(sqr(x[c]) + sqr(y[c])), 255); + } } -void ObjectnessBING::getObjBndBoxesForImage(Mat img, ValStructVec &finalBoxes, int numDetPerSize) +void ObjectnessBING::getObjBndBoxesForSingleImage( Mat img, ValStructVec &finalBoxes, int numDetPerSize ) { - const int TestNum = 1; - vecM imgs3u(TestNum); - vector> boxesTests; - boxesTests.resize(TestNum); - -#pragma omp parallel for - for (int i = 0; i < TestNum; i++){ - imgs3u[i] = img; - boxesTests[i].reserve(10000); - } - - int scales[3] = {1, 3, 5}; - for (int clr = MAXBGR; clr <= G; clr++){ - setColorSpace(clr); - loadTrainedModel(); - CmTimer tm("Predict"); - //tm.Start(); - -#pragma omp parallel for - for (int i = 0; i < TestNum; i++){ - ValStructVec boxes; - getObjBndBoxes(imgs3u[i], boxes, numDetPerSize); - boxesTests[i].append(boxes, scales[clr]); - - //boxes.valIdxes[0].first; - } - - //tm.Stop(); - //printf("Average time for predicting an image (%s) is %gs\n", _clrName[_Clr], tm.TimeInSeconds()/TestNum); - } + int scales[3] = + { 1, 3, 5 }; + for ( int clr = MAXBGR; clr <= G; clr++ ) + { + setColorSpace( clr ); + loadTrainedModel(); + CmTimer tm( "Predict" ); + tm.Start(); -/* _boxesTests.resize(TestNum); - CmFile::MkDir(_bbResDir); -#pragma omp parallel for - for (int i = 0; i < TestNum; i++){ - - CStr fName = _bbResDir + _voc.testSet[i]; - ValStructVec &boxes = boxesTests[i]; - FILE *f = fopen(_S(fName + ".txt"), "w"); - fprintf(f, "%d\n", boxes.size()); - for (size_t k = 0; k < boxes.size(); k++) - //fprintf(f, "%g, %s\n", boxes(k), _S(strVec4i(boxes[k]))); - fclose(f); - - _boxesTests[i].resize(boxesTests[i].size()); - for (int j = 0; j < boxesTests[i].size(); j++) - _boxesTests[i][j] = boxesTests[i][j]; - } */ - - //evaluatePerImgRecall(_boxesTests, "PerImgAllNS.m", 5000); - -#pragma omp parallel for - for (int i = 0; i < TestNum; i++){ - boxesTests[i].sort(false); - //for (int j = 0; j < boxesTests[i].size(); j++) - // _boxesTests[i][j] = boxesTests[i][j]; - finalBoxes=boxesTests[i]; - - } - //evaluatePerImgRecall(_boxesTests, "PerImgAllS.m", 5000); + getObjBndBoxes( img, finalBoxes, numDetPerSize ); + tm.Stop(); + printf( "Average time for predicting an image (%s) is %gs\n", _clrName[_Clr], tm.TimeInSeconds() ); + } } struct MatchPathSeparator { - bool operator()( char ch ) const - { - return ch == '/'; - } + bool operator()( char ch ) const + { + return ch == '/'; + } }; std::string inline basename( std::string const& pathname ) { - return std::string( - std::find_if( pathname.rbegin(), pathname.rend(), - MatchPathSeparator() ).base(), - pathname.end() ); + return std::string( std::find_if( pathname.rbegin(), pathname.rend(), MatchPathSeparator() ).base(), pathname.end() ); } std::string inline removeExtension( std::string const& filename ) { - std::string::const_reverse_iterator - pivot - = std::find( filename.rbegin(), filename.rend(), '.' ); - return pivot == filename.rend() - ? filename - : std::string( filename.begin(), pivot.base() - 1 ); + std::string::const_reverse_iterator pivot = std::find( filename.rbegin(), filename.rend(), '.' ); + return pivot == filename.rend() ? filename : std::string( filename.begin(), pivot.base() - 1 ); } - // Read matrix from binary file -bool ObjectnessBING::matRead(const string& filename, Mat& _M){ - - FileStorage fs2(filename+".yml.gz", FileStorage::READ); - String fileNameString(filename.c_str()); - - Mat M; - fs2[removeExtension(basename(fileNameString))]>> M; - - /*FILE* f = fopen(_S(filename), "rb"); - if (f == NULL) - return false; - char buf[8]; - int pre = fread(buf,sizeof(char), 5, f); - if (strncmp(buf, "CmMat", 5) != 0) { - printf("Invalidate CvMat data file %s\n", _S(filename)); - return false; - } - int headData[3]; // Width, height, type - fread(headData, sizeof(int), 3, f); - Mat M(headData[1], headData[0], headData[2]); - fread(M.data, sizeof(char), M.step * M.rows, f); - fclose(f); */ - - M.copyTo(_M); - return true; +bool ObjectnessBING::matRead( const string& filename, Mat& _M ) +{ + + FileStorage fs2( filename + ".yml.gz", FileStorage::READ ); + String fileNameString( filename.c_str() ); + + Mat M; + fs2[removeExtension( basename( fileNameString ) )] >> M; + + /*FILE* f = fopen(_S(filename), "rb"); + if (f == NULL) + return false; + char buf[8]; + int pre = fread(buf,sizeof(char), 5, f); + if (strncmp(buf, "CmMat", 5) != 0) { + printf("Invalidate CvMat data file %s\n", _S(filename)); + return false; + } + int headData[3]; // Width, height, type + fread(headData, sizeof(int), 3, f); + Mat M(headData[1], headData[0], headData[2]); + fread(M.data, sizeof(char), M.step * M.rows, f); + fclose(f); */ + + M.copyTo( _M ); + return true; +} +vector ObjectnessBING::getobjectnessValues() +{ + return objectnessValues; } void ObjectnessBING::read( const cv::FileNode& fn ) { - //params.read( fn ); + } void ObjectnessBING::write( cv::FileStorage& fs ) const { - //params.write( fs ); + } -bool ObjectnessBING::computeSaliencyImpl( const InputArray& src, OutputArray& dst ) +bool ObjectnessBING::computeSaliencyImpl( const InputArray image, OutputArray objBoundingBox ) { ValStructVec &finalBoxes; - getObjBndBoxesForImage( src.getMat(), finalBoxes, 250 ); - - // list of rectangles returned by objectess function - //std::vector boxesList = finalBoxes.structVals; - dst = finalBoxes.getSortedStructVal(); - //dst = finalBoxes.structVals; + getObjBndBoxesForSingleImage( image.getMat(), finalBoxes, 250 ); + + // List of rectangles returned by objectess function in ascending order. + // At the top there are the rectangles with lower values of ​​objectness, ie more + // likely to have objects in them. + objBoundingBox = finalBoxes.getSortedStructVal(); + + // List of the rectangles' objectness value + unsigned long int valIdxesSize = finalBoxes.valIdxes.size(); + objectnessValues.resize( valIdxesSize ); + for ( uint i = 0; i < valIdxesSize; i++ ) + objectnessValues[i] = finalBoxes.valIdxes[i].first; return true; } diff --git a/modules/saliency/src/saliency_init.cpp b/modules/saliency/src/saliency_init.cpp index cb177df7c..20975208c 100644 --- a/modules/saliency/src/saliency_init.cpp +++ b/modules/saliency/src/saliency_init.cpp @@ -50,7 +50,10 @@ CV_INIT_ALGORITHM( StaticSaliencySpectralResidual, "SALIENCY.SPECTRAL_RESIDUAL", CV_INIT_ALGORITHM( MotionSaliencyPBAS, "SALIENCY.PBAS",); -CV_INIT_ALGORITHM( ObjectnessBING, "SALIENCY.BING", ); +CV_INIT_ALGORITHM( ObjectnessBING, "SALIENCY.BING", + obj.info()->addParam(obj, "_base", obj._base); + obj.info()->addParam(obj, "_NSS", obj._NSS); + obj.info()->addParam(obj, "_W", obj._W)); bool initModule_saliency( void ) { diff --git a/modules/saliency/src/staticSaliencySpectralResidual.cpp b/modules/saliency/src/staticSaliencySpectralResidual.cpp index 2f4533915..a9f4ef8e2 100644 --- a/modules/saliency/src/staticSaliencySpectralResidual.cpp +++ b/modules/saliency/src/staticSaliencySpectralResidual.cpp @@ -97,7 +97,7 @@ void StaticSaliencySpectralResidual::write( cv::FileStorage& fs ) const //params.write( fs ); } -bool StaticSaliencySpectralResidual::computeSaliencyImpl( const InputArray& image, OutputArray& saliencyMap ) +bool StaticSaliencySpectralResidual::computeSaliencyImpl( const InputArray image, OutputArray saliencyMap ) { Mat grayTemp, grayDown; std::vector mv;