An error occurred while loading the file. Please try again.
-
Gaetano Raffaele authored3c558d44
#ifndef __LSGRM_SEGMENTER_H
#define __LSGRM_SEGMENTER_H
// Check windows
#if _WIN32 || _WIN64
#if _WIN64
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
// Check GCC
#if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
#include "macro-generator.h"
#include "grmSegmenter.h"
namespace lsgrm
{
template<class TSegmenterType>
class Segmenter : public TSegmenterType
{
public:
/* Some convenient typedefs */
typedef typename TSegmenterType::ImageType ImageType;
typedef typename TSegmenterType::NodeType NodeType;
typedef typename TSegmenterType::ParamType ParamType;
typedef grm::Graph<NodeType> GraphType;
typedef typename GraphType::EdgeType EdgeType;
typedef typename GraphType::EdgeListType EdgeListType;
typedef typename grm::GraphOperations<TSegmenterType> GraphOperatorType;
typedef typename GraphOperatorType::NodePointerType NodePointerType;
typedef grm::GraphToOtbImage<GraphType> IOType;
typedef typename IOType::LabelImageType LabelImageType;
~Segmenter(){};
/*
* Given 1 smart node pointer (boost::shared_ptr), this
* method writes the node specific attributes into the node stream.
*
* @params
* NodePointerType n : Smart pointer of node
*
*/
virtual void WriteSpecificAttributes(NodePointerType node, FILE * nodeStream) = 0;
/*
* Given 1 smart node pointer (boost::shared_ptr), this
* method read the node specific attributes from the node stream.
*
* @params
* NodePointerType n : Smart pointer of node
* FILE * nodeStream : Node stream
*
*/
virtual void ReadSpecificAttributes(NodePointerType node, FILE * nodeStream) = 0;
/*
* Given 1 smart node pointer (boost::shared_ptr), this
* method writes the node into a stream.
*
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
* @params
* NodePointerType n : Smart pointer of node
* FILE * nodeStream : Node stream
*
*/
void WriteNode(NodePointerType node, FILE * nodeStream)
{
fwrite(&(node->m_Id), sizeof(node->m_Id), 1, nodeStream);
fwrite(&(node->m_Perimeter), sizeof(node->m_Perimeter), 1, nodeStream);
fwrite(&(node->m_Area), sizeof(node->m_Area), 1, nodeStream);
fwrite(&(node->m_Bbox.m_UX), sizeof(node->m_Bbox.m_UX), 1, nodeStream);
fwrite(&(node->m_Bbox.m_UY), sizeof(node->m_Bbox.m_UY), 1, nodeStream);
fwrite(&(node->m_Bbox.m_W), sizeof(node->m_Bbox.m_W), 1, nodeStream);
fwrite(&(node->m_Bbox.m_H), sizeof(node->m_Bbox.m_H), 1, nodeStream);
this->WriteSpecificAttributes(node, nodeStream);
std::size_t contourSize = node->m_Contour.size();
fwrite(&(contourSize), sizeof(contourSize), 1, nodeStream);
std::vector<short> moves;
moves.reserve(contourSize);
for(unsigned int b = 0; b < contourSize; b++)
{
moves[b] = node->m_Contour[b];
}
fwrite(&moves.front(), sizeof(short), contourSize, nodeStream);
}
/*
* This method reads a graph from a stream.
*
* @params
* FILE * nodeStream : Node stream
*
*/
void ReadGraph(FILE * nodeStream, FILE * edgeStream)
{
std::unordered_map<std::size_t, NodePointerType> nodeMap;
// Read the size of the graph
{
std::size_t graphSize;
fread(&graphSize, sizeof(graphSize), 1, nodeStream);
this->m_Graph.m_Nodes.reserve(graphSize);
// Creation of the nodes
for(std::size_t i = 0; i < graphSize; i++)
{
NodePointerType node(new NodeType());
node->m_Valid = true;
node->m_Expired = false;
node->m_IsMerged = true; // force to compute costs for the first iteration
fread(&(node->m_Id), sizeof(node->m_Id), 1, nodeStream);
fread(&(node->m_Perimeter), sizeof(node->m_Perimeter), 1, nodeStream);
fread(&(node->m_Area), sizeof(node->m_Area), 1, nodeStream);
fread(&(node->m_Bbox.m_UX), sizeof(node->m_Bbox.m_UX), 1, nodeStream);
fread(&(node->m_Bbox.m_UY), sizeof(node->m_Bbox.m_UY), 1, nodeStream);
fread(&(node->m_Bbox.m_W), sizeof(node->m_Bbox.m_W), 1, nodeStream);
fread(&(node->m_Bbox.m_H), sizeof(node->m_Bbox.m_H), 1, nodeStream);
this->ReadSpecificAttributes(node, nodeStream);
{
std::size_t contourSize;
fread(&(contourSize), sizeof(contourSize), 1, nodeStream);
std::vector<short> moves;
moves.reserve(contourSize);
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
fread(&moves.front(), sizeof(short), contourSize, nodeStream);
for(unsigned int b = 0; b < contourSize; b++)
{
node->m_Contour.push_back(moves[b]);
}
}
nodeMap[node->m_Id] = node;
this->m_Graph.m_Nodes.push_back(node);
}
}
for(auto& node: this->m_Graph.m_Nodes)
{
std::size_t nodeId;
fread(&(nodeId), sizeof(nodeId), 1, edgeStream);
assert(nodeId == node->m_Id);
std::size_t edgeSize;
fread(&(edgeSize), sizeof(edgeSize), 1, edgeStream);
node->m_Edges.reserve(edgeSize);
for(unsigned int b = 0; b < edgeSize; b++)
{
std::size_t targetId;
unsigned int boundary;
fread(&(targetId), sizeof(targetId), 1, edgeStream);
fread(&(boundary), sizeof(boundary), 1, edgeStream);
node->m_Edges.push_back(EdgeType(nodeMap[targetId], 0, boundary));
}
}
}
/*
* This method writes the edge into a stream.
*
* @params
* EdgePointerType edg : Smart pointer of edge
*
*/
void WriteEdge(typename NodeType::CRPTNeighborType edg, FILE * edgeStream)
{
fwrite(&(edg.GetRegion()->m_Id), sizeof(edg.GetRegion()->m_Id), 1, edgeStream);
fwrite(&(edg.m_Boundary), sizeof(edg.m_Boundary), 1, edgeStream);
}
/*
* Returns the memory (in bytes) occupied by the specific attributes of the node
*/
virtual long long unsigned int GetSpecificAttributesMemory(NodePointerType &node) = 0;
/*
* Returns the memory (in bytes) occupied by the entire graph
*/
long long unsigned int GetGraphMemory()
{
long long unsigned int memory = 0;
// sizeof(graph)... even if not significant
memory += sizeof(GraphType);
for(auto& node : this->m_Graph.m_Nodes)
{
// size of the contour (boost::dynamic_bitset)
memory += sizeof(lp::Contour);
#ifdef ENVIRONMENT64
memory += 8 * ((node->m_Contour.size() + 63) / 64);
#endif
#ifdef ENVIRONMENT32
memory += 8 * ((node->m_Contour.size() + 31) / 32);
#endif
211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
// size of specific attributes
memory += this->GetSpecificAttributesMemory(node);
// size of the node pointer
memory += sizeof(NodePointerType);
// size of the node (actually, size of the base node)
memory += sizeof(NodeType);
// size of the edges
memory += node->m_Edges.capacity() * sizeof(EdgeType);
memory += sizeof(EdgeListType);
}
return memory;
}
/* Return the label image */
inline typename LabelImageType::Pointer GetLabeledClusteredOutput()
{
IOType io;
auto labelImg = io.GetLabelImage(this->m_Graph, this->m_ImageWidth, this->m_ImageHeight);
return labelImg;
}
};
} // end of namespace lsgrm
#endif