00001 /* 00002 * ImageMolecule.h 00003 * 00004 * Created on: Oct 20, 2010 00005 * Author: erublee 00006 */ 00007 00008 #ifndef IMAGEMOLECULE_H_ 00009 #define IMAGEMOLECULE_H_ 00010 #include <opencv2/core/core.hpp> 00011 #include <string> 00012 #include <vector> 00013 #include <list> 00014 #include <map> 00015 #include <set> 00016 00017 #include <pano_core/ImageAtom.h> 00018 #include <pano_core/ModelFitter.h> 00019 00020 namespace pano { 00021 00022 00027 class ImageMolecule: public serializable { 00028 public: 00031 ImageMolecule(); 00032 00038 ImageMolecule(const ImageMolecule& rhs); 00039 00050 ImageMolecule(const std::list<AtomPair> & pairs); 00051 00052 00053 00054 ImageMolecule(const std::vector<AtomPair> & pairs); 00055 00056 ~ImageMolecule(){} 00057 00065 void insertAtom(const cv::Ptr<ImageAtom>& atom) throw(); 00066 00067 void insertAtoms(const std::set<cv::Ptr<ImageAtom> > & atoms); 00068 00074 void insertPair(const AtomPair& pair) throw(); 00075 00076 bool removePair(const AtomPair& pair) throw(); 00077 00078 void removeBadPairs(); 00079 00084 void insertPairs(const std::list<AtomPair>& pairs) throw(); 00085 void insertPairs(const std::vector<AtomPair>& pairs) throw(); 00086 00091 void peelAtoms( int flag = 0); 00092 00097 std::set<cv::Ptr<ImageAtom> >& getAtoms() throw(); 00098 00103 const std::set<cv::Ptr<ImageAtom> >& getAtoms() const throw(); 00104 00105 00110 std::vector<AtomPair>& getPairs() throw(); 00111 00116 const std::vector<AtomPair>& getPairs() const throw(); 00117 00126 void setAnchor(const cv::Ptr<ImageAtom>& atom) throw(); 00127 00132 const cv::Ptr<ImageAtom>& getAnchor() const throw(std::logic_error); 00133 00137 bool hasAtom(const cv::Ptr<ImageAtom>& atom) const 00138 throw(); 00139 00143 void hasAtomThrow(const cv::Ptr<ImageAtom>& atom)const 00144 throw(std::logic_error); 00145 00153 const std::list<int>* getPairIndices(const cv::Ptr<ImageAtom>& atom) const; 00154 00155 00156 00157 const AtomPair* getPairByIndex(size_t idx) const; 00158 00159 cv::Ptr<ImageAtom> getMaximallyConnectedAtom( int node_offset = 0 ) const; 00160 00161 void merge(cv::Ptr<ImageAtom> pivot, const ImageMolecule& molecule); 00162 00163 /* 00164 * serializable functions 00165 */ 00166 virtual int version() const 00167 { 00168 return 0; 00169 } 00170 00171 virtual void serialize(cv::FileStorage& fs) const; 00172 virtual void deserialize(const cv::FileNode& fn); 00173 00174 private: 00175 std::map<cv::Ptr<ImageAtom> , std::list<int> > pairmap_; 00176 std::set<cv::Ptr<ImageAtom> > atoms_; 00177 std::vector<AtomPair > pairs_; 00178 cv::Ptr<ImageAtom> anchor_; 00179 }; 00180 00181 } 00182 00183 00184 #endif /* IMAGEMOLECULE_H_ */