21 #ifndef otbImageToPointSetFilter_hxx
22 #define otbImageToPointSetFilter_hxx
25 #include "itkMultiThreaderBase.h"
33 template <
class TInputImage,
class TOutputPo
intSet>
36 this->ProcessObjectType::SetNumberOfRequiredInputs(1);
40 ProcessObjectType::SetNumberOfRequiredOutputs(1);
41 ProcessObjectType::SetNthOutput(0, output.GetPointer());
43 m_PointsContainerPerThread.clear();
44 m_PointDataContainerPerThread.clear();
47 m_StreamingManager = StreamingManagerType::New();
53 template <
class TInputImage,
class TOutputPo
intSet>
58 this->ProcessObjectType::SetNthInput(idx,
const_cast<InputImageType*
>(input));
64 template <
class TInputImage,
class TOutputPo
intSet>
69 this->ProcessObjectType::SetNthInput(0,
const_cast<InputImageType*
>(input));
75 template <
class TInputImage,
class TOutputPo
intSet>
80 return dynamic_cast<const InputImageType*
>(this->ProcessObjectType::GetInput(idx));
86 template <
class TInputImage,
class TOutputPo
intSet>
89 if (this->GetNumberOfInputs() < 1)
92 return dynamic_cast<const InputImageType*
>(this->ProcessObjectType::GetInput(0));
98 template <
class TInputImage,
class TOutputPo
intSet>
101 Superclass::PrintSelf(os, indent);
109 template <
class TInputImage,
class TOutputPo
intSet>
117 template <
class TInputImage,
class TOutputPo
intSet>
122 outputPointsContainer->Initialize();
125 outputPointDataContainer->Initialize();
127 typename TInputImage::RegionType inputRegion = this->GetInput()->GetLargestPossibleRegion();
133 m_StreamingManager->PrepareStreaming(input, inputRegion);
135 unsigned long numDivisions = m_StreamingManager->GetNumberOfSplits();
143 for (piece = 0; piece < numDivisions && !this->GetAbortGenerateData(); piece++)
145 streamRegion = m_StreamingManager->GetSplit(piece);
146 typedef itk::ImageToImageFilterDetail::ImageRegionCopier<itkGetStaticConstMacro(InputImageDimension), itkGetStaticConstMacro(InputImageDimension)>
147 OutputToInputRegionCopierType;
148 OutputToInputRegionCopierType regionCopier;
150 regionCopier(inputRegion2, streamRegion);
151 input->SetRequestedRegion(inputRegion2);
157 this->BeforeThreadedGenerateData();
164 typename PointsContainerType::Pointer defaultPointsContainer = PointsContainerType::New();
167 typename PointDataContainerType::Pointer defaultPointDataContainer = PointDataContainerType::New();
171 this->GetMultiThreader()->SetNumberOfWorkUnits(this->GetNumberOfWorkUnits());
172 this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str);
175 this->GetMultiThreader()->SingleMethodExecute();
179 this->AfterThreadedGenerateData();
183 template <
class TInputImage,
class TOutputPo
intSet>
188 template <
class TInputImage,
class TOutputPo
intSet>
193 unsigned long currentIndex = outputPointsContainer->Size();
195 typedef typename PointsContainerType::ConstIterator OutputPointsContainerIterator;
196 for (
unsigned int i = 0; i < this->m_PointsContainerPerThread.size(); ++i)
198 if (this->m_PointsContainerPerThread[i].IsNotNull())
200 for (OutputPointsContainerIterator it = this->m_PointsContainerPerThread[i]->Begin(); it != this->m_PointsContainerPerThread[i]->End(); ++it)
202 outputPointsContainer->InsertElement(currentIndex, it.Value());
209 currentIndex = outputPointDataContainer->Size();
211 typedef typename PointDataContainerType::ConstIterator OutputPointDataContainerIterator;
212 for (
unsigned int i = 0; i < this->m_PointDataContainerPerThread.size(); ++i)
214 if (this->m_PointDataContainerPerThread[i].IsNotNull())
216 for (OutputPointDataContainerIterator it = this->m_PointDataContainerPerThread[i]->Begin(); it != this->m_PointDataContainerPerThread[i]->End(); ++it)
218 outputPointDataContainer->InsertElement(currentIndex, it.Value());
225 template <
class TInputImage,
class TOutputPo
intSet>
232 std::ostringstream message;
233 message <<
"itk::ERROR: " << this->GetNameOfClass() <<
"(" <<
this <<
"): "
234 <<
"Subclass should override this method!!!";
235 itk::ExceptionObject e_(__FILE__, __LINE__, message.str(), ITK_LOCATION);
239 template <
class TInputImage,
class TOutputPo
intSet>
240 itk::ITK_THREAD_RETURN_TYPE
245 unsigned int total, threadCount;
246 itk::ThreadIdType threadId;
248 threadId = ((itk::MultiThreaderBase::WorkUnitInfo *) (arg))->WorkUnitID;
249 threadCount = ((itk::MultiThreaderBase::WorkUnitInfo *) (arg))->NumberOfWorkUnits;
250 str = (
ThreadStruct *) (((itk::MultiThreaderBase::WorkUnitInfo *) (arg))->UserData);
254 typename TInputImage::RegionType splitRegion;
255 total = str->
Filter->SplitRequestedRegion(threadId, threadCount, splitRegion);
257 if (threadId < total)
259 str->
Filter->ThreadedGenerateData(splitRegion, threadId);
268 return itk::ITK_THREAD_RETURN_DEFAULT_VALUE;
271 template <
class TInputImage,
class TOutputPo
intSet>
275 typename InputImageType::ConstPointer inputPtr = this->GetInput();
276 const typename TInputImage::SizeType& requestedRegionSize = inputPtr->GetRequestedRegion().GetSize();
279 typename TInputImage::IndexType splitIndex;
280 typename TInputImage::SizeType splitSize;
283 splitRegion = inputPtr->GetRequestedRegion();
284 splitIndex = splitRegion.GetIndex();
285 splitSize = splitRegion.GetSize();
288 splitAxis = inputPtr->GetImageDimension() - 1;
289 while (requestedRegionSize[splitAxis] == 1)
294 itkDebugMacro(
" Cannot Split");
300 typename TInputImage::SizeType::SizeValueType range = requestedRegionSize[splitAxis];
301 int valuesPerThread = (int)::std::ceil(range / (
double)num);
302 int maxThreadIdUsed = (int)::std::ceil(range / (
double)valuesPerThread) - 1;
305 if (i < maxThreadIdUsed)
307 splitIndex[splitAxis] += i * valuesPerThread;
308 splitSize[splitAxis] = valuesPerThread;
310 if (i == maxThreadIdUsed)
312 splitIndex[splitAxis] += i * valuesPerThread;
314 splitSize[splitAxis] = splitSize[splitAxis] - i * valuesPerThread;
318 splitRegion.SetIndex(splitIndex);
319 splitRegion.SetSize(splitSize);
321 itkDebugMacro(
" Split Piece: " << splitRegion);
323 return maxThreadIdUsed + 1;
virtual int SplitRequestedRegion(int i, int num, InputImageRegionType &splitRegion)
virtual void BeforeThreadedGenerateData()
virtual void AfterThreadedGenerateData()
virtual void ThreadedGenerateData(const InputImageRegionType &inputRegionForThread, itk::ThreadIdType threadId)
Superclass::PointsContainerType PointsContainerType
TInputImage InputImageType
InputImageType::Pointer InputImagePointer
std::vector< typename OutputPointSetType::PointDataContainer::Pointer > OutputPointDataContainerForThreadType
void PrintSelf(std::ostream &os, itk::Indent indent) const override
Superclass::OutputPointSetType OutputPointSetType
Superclass::PointDataContainerType PointDataContainerType
void GenerateData(void) override
Superclass::OutputPointSetPointer OutputPointSetPointer
std::vector< typename OutputPointSetType::PointsContainer::Pointer > OutputPointsContainerForThreadType
static itk::ITK_THREAD_RETURN_TYPE ThreaderCallback(void *arg)
InputImageType::RegionType InputImageRegionType
void GenerateOutputInformation(void) override
const InputImageType * GetInput()
void SetInput(unsigned int idx, const InputImageType *input)
The "otb" namespace contains all Orfeo Toolbox (OTB) classes.