From aa288e4d34c81115f3581cbd9dc1446abc8d34de Mon Sep 17 00:00:00 2001 From: remicres <remi.cresson@teledetection.fr> Date: Wed, 24 Aug 2016 13:11:46 +0000 Subject: [PATCH] REFAC: KWStyle --- app/otbLSGRM.cxx | 51 +++----- include/lsgrmBaatzSegmenter.txx | 88 +++++++------- include/lsgrmController.txx | 20 ++-- include/lsgrmFullLambdaScheduleSegmenter.txx | 70 +++++------ include/lsgrmGraphOperations.txx | 10 +- include/lsgrmGraphToOtbImage.h | 38 +++--- include/lsgrmGraphToOtbImage.txx | 120 +++++++++---------- include/lsgrmSplitter.txx | 12 +- include/lsgrmSpringSegmenter.txx | 70 +++++------ 9 files changed, 235 insertions(+), 244 deletions(-) diff --git a/app/otbLSGRM.cxx b/app/otbLSGRM.cxx index 2844ba7..99d34d3 100644 --- a/app/otbLSGRM.cxx +++ b/app/otbLSGRM.cxx @@ -10,7 +10,7 @@ #include "itkFixedArray.h" #include "itkImageSource.h" -// GRM +// LSGRM #include <iostream> #include "lsgrmBaatzSegmenter.h" #include "lsgrmSpringSegmenter.h" @@ -44,9 +44,6 @@ public: typedef lsgrm::BaatzSegmenter<ImageType> BaatzSegmenterType; typedef lsgrm::SpringSegmenter<ImageType> SpringSegmenterType; typedef lsgrm::FullLambdaScheduleSegmenter<ImageType> FLSSegmenterType; - typedef lsgrm::Controller<BaatzSegmenterType> BaatzControllerType; - typedef lsgrm::Controller<SpringSegmenterType> SpringControllerType; - typedef lsgrm::Controller<FLSSegmenterType> FLSControllerType; private: @@ -69,8 +66,8 @@ private: void DoInit() { SetName("GenericRegionMerging"); - SetDescription("This application allows to use the Generic Region Merging library " - "(GRM) and provides currently 3 homogeneity criteria: Euclidean Distance, " + SetDescription("This application allows to use the Large Scale Generic Region Merging library " + "(LSGRM) and provides currently 3 homogeneity criteria: Euclidean Distance, " "Full Lambda Schedule and Baatz & Schape criterion."); // Input and Output images @@ -114,7 +111,6 @@ private: { } - /* * Return a prefix for temporary files */ @@ -143,9 +139,16 @@ private: /* * This function sets the generic parameters of a controller and runs the segmentation */ - template<class TController> - UInt32ImageType::Pointer SetGenericParametersAndRunSegmentation(typename TController::Pointer& controller) - { + template<class TSegmenter> + UInt32ImageType::Pointer SetGenericParametersAndRunSegmentation(const typename TSegmenter::ParamType params){ + + // Instantiate the controller + typedef typename lsgrm::Controller<TSegmenter> ControlerType; + typename ControlerType::Pointer controller = ControlerType::New(); + + // Set specific parameters + controller->SetSpecificParameters(params); + // Set input image controller->SetInputImage(GetParameterFloatVectorImage("in")); @@ -195,8 +198,6 @@ private: return controller->GetLabeledClusteredOutput(); } - - void DoExecute() { /* @@ -214,33 +215,20 @@ private: int inputCriterion = GetParameterInt("criterion"); if (inputCriterion == CRITERION_BAATZ) { - // Baatz controller - BaatzControllerType::Pointer baatzController = BaatzControllerType::New(); - - // Specific parameters grm::BaatzParam params; params.m_SpectralWeight = GetParameterFloat("criterion.bs.cw"); params.m_ShapeWeight = GetParameterFloat("criterion.bs.sw"); - baatzController->SetSpecificParameters(params); - - // Run segmentation - labelImage = SetGenericParametersAndRunSegmentation<BaatzControllerType>(baatzController); + labelImage = SetGenericParametersAndRunSegmentation<BaatzSegmenterType>(params); } else if (inputCriterion == CRITERION_SPRING) { - // Spring controller - SpringControllerType::Pointer springController = SpringControllerType::New(); - - // Run segmentation - labelImage = SetGenericParametersAndRunSegmentation<SpringControllerType>(springController); + grm::SpringParam params; + labelImage = SetGenericParametersAndRunSegmentation<SpringSegmenterType>(params); } else if (inputCriterion == CRITERION_FLS) { - // Full Lambda Schedule (FLS) controller - FLSControllerType::Pointer flsController = FLSControllerType::New(); - - // Run segmentation - labelImage = SetGenericParametersAndRunSegmentation<FLSControllerType>(flsController); + grm::FLSParam params; + labelImage = SetGenericParametersAndRunSegmentation<FLSSegmenterType>(params); } else { @@ -253,7 +241,6 @@ private: labelImage->SetSpacing(inputImage->GetSpacing()); SetParameterOutputImage<UInt32ImageType>("out", labelImage); - } void AfterExecuteAndWriteOutputs() @@ -275,6 +262,4 @@ private: } // end of namespace wrapper } // end of namespace otb - OTB_APPLICATION_EXPORT(otb::Wrapper::LSGRM) - diff --git a/include/lsgrmBaatzSegmenter.txx b/include/lsgrmBaatzSegmenter.txx index 3a33759..511e6bb 100644 --- a/include/lsgrmBaatzSegmenter.txx +++ b/include/lsgrmBaatzSegmenter.txx @@ -6,56 +6,56 @@ namespace lsgrm { - template<class TImage> - void - BaatzSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) - { - std::size_t bands = node->m_Means.size(); - fwrite(&(bands), sizeof(bands), 1, nodeStream); - - for(unsigned int b = 0; b < node->m_Means.size(); b++) - { - fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - fwrite(&(node->m_SquareMeans[b]), sizeof(node->m_SquareMeans[b]), 1, nodeStream); - fwrite(&(node->m_SpectralSum[b]), sizeof(node->m_SpectralSum[b]), 1, nodeStream); - fwrite(&(node->m_Std[b]), sizeof(node->m_Std[b]), 1, nodeStream); - } - } - - template<class TImage> - void - BaatzSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +template<class TImage> +void +BaatzSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands = node->m_Means.size(); + fwrite(&(bands), sizeof(bands), 1, nodeStream); + + for(unsigned int b = 0; b < node->m_Means.size(); b++) { - std::size_t bands; - fread(&(bands), sizeof(bands), 1, nodeStream); - node->m_Means.assign(bands, 0); - node->m_SquareMeans.assign(bands, 0); - node->m_SpectralSum.assign(bands, 0); - node->m_Std.assign(bands, 0); - - for(unsigned int b = 0; b < bands; b++) - { - fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - fread(&(node->m_SquareMeans[b]), sizeof(node->m_SquareMeans[b]), 1, nodeStream); - fread(&(node->m_SpectralSum[b]), sizeof(node->m_SpectralSum[b]), 1, nodeStream); - fread(&(node->m_Std[b]), sizeof(node->m_Std[b]), 1, nodeStream); - } + fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); + fwrite(&(node->m_SquareMeans[b]), sizeof(node->m_SquareMeans[b]), 1, nodeStream); + fwrite(&(node->m_SpectralSum[b]), sizeof(node->m_SpectralSum[b]), 1, nodeStream); + fwrite(&(node->m_Std[b]), sizeof(node->m_Std[b]), 1, nodeStream); } +} - template<class TImage> - long long unsigned int - BaatzSegmenter<TImage>::GetNodeMemory(NodePointerType &node) +template<class TImage> +void +BaatzSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands; + fread(&(bands), sizeof(bands), 1, nodeStream); + node->m_Means.assign(bands, 0); + node->m_SquareMeans.assign(bands, 0); + node->m_SpectralSum.assign(bands, 0); + node->m_Std.assign(bands, 0); + + for(unsigned int b = 0; b < bands; b++) { + fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); + fread(&(node->m_SquareMeans[b]), sizeof(node->m_SquareMeans[b]), 1, nodeStream); + fread(&(node->m_SpectralSum[b]), sizeof(node->m_SpectralSum[b]), 1, nodeStream); + fread(&(node->m_Std[b]), sizeof(node->m_Std[b]), 1, nodeStream); + } +} - unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); +template<class TImage> +long long unsigned int +BaatzSegmenter<TImage>::GetNodeMemory(NodePointerType &node) +{ - long long unsigned int memory = 0; - memory += sizeof(NodePointerType); // size of the node pointer - memory += sizeof(NodeType); // size of the node (actually, size of the base node) - memory += 4 * nBands * sizeof(float); // size of the 4 attributes, multiplied by the nb. of bands - memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges - return memory; - } + unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); + + long long unsigned int memory = 0; + memory += sizeof(NodePointerType); // size of the node pointer + memory += sizeof(NodeType); // size of the node (actually, size of the base node) + memory += 4 * nBands * sizeof(float); // size of the 4 attributes, multiplied by the nb. of bands + memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges + return memory; +} } // end of namespace lsrm #endif diff --git a/include/lsgrmController.txx b/include/lsgrmController.txx index d1ac3da..ead8e6c 100644 --- a/include/lsgrmController.txx +++ b/include/lsgrmController.txx @@ -108,10 +108,6 @@ void Controller<TSegmenter>::RunSegmentation() { numberOfIterationsRemaining -= numberOfIterationsForPartialSegmentations; } - else - { - isFusion = false; - } #ifdef OTB_USE_MPI // Gathering useful variables @@ -152,11 +148,21 @@ void Controller<TSegmenter>::RunSegmentation() itkExceptionMacro(<< "No more possible fusions, but can not store the output graph"); } } - else // tiling_mode is none + else if (m_TilingMode == LSGRM_TILING_NONE)// tiling_mode is none { - // todo use classic grm + // Use classic grm + TSegmenter segmenter; + segmenter.SetParam(m_SpecificParameters); + segmenter.SetThreshold(m_Threshold); + segmenter.SetDoFastSegmentation(true); + segmenter.SetNumberOfIterations(m_NumberOfIterations); + segmenter.SetInput(m_InputImage); + segmenter.Update(); + } + else + { + itkExceptionMacro(<<"Unknow tiling mode!"); } - } diff --git a/include/lsgrmFullLambdaScheduleSegmenter.txx b/include/lsgrmFullLambdaScheduleSegmenter.txx index b6218c1..6cc95b6 100644 --- a/include/lsgrmFullLambdaScheduleSegmenter.txx +++ b/include/lsgrmFullLambdaScheduleSegmenter.txx @@ -6,47 +6,47 @@ namespace lsgrm { - template<class TImage> - void - FullLambdaScheduleSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) - { - std::size_t bands = node->m_Means.size(); - fwrite(&(bands), sizeof(bands), 1, nodeStream); - - for(unsigned int b = 0; b < node->m_Means.size(); b++) - { - fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - } - } - - template<class TImage> - void - FullLambdaScheduleSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +template<class TImage> +void +FullLambdaScheduleSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands = node->m_Means.size(); + fwrite(&(bands), sizeof(bands), 1, nodeStream); + + for(unsigned int b = 0; b < node->m_Means.size(); b++) { - std::size_t bands; - fread(&(bands), sizeof(bands), 1, nodeStream); - node->m_Means.assign(bands, 0); - - for(unsigned int b = 0; b < bands; b++) - { - fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - } + fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); } +} + +template<class TImage> +void +FullLambdaScheduleSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands; + fread(&(bands), sizeof(bands), 1, nodeStream); + node->m_Means.assign(bands, 0); - template<class TImage> - long long unsigned int - FullLambdaScheduleSegmenter<TImage>::GetNodeMemory(NodePointerType &node) + for(unsigned int b = 0; b < bands; b++) { + fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); + } +} + +template<class TImage> +long long unsigned int +FullLambdaScheduleSegmenter<TImage>::GetNodeMemory(NodePointerType &node) +{ - unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); + unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); - long long unsigned int memory = 0; - memory += sizeof(NodePointerType); // size of the node pointer - memory += sizeof(NodeType); // size of the node (actually, size of the base node) - memory += 1 * nBands * sizeof(float); // size of the 1 attribute, multiplied by the nb. of bands - memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges - return memory; - } + long long unsigned int memory = 0; + memory += sizeof(NodePointerType); // size of the node pointer + memory += sizeof(NodeType); // size of the node (actually, size of the base node) + memory += 1 * nBands * sizeof(float); // size of the 1 attribute, multiplied by the nb. of bands + memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges + return memory; +} } // end of namespace lsrm #endif diff --git a/include/lsgrmGraphOperations.txx b/include/lsgrmGraphOperations.txx index b4ce481..ff3078c 100644 --- a/include/lsgrmGraphOperations.txx +++ b/include/lsgrmGraphOperations.txx @@ -661,14 +661,14 @@ long long unsigned int RunFirstPartialSegmentation( // and write them to the stability margin std::cout << "\tComputing stability margin..." << std::endl; { - std::unordered_map<typename TSegmenter::NodePointerType, unsigned int> borderNodeMap; + std::unordered_map<typename TSegmenter::NodePointerType, unsigned int> borderNodeMap; - DetectBorderNodes<TSegmenter>(segmenter.m_Graph, currentTile, - borderNodeMap, imageWidth, imageHeight); + DetectBorderNodes<TSegmenter>(segmenter.m_Graph, currentTile, + borderNodeMap, imageWidth, imageHeight); - ExtractStabilityMargin<TSegmenter>(borderNodeMap, numberOfNeighborLayers); + ExtractStabilityMargin<TSegmenter>(borderNodeMap, numberOfNeighborLayers); - WriteStabilityMargin<TSegmenter>(borderNodeMap, currentTile.nodeMarginFileName, currentTile.edgeMarginFileName); + WriteStabilityMargin<TSegmenter>(borderNodeMap, currentTile.nodeMarginFileName, currentTile.edgeMarginFileName); } } } // for each col diff --git a/include/lsgrmGraphToOtbImage.h b/include/lsgrmGraphToOtbImage.h index 8cca7a8..487451b 100644 --- a/include/lsgrmGraphToOtbImage.h +++ b/include/lsgrmGraphToOtbImage.h @@ -14,26 +14,26 @@ namespace lsgrm { - template<class TGraph> - class GraphToOtbImage - { - public: - - /* Some convenient typedefs */ - typedef TGraph GraphType; - typedef typename GraphType::NodeType NodeType; - typedef std::vector< std::shared_ptr<NodeType> > NodeList; - typedef typename NodeList::const_iterator NodeConstIterator; - typedef unsigned int LabelPixelType; - typedef otb::Image<LabelPixelType, 2> LabelImageType; - using ContourOperator = lp::ContourOperations; - +template<class TGraph> +class GraphToOtbImage +{ +public: + + /* Some convenient typedefs */ + typedef TGraph GraphType; + typedef typename GraphType::NodeType NodeType; + typedef std::vector< std::shared_ptr<NodeType> > NodeList; + typedef typename NodeList::const_iterator NodeConstIterator; + typedef unsigned int LabelPixelType; + typedef otb::Image<LabelPixelType, 2> LabelImageType; + using ContourOperator = lp::ContourOperations; + + + LabelImageType::Pointer GetLabelImage(const GraphType& graph, + const unsigned int width, + const unsigned int height); +}; - LabelImageType::Pointer GetLabelImage(const GraphType& graph, - const unsigned int width, - const unsigned int height); - }; - } // end of namespace lsrm #include "lsgrmGraphToOtbImage.txx" #endif diff --git a/include/lsgrmGraphToOtbImage.txx b/include/lsgrmGraphToOtbImage.txx index ba9ec34..6ad87b3 100644 --- a/include/lsgrmGraphToOtbImage.txx +++ b/include/lsgrmGraphToOtbImage.txx @@ -6,70 +6,70 @@ namespace lsgrm { - template<class TGraph> - typename GraphToOtbImage<TGraph>::LabelImageType::Pointer - GraphToOtbImage<TGraph>::GetLabelImage(const GraphType& graph, - const unsigned int width, - const unsigned int height) - { - LabelImageType::IndexType labelImageRegionStart; - LabelImageType::SizeType labelImageRegionSize; - LabelImageType::RegionType labelImageRegion; +template<class TGraph> +typename GraphToOtbImage<TGraph>::LabelImageType::Pointer +GraphToOtbImage<TGraph>::GetLabelImage(const GraphType& graph, + const unsigned int width, + const unsigned int height) + { + LabelImageType::IndexType labelImageRegionStart; + LabelImageType::SizeType labelImageRegionSize; + LabelImageType::RegionType labelImageRegion; - labelImageRegionStart[0] = 0; labelImageRegionStart[1] = 0; - labelImageRegionSize[0] = width; labelImageRegionSize[1] = height; - labelImageRegion.SetIndex(labelImageRegionStart); - labelImageRegion.SetSize(labelImageRegionSize); + labelImageRegionStart[0] = 0; labelImageRegionStart[1] = 0; + labelImageRegionSize[0] = width; labelImageRegionSize[1] = height; + labelImageRegion.SetIndex(labelImageRegionStart); + labelImageRegion.SetSize(labelImageRegionSize); - LabelImageType::Pointer label_img = LabelImageType::New(); - label_img->SetRegions(labelImageRegion); - label_img->Allocate(); + LabelImageType::Pointer label_img = LabelImageType::New(); + label_img->SetRegions(labelImageRegion); + label_img->Allocate(); - using LabelImageIterator = itk::ImageRegionIterator<LabelImageType>; - LabelImageIterator it(label_img, label_img->GetLargestPossibleRegion()); - for(it.GoToBegin();!it.IsAtEnd(); ++it) - it.Set(0); - - // Start at 1 (value 0 can be used for invalid pixels) - LabelImageType::InternalPixelType label = 1; - for(auto& region : graph.m_Nodes) - { - lp::CellLists borderPixels; - ContourOperator::GenerateBorderCells(borderPixels, region->m_Contour, region->m_Id, width); - - for (auto& pix: borderPixels) - { - labelImageRegionStart[0] = pix % width; - labelImageRegionStart[1] = pix / width; - label_img->SetPixel(labelImageRegionStart, label); - } - ++label; - } + using LabelImageIterator = itk::ImageRegionIterator<LabelImageType>; + LabelImageIterator it(label_img, label_img->GetLargestPossibleRegion()); + for(it.GoToBegin();!it.IsAtEnd(); ++it) + it.Set(0); - // Sort labels in their appearance order from left->right to top->bottom - const LabelImageType::InternalPixelType noDataLabel = 0; - vnl_vector<LabelImageType::InternalPixelType> lut(label,noDataLabel); - label=1; - for(it.GoToBegin();!it.IsAtEnd(); ++it) - { - unsigned int inputLabel = it.Get(); - if (lut[ inputLabel ] == noDataLabel) - { - lut[ inputLabel ] = label; - label++; - } - } - for(it.GoToBegin();!it.IsAtEnd(); ++it) - it.Set(lut[it.Get()]); + // Start at 1 (value 0 can be used for invalid pixels) + LabelImageType::InternalPixelType label = 1; + for(auto& region : graph.m_Nodes) + { + lp::CellLists borderPixels; + ContourOperator::GenerateBorderCells(borderPixels, region->m_Contour, region->m_Id, width); + + for (auto& pix: borderPixels) + { + labelImageRegionStart[0] = pix % width; + labelImageRegionStart[1] = pix / width; + label_img->SetPixel(labelImageRegionStart, label); + } + ++label; + } + + // Sort labels in their appearance order from left->right to top->bottom + const LabelImageType::InternalPixelType noDataLabel = 0; + vnl_vector<LabelImageType::InternalPixelType> lut(label,noDataLabel); + label=1; + for(it.GoToBegin();!it.IsAtEnd(); ++it) + { + unsigned int inputLabel = it.Get(); + if (lut[ inputLabel ] == noDataLabel) + { + lut[ inputLabel ] = label; + label++; + } + } + for(it.GoToBegin();!it.IsAtEnd(); ++it) + it.Set(lut[it.Get()]); + + // Fill holes + typedef itk::GrayscaleFillholeImageFilter<LabelImageType,LabelImageType> FillholeFilterType; + FillholeFilterType::Pointer fillFilter = FillholeFilterType::New(); + fillFilter->SetInput(label_img); + fillFilter->Update(); + + return fillFilter->GetOutput(); + } - // Fill holes - typedef itk::GrayscaleFillholeImageFilter<LabelImageType,LabelImageType> FillholeFilterType; - FillholeFilterType::Pointer fillFilter = FillholeFilterType::New(); - fillFilter->SetInput(label_img); - fillFilter->Update(); - - return fillFilter->GetOutput(); - } - } // end of namespace lsrm #endif diff --git a/include/lsgrmSplitter.txx b/include/lsgrmSplitter.txx index 65b35c9..79a4ec9 100644 --- a/include/lsgrmSplitter.txx +++ b/include/lsgrmSplitter.txx @@ -4,10 +4,10 @@ namespace lsgrm { enum RelativePosition{ -POS_TOP, -POS_RIGHT, -POS_BOTTOM, -POS_LEFT + POS_TOP, + POS_RIGHT, + POS_BOTTOM, + POS_LEFT }; enum NeighborhoodRelativePosition{ @@ -29,7 +29,7 @@ std::vector<ProcessingTile> SplitOTBImage(TInputImage * imagePtr, // input image unsigned int &nbTilesX, unsigned int &nbTilesY, std::string temporaryFilesPrefix) -{ + { std::vector<ProcessingTile> tiles; @@ -173,5 +173,5 @@ std::vector<ProcessingTile> SplitOTBImage(TInputImage * imagePtr, // input image } // for(unsigned int row = 0; row < nbTilesY; ++row) return tiles; -} + } } // end of namespace lsgrm diff --git a/include/lsgrmSpringSegmenter.txx b/include/lsgrmSpringSegmenter.txx index 91e47ef..720d06d 100644 --- a/include/lsgrmSpringSegmenter.txx +++ b/include/lsgrmSpringSegmenter.txx @@ -6,47 +6,47 @@ namespace lsgrm { - template<class TImage> - void - SpringSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) - { - std::size_t bands = node->m_Means.size(); - fwrite(&(bands), sizeof(bands), 1, nodeStream); - - for(unsigned int b = 0; b < node->m_Means.size(); b++) - { - fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - } - } - - template<class TImage> - void - SpringSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +template<class TImage> +void +SpringSegmenter<TImage>::WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands = node->m_Means.size(); + fwrite(&(bands), sizeof(bands), 1, nodeStream); + + for(unsigned int b = 0; b < node->m_Means.size(); b++) { - std::size_t bands; - fread(&(bands), sizeof(bands), 1, nodeStream); - node->m_Means.assign(bands, 0); - - for(unsigned int b = 0; b < bands; b++) - { - fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); - } + fwrite(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); } +} + +template<class TImage> +void +SpringSegmenter<TImage>::ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) +{ + std::size_t bands; + fread(&(bands), sizeof(bands), 1, nodeStream); + node->m_Means.assign(bands, 0); - template<class TImage> - long long unsigned int - SpringSegmenter<TImage>::GetNodeMemory(NodePointerType &node) + for(unsigned int b = 0; b < bands; b++) { + fread(&(node->m_Means[b]), sizeof(node->m_Means[b]), 1, nodeStream); + } +} + +template<class TImage> +long long unsigned int +SpringSegmenter<TImage>::GetNodeMemory(NodePointerType &node) +{ - unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); + unsigned int nBands = node->m_Means.size(); //this->m_InputImage->GetNumberOfComponentsPerPixel(); - long long unsigned int memory = 0; - memory += sizeof(NodePointerType); // size of the node pointer - memory += sizeof(NodeType); // size of the node (actually, size of the base node) - memory += 1 * nBands * sizeof(float); // size of the 1 attribute, multiplied by the nb. of bands - memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges - return memory; - } + long long unsigned int memory = 0; + memory += sizeof(NodePointerType); // size of the node pointer + memory += sizeof(NodeType); // size of the node (actually, size of the base node) + memory += 1 * nBands * sizeof(float); // size of the 1 attribute, multiplied by the nb. of bands + memory += node->m_Edges.size() * sizeof(EdgeType); // size of the edges + return memory; +} } // end of namespace lsrm #endif -- GitLab