KJB
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
line_segment_set.h
Go to the documentation of this file.
1 /* $Id $ */
2 
15 #ifndef EDGE_EDGE_SEGMENT_SET_H
16 #define EDGE_EDGE_SEGMENT_SET_H
17 
18 #include "edge_cpp/line_segment.h"
19 #include <vector>
20 
21 namespace kjb {
22 
28 class Line_segment_set: public Readable, public Writeable
29 {
30  public:
32 
33  Line_segment_set(const std::vector<Line_segment> & isegments )
34  : Readable(), Writeable(), _segments(isegments){}
35 
36  Line_segment_set(std::istream& in)
37  {
38  read(in);
39  }
40 
41  Line_segment_set(const char * file_name)
42  {
43  Readable::read(file_name);
44  }
45 
47  Readable(), Writeable(), _segments(src._segments) { }
48 
50  {
51  _segments = iseg._segments;
52  return (*this);
53  }
54 
56 
57  void read_from_Kovesi_format(const std::string path_to_file);
58 
59  void read_from_Kovesi_formatb(const std::string path_to_file);
60 
62  inline const std::vector<Line_segment> & get_segments() { return _segments; }
63 
65  inline unsigned int size() const { return _segments.size(); }
66 
68  inline void add_segment(const Line_segment & isegment)
69  {
70  _segments.push_back(isegment);
71  }
72 
74  inline const Line_segment & get_segment(unsigned int i) const { return _segments[i]; }
75 
77  void draw( kjb::Image & img, double ir, double ig, double ib, double width = 1.0) const;
78 
80  void randomly_color(kjb::Image & img, double width = 1.0) const;
81 
83  void read(std::istream& in);
84 
86  void write(std::ostream& out) const;
87 
89  void read(const char* fname)
90  {
91  Readable::read(fname);
92  }
93 
95  void write(const char* fname) const
96  {
97  Writeable::write(fname);
98  }
99 
100  kjb::Edge_set * convert_to_edge_set(unsigned int num_rows, unsigned int num_cols);
101 
102  void remove_frame_segments(unsigned int num_rows, unsigned int num_cols);
103 
104  private:
105  std::vector<Line_segment> _segments;
106 
107 };
108 
109 /*
110  * In order to use this function, you have to set two
111  * environment variables.
112  * First, PATH_TO_MATLAB, must point to the directory where matlab is installed.
113  * Second, you need to compile APPgetLargeConnectedEdges.m, which
114  * you can find in this directory, using Matlab with the command
115  * mcc -o APPgetLargeConnectedEdges -m APPgetLargeConnectedEdges.m.
116  * Last, setPATH_TO_GET_LONG_STRAIGHT_EDGES, must point to the directory
117  * containing script run_APPgetLargeConnectedEdges.sh generated
118  * by the MATLAB compiler
119  */
120 void detect_long_connected_segments(Line_segment_set & segments, const std::string & img_path, int max_length);
121 
122 
128 class Edge_segment_set: public Readable, public Writeable
129 {
130  public:
132 
133  Edge_segment_set(const std::vector<Edge_segment> & isegments )
134  : Readable(), Writeable(), _segments(isegments){}
135 
136  Edge_segment_set(const kjb::Edge_set * edge_set,const std::vector<Line_segment> & isegments );
137 
138  Edge_segment_set(const kjb::Edge_set * edge_set, bool use_num_pts_as_length = true );
139 
140  Edge_segment_set(const kjb::Edge_set * edge_set, const char * filename);
141 
142  Edge_segment_set(const kjb::Edge_set * edge_set, std::istream& in);
143 
145  Readable(), Writeable(), _segments(src._segments) { }
146 
148  {
149  _segments = iseg._segments;
150  return (*this);
151  }
152 
154 
155  inline void init_from_edge_set(const kjb::Edge_set * edge_set, bool use_num_pts_as_length = true);
156 
158  inline const std::vector<Edge_segment> & get_segments() { return _segments; }
159 
161  inline unsigned int size() const { return _segments.size(); }
162 
164  inline const Edge_segment & get_segment(unsigned int i) const { return _segments[i]; }
165 
167  inline void add_segment(const Edge_segment & isegment)
168  {
169  _segments.push_back(isegment);
170  }
171 
173  inline const kjb::Edge & get_edge(unsigned int i)
174  {
175  return _segments[i].get_edge();
176  }
177 
178 
180  void draw( kjb::Image & img, double ir, double ig, double ib, double width = 1.0) const;
181 
183  void randomly_color(kjb::Image & img, double width = 1.0) const;
184 
186  void read(std::istream& in, const kjb::Edge_set * edge_set );
187 
189  void read(const char *filename, const kjb::Edge_set * edge_set );
190 
192  void read(std::istream& in);
193 
195  void read(const char* fname)
196  {
197  Readable::read(fname);
198  }
199 
201  void write(std::ostream& out) const;
202 
204  void write(const char* fname) const
205  {
206  Writeable::write(fname);
207  }
208 
213  (
215  double collinear_threshold = 0.12,
216  double overlapping_threshold = 10
217  );
218 
219  void remove_non_straight_segments(kjb::Edge_set & edges, double threshold);
220 
221  void remove_frame_segments(unsigned int num_rows, unsigned int num_cols, kjb::Edge_set & edges);
222 
223  kjb::Edge_set * convert_to_edge_set(unsigned int num_rows, unsigned int num_cols);
224 
225  void find_vertical_segment_pairs(std::vector<Segment_pair> & pairs, int num_rows) const;
226 
227  private:
228 
232  void update_edge_set(kjb::Edge_set & edges);
233 
235  std::vector<Edge_segment> _segments;
236 
237 };
238 
239 }
240 
241 
242 #endif
void read(const char *fname)
Reads this Edge_segment_set from an input file.
Definition: line_segment_set.h:89
void remove_frame_segments(unsigned int num_rows, unsigned int num_cols, kjb::Edge_set &edges)
Definition: line_segment_set.cpp:476
const std::vector< Edge_segment > & get_segments()
Definition: line_segment_set.h:158
Definition: edge_segment.h:36
Abstract class to write this object to an output stream.
Definition: l_writeable.h:41
Edge_segment_set(const Edge_segment_set &src)
Definition: line_segment_set.h:144
void remove_frame_segments(unsigned int num_rows, unsigned int num_cols)
Definition: line_segment_set.cpp:520
void remove_overlapping_segments(kjb::Edge_set &edges, double collinear_threshold=0.12, double overlapping_threshold=10)
In case there are multiple roughly collinear edge segments, only the longest one is kept...
Definition: line_segment_set.cpp:431
Abstract class to read this object from an input stream.
Definition: l_readable.h:39
void write(const char *fname) const
Writes this Edge_segment_set to a file.
Definition: line_segment_set.h:95
kjb::Edge_set * convert_to_edge_set(unsigned int num_rows, unsigned int num_cols)
Definition: line_segment_set.cpp:650
void read(std::istream &in)
Reads this Edge_segment_set from an input stream.
Definition: line_segment_set.cpp:32
const std::vector< Line_segment > & get_segments()
Returns a vector containing the fitted line segments.
Definition: line_segment_set.h:62
const Edge_segment & get_segment(unsigned int i) const
returns the ith fitted line segment
Definition: line_segment_set.h:164
void draw(kjb::Image &img, double ir, double ig, double ib, double width=1.0) const
Draws this line segment set.
Definition: line_segment_set.cpp:158
const kjb::Edge & get_edge(unsigned int i)
returns the ith collection of edge points the segments were fitted to
Definition: line_segment_set.h:173
void init_from_edge_set(const kjb::Edge_set *edge_set, bool use_num_pts_as_length=true)
Definition: line_segment_set.cpp:242
void add_segment(const Edge_segment &isegment)
Adds a line segment to this collection.
Definition: line_segment_set.h:167
virtual void write(std::ostream &out) const =0
Writes this Writeable to an output stream.
Line_segment_set(std::istream &in)
Definition: line_segment_set.h:36
unsigned int size() const
Definition: line_segment_set.h:161
const Line_segment & get_segment(unsigned int i) const
returns the ith fitted line segment
Definition: line_segment_set.h:74
void read_from_Kovesi_formatb(const std::string path_to_file)
Definition: line_segment_set.cpp:110
Definition: edge.h:150
void detect_long_connected_segments(Line_segment_set &segments, const std::string &img_path, int max_length)
Definition: line_segment_set.cpp:675
Line_segment_set(const Line_segment_set &src)
Definition: line_segment_set.h:46
~Line_segment_set()
Definition: line_segment_set.h:55
unsigned int size() const
Returns the number of segments in this set.
Definition: line_segment_set.h:65
Line_segment_set()
Definition: line_segment_set.h:31
Class to manipulate a set of line segments.
Definition: line_segment_set.h:28
void read(std::istream &in, const kjb::Edge_set *edge_set)
Reads this Edge_segment_set from an input stream.
Definition: line_segment_set.cpp:259
Edge_segment_set & operator=(const Edge_segment_set &iseg)
Definition: line_segment_set.h:147
Line_segment_set(const std::vector< Line_segment > &isegments)
Definition: line_segment_set.h:33
Edge_segment_set()
Definition: line_segment_set.h:131
void draw(kjb::Image &img, double ir, double ig, double ib, double width=1.0) const
Draws this line segment set.
Definition: line_segment_set.cpp:358
Line_segment_set & operator=(const Line_segment_set &iseg)
Definition: line_segment_set.h:49
void randomly_color(kjb::Image &img, double width=1.0) const
Randomly colors this line segment set on an image.
Definition: line_segment_set.cpp:373
void write(std::ostream &out) const
Writes this Edge_segment_set to an output stream.
Definition: line_segment_set.cpp:61
void read(const char *fname)
Reads this Edge_segment_set from an input file.
Definition: line_segment_set.h:195
void randomly_color(kjb::Image &img, double width=1.0) const
Randomly colors this line segment set on an image.
Definition: line_segment_set.cpp:172
Edge_segment_set(const std::vector< Edge_segment > &isegments)
Definition: line_segment_set.h:133
void read_from_Kovesi_format(const std::string path_to_file)
Definition: line_segment_set.cpp:71
void add_segment(const Line_segment &isegment)
Adds a line segment to this collection.
Definition: line_segment_set.h:68
void find_vertical_segment_pairs(std::vector< Segment_pair > &pairs, int num_rows) const
Definition: line_segment_set.cpp:381
Definition: edge.h:233
virtual void read(std::istream &in)=0
Reads this Readable from an input stream.
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
edges
Definition: APPgetLargeConnectedEdges.m:85
void write(const char *fname) const
Writes this Edge_segment_set to a file.
Definition: line_segment_set.h:204
Class to manipulate a set of edge segments.
Definition: line_segment_set.h:128
Wrapped version of the C struct KJB_image.
Definition: i_image.h:76
kjb::Edge_set * convert_to_edge_set(unsigned int num_rows, unsigned int num_cols)
Definition: line_segment_set.cpp:625
~Edge_segment_set()
Definition: line_segment_set.h:153
void remove_non_straight_segments(kjb::Edge_set &edges, double threshold)
Definition: line_segment_set.cpp:563
Line_segment_set(const char *file_name)
Definition: line_segment_set.h:41
Class to manipulate a line segment The class is parametrized in terms the position of the centre...
Definition: gr_line_segment.h:62
void write(std::ostream &out) const
Writes this Edge_segment_set to an output stream.
Definition: line_segment_set.cpp:339