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 */
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 >
128
129 template< typename FeatureDataTypeT >
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 {
201 }
202
203 return true;
204 }
205
206
207 template< typename FeatureDataTypeT >
210 {
212 {
215 m_segments.getColumnsNumber() );
216
218
219 assert( m_getNextSegment_line < m_segments.getLinesNumber() );
220 assert( m_getNextSegment_col < m_segments.getColumnsNumber() );
221
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;
251 m_segments.reset();
252 m_segmentsFeatures.reset();
253 }
254
255 template< typename FeatureDataTypeT >
260
261 template< typename FeatureDataTypeT >
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.
Namespace for Raster Processing module of TerraLib.
TerraLib.
Configuration flags for the Raster Processing module of TerraLib.