An error occurred while loading the file. Please try again.
-
Manuel Grizonnet authored
OTB followed since the beginning the ITK convention and use .txx extension for all template classes. Nevertheless, some development tools do not recognize .txx file extension. Other tool like GitHub can't do in-browser syntax highlighting for txx files I think. The root problem is the use of the txx which should be changed to hxx (or hpp). In 2011, after an in-depth discussion near April 20, 2011 on the Insight-Developers mailing list, ITK rename all txx files to hxx (and event prevent the push of .txx files with a pre-commit hook). It happens is major release v4. You can find some arguments in the discussion about the change and also in other projects related to ITK which applied the same modification, see for instance VXL: https://github.com/vxl/vxl/issues/209 This commit apply now the same modification for OTB. I understand that it will change some habit for developers and don't bring new features but I think that in general it is better to stay align w...
3a1fd1fc
/*=========================================================================
Copyright (c) Remi Cresson (IRSTEA). All rights reserved.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef MODULES_REMOTE_SIMPLEEXTRACTIONTOOLS_INCLUDE_OTBCACHELESSLABELIMAGETOVECTORDATA_txx_
#define MODULES_REMOTE_SIMPLEEXTRACTIONTOOLS_INCLUDE_OTBCACHELESSLABELIMAGETOVECTORDATA_txx_
#include "otbCacheLessLabelImageToVectorData.h"
#include "itkObjectFactoryBase.h"
#include "itkImageRegionMultidimensionalSplitter.h"
#include "itkImageRegionIterator.h"
#include "otbNumberOfDivisionsStrippedStreamingManager.h"
#include "otbNumberOfDivisionsTiledStreamingManager.h"
#include "otbNumberOfLinesStrippedStreamingManager.h"
#include "otbRAMDrivenStrippedStreamingManager.h"
#include "otbTileDimensionTiledStreamingManager.h"
#include "otbRAMDrivenTiledStreamingManager.h"
#include "otbRAMDrivenAdaptativeStreamingManager.h"
namespace otb
{
/**
*
*/
template <class TInputImagePixel>
CacheLessLabelImageToVectorData<TInputImagePixel>
::CacheLessLabelImageToVectorData()
: m_NumberOfDivisions(0),
m_CurrentDivision(0),
m_DivisionProgress(0.0),
m_IsObserving(true),
m_ObserverID(0)
{
// By default, we use tiled streaming, with automatic tile size
// We don't set any parameter, so the memory size is retrieved from the OTB configuration options
this->SetAutomaticAdaptativeStreaming();
}
/**
*
*/
template <class TInputImagePixel>
CacheLessLabelImageToVectorData<TInputImagePixel>
::~CacheLessLabelImageToVectorData()
{
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetNumberOfDivisionsStrippedStreaming(unsigned int nbDivisions)
{
typedef NumberOfDivisionsStrippedStreamingManager<InputImageType> NumberOfDivisionsStrippedStreamingManagerType;
typename NumberOfDivisionsStrippedStreamingManagerType::Pointer streamingManager = NumberOfDivisionsStrippedStreamingManagerType::New();
streamingManager->SetNumberOfDivisions(nbDivisions);
m_StreamingManager = streamingManager;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetNumberOfDivisionsTiledStreaming(unsigned int nbDivisions)
{
typedef NumberOfDivisionsTiledStreamingManager<InputImageType> NumberOfDivisionsTiledStreamingManagerType;
typename NumberOfDivisionsTiledStreamingManagerType::Pointer streamingManager = NumberOfDivisionsTiledStreamingManagerType::New();
streamingManager->SetNumberOfDivisions(nbDivisions);
m_StreamingManager = streamingManager;
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetNumberOfLinesStrippedStreaming(unsigned int nbLinesPerStrip)
{
typedef NumberOfLinesStrippedStreamingManager<InputImageType> NumberOfLinesStrippedStreamingManagerType;
typename NumberOfLinesStrippedStreamingManagerType::Pointer streamingManager = NumberOfLinesStrippedStreamingManagerType::New();
streamingManager->SetNumberOfLinesPerStrip(nbLinesPerStrip);
m_StreamingManager = streamingManager;
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetAutomaticStrippedStreaming(unsigned int availableRAM, double bias)
{
typedef RAMDrivenStrippedStreamingManager<InputImageType> RAMDrivenStrippedStreamingManagerType;
typename RAMDrivenStrippedStreamingManagerType::Pointer streamingManager = RAMDrivenStrippedStreamingManagerType::New();
streamingManager->SetAvailableRAMInMB(availableRAM);
streamingManager->SetBias(bias);
m_StreamingManager = streamingManager;
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetTileDimensionTiledStreaming(unsigned int tileDimension)
{
typedef TileDimensionTiledStreamingManager<InputImageType> TileDimensionTiledStreamingManagerType;
typename TileDimensionTiledStreamingManagerType::Pointer streamingManager = TileDimensionTiledStreamingManagerType::New();
streamingManager->SetTileDimension(tileDimension);
m_StreamingManager = streamingManager;
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetAutomaticTiledStreaming(unsigned int availableRAM, double bias)
{
typedef RAMDrivenTiledStreamingManager<InputImageType> RAMDrivenTiledStreamingManagerType;
typename RAMDrivenTiledStreamingManagerType::Pointer streamingManager = RAMDrivenTiledStreamingManagerType::New();
streamingManager->SetAvailableRAMInMB(availableRAM);
streamingManager->SetBias(bias);
m_StreamingManager = streamingManager;
}
template <class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetAutomaticAdaptativeStreaming(unsigned int availableRAM, double bias)
{
typedef RAMDrivenAdaptativeStreamingManager<InputImageType> RAMDrivenAdaptativeStreamingManagerType;
typename RAMDrivenAdaptativeStreamingManagerType::Pointer streamingManager = RAMDrivenAdaptativeStreamingManagerType::New();
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
streamingManager->SetAvailableRAMInMB(availableRAM);
streamingManager->SetBias(bias);
m_StreamingManager = streamingManager;
}
template<class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::SetInput(const InputImageType* input)
{
this->ProcessObject::SetNthInput(0,const_cast<InputImageType*>(input));
}
template<class TInputImagePixel>
const typename CacheLessLabelImageToVectorData<TInputImagePixel>::InputImageType*
CacheLessLabelImageToVectorData<TInputImagePixel>
::GetInput()
{
if (this->GetNumberOfInputs() < 1)
{
return ITK_NULLPTR;
}
return static_cast<const InputImageType*>(this->ProcessObject::GetInput(0));
}
/**
* Update method : update output information of input and write to file
*/
template<class TInputImagePixel>
void
CacheLessLabelImageToVectorData<TInputImagePixel>
::Update()
{
// Update output information on input image
InputImagePointer inputPtr =
const_cast<InputImageType *>(this->GetInput());
// Make sure input is available
if ( inputPtr.IsNull() )
{
itkExceptionMacro(<< "No input to writer");
}
this->SetAbortGenerateData(0);
this->SetProgress(0.0);
/**
* Tell all Observers that the filter is starting
*/
this->InvokeEvent(itk::StartEvent());
/**
* Grab the input
*/
inputPtr->UpdateOutputInformation();
InputImageRegionType inputRegion = inputPtr->GetLargestPossibleRegion();
// Allocate the buffer image
bufferedInputImage = InputImageType::New();
bufferedInputImage->SetRegions(inputRegion);
bufferedInputImage->Allocate();
bufferedInputImage->SetMetaDataDictionary(inputPtr->GetMetaDataDictionary());
bufferedInputImage->SetSpacing(inputPtr->GetSignedSpacing());
bufferedInputImage->SetOrigin (inputPtr->GetOrigin() );
/** Compare the buffered region with the inputRegion which is the largest
* possible region or a user defined region through extended filename
* Not sure that if this modification is needed */
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
if (inputPtr->GetBufferedRegion() == inputRegion)
{
otbMsgDevMacro(<< "Buffered region is the largest possible region, there is no need for streaming.");
this->SetNumberOfDivisionsStrippedStreaming(1);
}
m_StreamingManager->PrepareStreaming(inputPtr, inputRegion);
m_NumberOfDivisions = m_StreamingManager->GetNumberOfSplits();
otbMsgDebugMacro(<< "Number Of Stream Divisions : " << m_NumberOfDivisions);
/**
* Loop over the number of pieces, execute the upstream pipeline on each
* piece, and copy the results into the output image.
*/
InputImageRegionType streamRegion;
this->UpdateProgress(0);
m_CurrentDivision = 0;
m_DivisionProgress = 0;
// Get the source process object
itk::ProcessObject* source = inputPtr->GetSource();
m_IsObserving = false;
m_ObserverID = 0;
// Check if source exists
if(source)
{
typedef itk::MemberCommand<Self> CommandType;
typedef typename CommandType::Pointer CommandPointerType;
CommandPointerType command = CommandType::New();
command->SetCallbackFunction(this, &Self::ObserveSourceFilterProgress);
m_ObserverID = source->AddObserver(itk::ProgressEvent(), command);
m_IsObserving = true;
}
else
{
itkWarningMacro(<< "Could not get the source process object. Progress report might be buggy");
}
for (m_CurrentDivision = 0;
m_CurrentDivision < m_NumberOfDivisions && !this->GetAbortGenerateData();
m_CurrentDivision++, m_DivisionProgress = 0, this->UpdateFilterProgress())
{
streamRegion = m_StreamingManager->GetSplit(m_CurrentDivision);
inputPtr->SetRequestedRegion(streamRegion);
inputPtr->PropagateRequestedRegion();
inputPtr->UpdateOutputData();
// Copy output in buffer
ConstIteratorType inIt(inputPtr, streamRegion);
IteratorType outIt(bufferedInputImage, streamRegion);
for (inIt.GoToBegin(), outIt.GoToBegin(); !inIt.IsAtEnd(); ++outIt, ++inIt)
{
outIt.Set(inIt.Get());
}
}
// Vectorize the buffered image
vectorizeFilter = LabelImageToVectorDataFilterType::New();
vectorizeFilter->SetInput(bufferedInputImage);
vectorizeFilter->SetInputMask(bufferedInputImage);
vectorizeFilter->Update();
this->GraftOutput( vectorizeFilter->GetOutput() );
/**
* If we ended due to aborting, push the progress up to 1.0 (since
281282283284285286287288289290291292293294295296297298299300301302303304305306307308
* it probably didn't end there)
*/
if (!this->GetAbortGenerateData())
{
this->UpdateProgress(1.0);
}
// Notify end event observers
this->InvokeEvent(itk::EndEvent());
if (m_IsObserving)
{
m_IsObserving = false;
source->RemoveObserver(m_ObserverID);
}
/**
* Release any inputs if marked for release
*/
this->ReleaseInputs();
}
} // end namespace otb
#endif