Loading...
Searching...
No Matches
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"
31#include "Matrix.h"
32
33#include <boost/noncopyable.hpp>
34
35namespace 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 */
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
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
Generic template matrix.
Region Growing segment.
A generic template matrix.
Definition: Matrix.h:55
SegmenterSegmentsBlock::SegmentIdDataType m_nextUnusedSegmentIdx
The next unused segment index.
unsigned int m_featuresNumber
The number of features for each created segment.
bool initialize(const SegmenterSegmentsBlock::SegmentIdDataType segsNumber, const unsigned int featuresNumber)
Pool initialization.
Matrix< FeatureDataTypeT > m_segmentsFeatures
Internal stored segment features.
SegmenterSegmentsBlock::SegmentIdDataType getSegmentsNumber() const
Return the current allocated segments number.
SegmenterSegmentsBlock::SegmentIdDataType m_segsNumber
The number of segments allocated segments.
SegmenterRegionGrowingSegment< FeatureDataTypeT > * getNextSegment()
Retrive a stored segment.
Matrix< SegmenterRegionGrowingSegment< FeatureDataTypeT > > m_segments
Internal stored segments.
Matrix< SegmenterRegionGrowingSegment< FeatureDataTypeT > > & getSegsMatrix()
Return a reference to the internal segments matrix.
TerraLib.
Proxy configuration file for TerraView (see terraview_config.h).