RegionGraph.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "RegionGraph.h"
  2. using namespace std;
  3. using namespace NICE;
  4. using namespace OBJREC;
  5. Node::Node(int n)
  6. {
  7. atborder = false;
  8. number = n;
  9. size = 0;
  10. amountx = 0;
  11. amounty = 0;
  12. maxx = -numeric_limits<int>::max();
  13. maxy = -numeric_limits<int>::max();
  14. minx = numeric_limits<int>::max();
  15. miny = numeric_limits<int>::max();
  16. }
  17. void Node::addNeighbor(Node *nb)
  18. {
  19. neighbors.push_back(nb);
  20. int l = nb->getLabel();
  21. if (l != label)
  22. atborder = true;
  23. }
  24. void Node::getRect(int &x0, int &y0, int &x1, int &y1)
  25. {
  26. x0 = minx;
  27. x1 = maxx;
  28. y0 = miny;
  29. y1 = maxy;
  30. }
  31. void Node::change(int nblabel)
  32. {
  33. if (nblabel != label)
  34. atborder = true;
  35. else
  36. {
  37. atborder = false;
  38. for (int i = 0; i < (int) neighbors.size(); i++)
  39. {
  40. if (neighbors[i]->getLabel() != label)
  41. atborder = true;
  42. }
  43. }
  44. }
  45. bool Node::isAtBorder()
  46. {
  47. return atborder;
  48. }
  49. void Node::setLabel(int l)
  50. {
  51. label = l;
  52. }
  53. int Node::getLabel() const
  54. {
  55. return label;
  56. }
  57. void Node::getNeighbors(vector<Node*> &nb) const
  58. {
  59. nb = neighbors;
  60. }
  61. int Node::getRegion() const
  62. {
  63. return number;
  64. }
  65. void Node::incSize(int s)
  66. {
  67. size += s;
  68. }
  69. void Node::addPos(int x, int y)
  70. {
  71. amountx += x;
  72. amounty += y;
  73. minx = std::min(minx, x);
  74. miny = std::min(miny, y);
  75. maxx = std::max(maxx, x);
  76. maxy = std::max(maxy, y);
  77. }
  78. void Node::getCentroid(int &x, int &y) const
  79. {
  80. x = amountx / size;
  81. y = amounty / size;
  82. }
  83. int Node::getSize() const
  84. {
  85. return size;
  86. }
  87. int Node::getSpan() const
  88. {
  89. return std::max(maxx - minx, maxy - miny);
  90. }
  91. int Node::store(ofstream & fout)
  92. {
  93. fout << number << " " << size << " " << amountx / size << " " << amounty / size << " " << minx << " " << miny << " " << maxx << " " << maxy << endl;
  94. for (uint i = 0; i < neighbors.size(); i++)
  95. {
  96. fout << neighbors[i]->getNumber() << " ";
  97. }
  98. fout << endl;
  99. for (uint i = 0; i < probs.size(); i++)
  100. {
  101. fout << probs[i] << " ";
  102. }
  103. fout << endl;
  104. }
  105. void Node::setProbs(vector<double> _probs)
  106. {
  107. probs = _probs;
  108. }
  109. RegionGraph::~RegionGraph()
  110. {
  111. for (int i = 0; i < (int)nodes.size();i++)
  112. {
  113. delete nodes[i];
  114. }
  115. }
  116. void RegionGraph::computeGraph(const Examples &regions, const NICE::Matrix &mask)
  117. {
  118. int rs = (int)regions.size();
  119. computeGraph(mask, rs);
  120. for (int i = 0; i < rs; i++)
  121. {
  122. nodes[i]->setLabel(regions[i].first);
  123. }
  124. }
  125. void RegionGraph::get(vector<Node*> &n) const
  126. {
  127. n = nodes;
  128. }
  129. void RegionGraph::computeGraph(const NICE::Matrix &mask, const int &rgcount)
  130. {
  131. vector<set<int> > nbs;
  132. for (int i = 0; i < rgcount; i++)
  133. {
  134. Node * a = new Node(i);
  135. nodes.push_back(a);
  136. nodes[i]->setLabel(0);
  137. set<int> nb;
  138. nbs.push_back(nb);
  139. }
  140. for (int y = 0; y < (int)mask.cols(); y++)
  141. {
  142. for (int x = 0; x < (int)mask.rows(); x++)
  143. {
  144. int val = mask(x, y);
  145. for (int i = -1; i < 2; i++)
  146. {
  147. if (x + i < 0 || x + i >= (int)mask.rows())
  148. continue;
  149. for (int j = -1; j < 2; j++)
  150. {
  151. if (y + j < 0 || y + j >= (int)mask.cols())
  152. continue;
  153. int val2 = mask(x + i, y + j);
  154. if (val2 != val)
  155. {
  156. nbs[val].insert(val2);
  157. }
  158. }
  159. }
  160. nodes[val]->incSize();
  161. nodes[val]->addPos(x, y);
  162. }
  163. }
  164. for (int i = 0; i < rgcount; i++)
  165. {
  166. for ( set<int>::const_iterator iter = nbs[i].begin();iter != nbs[i].end();++iter)
  167. {
  168. nodes[i]->addNeighbor(nodes[*iter]);
  169. }
  170. }
  171. }
  172. int RegionGraph::size() const
  173. {
  174. return (int)nodes.size();
  175. }
  176. Node* RegionGraph::operator[](int i) const
  177. {
  178. return nodes[i];
  179. }
  180. void RegionGraph::write(string file)
  181. {
  182. ofstream fout(file.c_str());
  183. fout << nodes.size() << endl;
  184. for (int i = 0; i < nodes.size(); i++)
  185. {
  186. nodes[i]->store(fout);
  187. }
  188. fout.close();
  189. return;
  190. }