SegmenterRegionGrowingSegmentsPool.h
Go to the documentation of this file.
1 /* Copyright (C) 2008-2015 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/rp/SegmenterRegionGrowingSegmentsPool.h
22  \brief Segments pool.
23  */
24 
25 #ifndef __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENTSPOOL_H
26 #define __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENTSPOOL_H
27 
28 #include "Config.h"
30 #include "SegmenterSegmentsBlock.h"
31 #include "Matrix.h"
32 
33 #include <boost/noncopyable.hpp>
34 
35 namespace te
36 {
37  namespace rp
38  {
39  /*!
40  \class SegmenterRegionGrowingSegmentsPool
41  \brief Segments pool.
42  \note The vector pointed by each SegmenterRegionGrowingSegment::m_neighborSegments will be deleted by the pool.
43  */
44  template< typename FeatureDataTypeT >
45  class SegmenterRegionGrowingSegmentsPool : private boost::noncopyable
46  {
47  public :
48 
50 
52 
53  /*!
54  \brief Pool initialization.
55  \param segsNumber The number of segments to allocate.
56  \param featuresNumber The number of features for each created segment.
57  \return true if ok, false on errors.
58  \note The segments pool will initiate just SegmenterRegionGrowingSegment::m_features vector and take the ownership of it.
59  */
61  const unsigned int featuresNumber );
62 
63  /*!
64  \brief Retrive a stored segment.
65  \return A pointer to the next unused segment or null if all segments were used.
66  */
68 
69  /*!
70  \brief Clear all stored data.
71  */
72  void clear();
73 
74  /*!
75  \brief Reset the segments use counter.
76  */
77  void resetUseCounter();
78 
79  /*!
80  \brief Return the current allocated segments number.
81  */
83 
84  /*!
85  \brief Return a reference to the internal segments matrix.
86  \return Return a reference to the internal segments matrix.
87  \note The number of matrix elemetns may be greater than the requested number of segments.
88  */
90  {
91  return m_segments;
92  };
93 
94  protected :
95 
96  /*!
97  \brief The number of segments allocated segments.
98  */
100 
101  /*!
102  \brief The number of features for each created segment.
103  */
104  unsigned int m_featuresNumber;
105 
106  /*!
107  \brief The next unused segment index.
108  */
110 
112 
113  Matrix< FeatureDataTypeT > m_segmentsFeatures; //!< Internal stored segment features.
114 
115  // Variables used by getNextSegment
116 
117  unsigned int m_getNextSegment_line;
118  unsigned int m_getNextSegment_col;
119  };
120 
121  template< typename FeatureDataTypeT >
123  {
124  m_segsNumber = 0;
125  m_featuresNumber = 0;
126  m_nextUnusedSegmentIdx = 0;
127  }
128 
129  template< typename FeatureDataTypeT >
131  {
132  clear();
133  }
134 
135  template< typename FeatureDataTypeT >
138  const unsigned int featuresNumber )
139  {
140  if( ( segsNumber > m_segsNumber ) || ( featuresNumber != m_featuresNumber ) )
141  {
142  clear();
143 
144  if( segsNumber )
145  {
146  unsigned int nCols = (unsigned int)std::floor( std::sqrt( (double)segsNumber ) );
147  unsigned int nRows = (unsigned int)std::ceil( ((double)segsNumber) /
148  ((double)nCols) );
149  assert( ( nCols * nRows ) >= segsNumber );
150 
151  if( m_segments.reset( nRows, nCols,
153  {
154  return false;
155  }
156 
157  m_segsNumber = segsNumber;
158 
159  if( featuresNumber )
160  {
161  if( m_segmentsFeatures.reset( nRows, nCols * featuresNumber,
163  {
164  clear();
165  return false;
166  }
167 
168  m_featuresNumber = featuresNumber;
169 
170  unsigned int col = 0;
171  for( unsigned int row = 0 ; row < nRows ; ++row )
172  {
173  for( col = 0 ; col < nCols ; ++col )
174  {
175  m_segments[ row ][ col ].m_neighborSegments = 0;
176  m_segments[ row ][ col ].m_neighborSegmentsSize = 0;
177  m_segments[ row ][ col ].m_features = m_segmentsFeatures[ row ] + ( col * featuresNumber );
178  m_segments[ row ][ col ].m_featuresSize = featuresNumber;
179  }
180  }
181  }
182  else
183  {
184  unsigned int col = 0;
185  for( unsigned int row = 0 ; row < nRows ; ++row )
186  {
187  for( col = 0 ; col < nCols ; ++col )
188  {
189  m_segments[ row ][ col ].m_neighborSegments = 0;
190  m_segments[ row ][ col ].m_neighborSegmentsSize = 0;
191  m_segments[ row ][ col ].m_features = 0;
192  m_segments[ row ][ col ].m_featuresSize = 0;
193  }
194  }
195  }
196  }
197  }
198  else
199  {
200  resetUseCounter();
201  }
202 
203  return true;
204  }
205 
206 
207  template< typename FeatureDataTypeT >
210  {
211  if( m_nextUnusedSegmentIdx < m_segsNumber )
212  {
213  m_getNextSegment_line = m_nextUnusedSegmentIdx / m_segments.getColumnsNumber();
214  m_getNextSegment_col = m_nextUnusedSegmentIdx - ( m_getNextSegment_line *
215  m_segments.getColumnsNumber() );
216 
217  ++m_nextUnusedSegmentIdx;
218 
219  assert( m_getNextSegment_line < m_segments.getLinesNumber() );
220  assert( m_getNextSegment_col < m_segments.getColumnsNumber() );
221 
222  return m_segments[ m_getNextSegment_line ] + m_getNextSegment_col;
223  }
224  else
225  {
226  return 0;
227  }
228  }
229 
230  template< typename FeatureDataTypeT >
232  {
233  unsigned int nRows = m_segments.getLinesNumber();
234  unsigned int nCols = m_segments.getColumnsNumber();
235 
236  unsigned int col = 0;
237  for( unsigned int row = 0 ; row < nRows ; ++row )
238  {
239  for( col = 0 ; col < nCols ; ++col )
240  {
241  if( m_segments[ row ][ col ].m_neighborSegments )
242  {
243  m_segments[ row ][ col ].removeAllNeighborSegmentsPtrs();
244  }
245  }
246  }
247 
248  m_segsNumber = 0;
249  m_featuresNumber = 0;
250  m_nextUnusedSegmentIdx = 0;
251  m_segments.reset();
252  m_segmentsFeatures.reset();
253  }
254 
255  template< typename FeatureDataTypeT >
257  {
258  m_nextUnusedSegmentIdx = 0;
259  }
260 
261  template< typename FeatureDataTypeT >
264  {
265  return m_segsNumber;
266  }
267  } // namespace rp
268 } // namespace te
269 
270 #endif // __TERRALIB_RP_INTERNAL_SEGMENTERREGIONGROWINGSEGMENTSPOOL_H
bool initialize(const SegmenterSegmentsBlock::SegmentIdDataType segsNumber, const unsigned int featuresNumber)
Pool initialization.
SegmenterSegmentsBlock::SegmentIdDataType m_segsNumber
The number of segments allocated segments.
Matrix< SegmenterRegionGrowingSegment< FeatureDataTypeT > > & getSegsMatrix()
Return a reference to the internal segments matrix.
SegmenterSegmentsBlock::SegmentIdDataType m_nextUnusedSegmentIdx
The next unused segment index.
void resetUseCounter()
Reset the segments use counter.
Region Growing segment.
URI C++ Library.
Generic template matrix.
Matrix< SegmenterRegionGrowingSegment< FeatureDataTypeT > > m_segments
Internal stored segments.
unsigned int m_featuresNumber
The number of features for each created segment.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * getNextSegment()
Retrive a stored segment.
Configuration flags for the Raster Processing module of TerraLib.
Segments block.
A generic template matrix.
Definition: Matrix.h:51
SegmenterSegmentsBlock::SegmentIdDataType getSegmentsNumber() const
Return the current allocated segments number.
Matrix< FeatureDataTypeT > m_segmentsFeatures
Internal stored segment features.