20 #ifndef KJB_CPP_EDGE_BASE_H
21 #define KJB_CPP_EDGE_BASE_H
26 #include <edge/edge_base.h>
29 #ifdef KJB_HAVE_BST_SERIAL
30 #include <boost/serialization/list.hpp>
35 #include <boost/shared_ptr.hpp>
65 _c_edge_pt = pt._c_edge_pt;
70 inline unsigned int get_col()
const {
return _c_edge_pt->col;}
73 inline unsigned int get_row()
const {
return _c_edge_pt->row;}
76 inline double get_dcol()
const {
return _c_edge_pt->dcol;}
79 inline double get_drow()
const {
return _c_edge_pt->drow;}
90 inline void set_col(
unsigned int icol) { _c_edge_pt->col = icol;}
93 inline void set_row(
unsigned int irow) { _c_edge_pt->row = irow;}
96 inline void set_dcol(
double idcol) { _c_edge_pt->dcol = idcol;}
99 inline void set_drow(
double idrow) { _c_edge_pt->drow = idrow;}
105 inline void set_silhouette(
bool isilhouette) { _c_edge_pt->silhouette = (
unsigned int)isilhouette; }
123 ETX(kjb_c::color_edge_point(&out, out, _c_edge_pt, &pixel) );
133 void set_edge_pt(kjb_c::Edge_point * i_edge_pt)
135 _c_edge_pt = i_edge_pt;
139 kjb_c::Edge_point * _c_edge_pt;
158 "Null edge pointer passed to Edge class constructor");
173 _c_edge = edge._c_edge;
180 return _c_edge->num_points;
210 ETX(kjb_c::color_edge_points(&out, out, _c_edge->points, _c_edge->num_points, &pixel) );
219 ETX(kjb_c::randomly_color_edge_points(&out, out, _c_edge->points, _c_edge->num_points) );
226 kjb_c::Edge * _c_edge;
264 kjb_c::copy_edge_set(&m_edge_set, edge_in.m_edge_set);
273 const std::vector<kjb_c::Edge_point>& edge_pts,
279 using kjb_c::Malloc_size;
281 #ifdef TRACK_MEMORY_ALLOCATION
282 using kjb_c::debug_kjb_malloc;
284 using kjb_c::kjb_malloc;
286 kjb_c::Edge_set* edge_set =
static_cast<kjb_c::Edge_set*
>(kjb_malloc(
sizeof(kjb_c::Edge_set)));
287 edge_set->num_edges = 1;
288 edge_set->total_num_pts = edge_pts.size();
289 edge_set->edges =
static_cast<kjb_c::Edge*
>(kjb_malloc(
sizeof(kjb_c::Edge)));
290 edge_set->edges[0].num_points = edge_pts.size();
291 edge_set->edges[0].points =
static_cast<kjb_c::Edge_point*
>(kjb_malloc(
sizeof(kjb_c::Edge_point) * edge_pts.size()));
292 edge_set->num_rows = num_rows_in;
293 edge_set->num_cols = num_cols_in;
295 for(
size_t i = 0;
i < edge_pts.size();
i++)
297 edge_set->edges[0].points[
i] = edge_pts[
i];
300 m_edge_set = edge_set;
306 kjb_c::free_edge_set(m_edge_set);
317 kjb_c::Edge_point&
operator()(
size_t edge_num,
size_t point_num)
320 assert(edge_num < m_edge_set->
num_edges);
321 assert(point_num < m_edge_set->
edges[edge_num].num_points);
322 return m_edge_set->edges[edge_num].points[point_num];
326 const kjb_c::Edge_point&
operator()(
size_t edge_num,
size_t point_num)
const
329 assert(edge_num < m_edge_set->
num_edges);
330 assert(point_num < m_edge_set->
edges[edge_num].num_points);
331 return m_edge_set->edges[edge_num].points[point_num];
339 swap(m_edge_set, other.m_edge_set);
346 assert(i < m_edge_set->total_num_pts);
347 return m_edge_set->edges[0].points[
i];
354 assert(i < m_edge_set->total_num_pts);
355 return m_edge_set->edges[0].points[
i];
364 return m_edge_set->num_edges;
376 return Edge(&m_edge_set->edges[i]);
382 kjb_c::free_edge_set(m_edge_set);
383 m_edge_set = iedge_set;
387 size_t num_rows()
const {
return m_edge_set->num_rows; }
393 size_t num_cols()
const {
return m_edge_set->num_cols; }
402 return m_edge_set->edges[i_edge].num_points;
411 return m_edge_set->total_num_pts;
417 kjb_c::remove_short_edges(m_edge_set, min_length);
429 int rc = kjb_c::find_edge_index(m_edge_set, iedge.
_c_ptr(), &index);
430 if (rc != kjb_c::NO_ERROR)
443 if( kjb_c::remove_edge(m_edge_set, iindex) != kjb_c::NO_ERROR)
462 kjb_c::break_edges_at_corners(m_edge_set, thresh, num_avg);
471 kjb_c::Edge_set* c_result = NULL;
472 kjb_c::sample_edge_set(&c_result, m_edge_set, p);
473 swap(c_result, m_edge_set);
474 kjb_c::free_edge_set(c_result);
487 Edge(&m_edge_set->edges[edge_index]).
draw(img, r, g, b);
514 ETX(kjb_c::color_edge_set(&out, out, m_edge_set, & pixel));
524 kjb_c::KJB_image* out = NULL;
526 ETX(kjb_c::randomly_color_edge_set(&out, img.
c_ptr(), m_edge_set));
532 void save(
const char* fname)
const
535 ETX(kjb_c::write_edge_set(m_edge_set, fname));
541 ETX(kjb_c::read_edge_set(&m_edge_set, fname));
565 const kjb_c::Edge_set*
c_ptr()
const {
return m_edge_set; }
569 kjb_c::Edge_set* m_edge_set;
572 #ifdef KJB_HAVE_BST_SERIAL
573 friend class boost::serialization::access;
577 template <
class Archive>
578 void save(Archive& ar,
const unsigned int )
const
583 kjb_c::serialize_edge_set(m_edge_set, &buffer, &length);
584 std::string str_tmp(buffer);
587 kjb_c::kjb_free(buffer);
591 template <
class Archive>
592 void load(Archive& ar,
const unsigned int )
596 kjb_c::unserialize_edge_set(&m_edge_set, buffer.c_str());
598 BOOST_SERIALIZATION_SPLIT_MEMBER()
605 edges.
load(fname.c_str());
610 edges.
save(fname.c_str());
657 float begin_thresh = 0,
658 float end_thresh = 0,
660 bool use_fourier =
true) :
662 m_begin_thresh(begin_thresh),
663 m_end_thresh(end_thresh),
665 m_fourier(use_fourier)
680 swap(m_sigma, other.m_sigma);
681 swap(m_begin_thresh, other.m_begin_thresh);
682 swap(m_end_thresh, other.m_end_thresh);
683 swap(m_padding, other.m_padding);
684 swap(m_fourier, other.m_fourier);
701 bool noiseless_data =
false
704 kjb_c::Edge_set* edge_set = NULL;
705 ETX(kjb_c::detect_image_edge_set(
733 kjb_c::Edge_set* edge_set = NULL;
734 ETX(kjb_c::detect_image_edge_set(
754 float m_begin_thresh;
783 const Edge_set&
edges,
785 size_t remove_borders = 0
bool get_silhouette() const
Rate of change in brightness along the columns at the point.
Definition: edge.h:87
~Edge_set()
Definition: edge.h:304
void draw_edge(Image &img, float r, float g, float b, unsigned int edge_index) const
draws the edge with index edge_index onto the input image, using color (r,g,b). This function expects...
Definition: edge.h:481
const kjb_c::Edge * _c_ptr() const
returns a const pointer to the c Edge structure
Definition: edge.h:194
#define ETX(a)
Definition: l_exception.h:67
Edge_set_ptr edge_image_to_edge_points(const Image &i, bool oriented)
Definition: edge.cpp:107
void set_drow(double idrow)
returns the rate of change in brightness along the rows at the point.
Definition: edge.h:99
Edge & operator=(const Edge &edge)
Definition: edge.h:171
unsigned int get_num_points() const
returns the number of edge points in this edge
Definition: edge.h:178
void randomly_color_edge(Image &img, unsigned int edge_index) const
draws the edge with index edge_index onto the input image, using a random color
Definition: edge.h:492
const kjb_c::Edge_point & operator[](size_t i) const
Definition: edge.h:351
size_t num_cols() const
returns the number of columns in the image the edges were detected from
Definition: edge.h:393
void draw(Image &img, float r, float g, float b) const
draws all the edges onto the input image, using color (r,g,b). This function expects color values bet...
Definition: edge.h:505
Edge_set(const std::string &fname)
Constructs an Edge_set by reading it from an input file.
Definition: edge.h:255
size_t get_num_rows() const
alias of num_rows() to comply with other KJB dimensioned objects.
Definition: edge.h:390
size_t size() const
Definition: edge.h:368
Canny_edge_detector(float sigma=1, float begin_thresh=0, float end_thresh=0, size_t padding=0, bool use_fourier=true)
Definition: edge.h:655
void swap(Canny_edge_detector &other)
Definition: edge.h:677
kjb_c::Edge_point & operator()(size_t edge_num, size_t point_num)
Definition: edge.h:317
Edge_set()
Definition: edge.h:236
r
Definition: APPgetLargeConnectedEdges.m:127
Canny_edge_detector & operator=(const Canny_edge_detector &other)
Definition: edge.h:668
const kjb_c::Edge_set * c_ptr() const
Returns a const pointer to the underlying c structure.
Definition: edge.h:565
void save(const char *fname) const
saves this edge set on a file
Definition: edge.h:532
size_t edge_length(size_t i_edge) const
Definition: edge.h:399
kjb_c::Edge_point & operator[](size_t i)
Definition: edge.h:343
size_t length(const C &cner)
Counts the total number of elements in a 2D STL-style container.
Definition: l_util.h:17
~Edge_point()
Definition: edge.h:56
const kjb_c::Edge_point * _c_ptr()
Rate of change in brightness along the columns at the point.
Definition: edge.h:110
const Impl_type * c_ptr() const
Access a pointer to the underlying implementation.
Definition: i_image.cpp:419
void set_row(unsigned int irow)
returns the row the point lies in
Definition: edge.h:93
Image edges_to_image(const Edge_set &edges, bool invert, size_t remove_borders)
Definition: edge.cpp:72
Edge_set(kjb_c::Edge_set *in)
Constructs an Edge_set by reading it from an input stream.
Definition: edge.h:241
void remove_short_edges(uint32_t min_length)
Removes from the edge set all the edges whose length is shorter than min_length.
Definition: edge.h:415
void set_dcol(double idcol)
returns the rate of change in brightness along the columns at the point.
Definition: edge.h:96
void draw(Image &img, float r, float g, float b) const
draws the edge onto the input image, using color (r,g,b). This funcstion expects color values between...
Definition: edge.h:203
unsigned int get_col() const
returns the column the point lies in
Definition: edge.h:70
Edge_set_ptr operator()(const Image &img, bool noiseless_data=false) const
Definition: edge.h:699
void read(const char *fname)
reads this edge set from a file
Definition: edge.h:553
void set_edge_set(kjb_c::Edge_set *iedge_set)
clear the previous edge set and makes this class point to the input c edge set
Definition: edge.h:380
size_t get_total_edge_points() const
Definition: edge.h:406
Impl_type * non_const_c_ptr() const
Access a pointer to the underlying implementation, use with care.
Definition: i_image.h:452
double get_drow() const
returns the rate of change in brightness along the rows at the point.
Definition: edge.h:79
Edge_point & operator=(const Edge_point &pt)
Definition: edge.h:63
Implements the Canny edge detection algorithm.
Definition: edge.h:628
double get_dcol() const
returns the rate of change in brightness along the columns at the point.
Definition: edge.h:76
kjb::Edge_set * detect_edges(const Image &img, bool noiseless_data=false)
Detect edges in img.
Definition: edge.h:730
void break_edges_at_corners(float thresh, uint32_t num_avg)
For each edge, it finds the edge point with the largest gradient difference on either side...
Definition: edge.h:460
~Edge()
Definition: edge.h:164
boost::shared_ptr< Edge_set > Edge_set_ptr
Definition: edge.h:613
Edge_set(const char *fname)
Constructs an Edge_set by reading it from an input file.
Definition: edge.h:248
void set_gradient_magnitude(double imag)
returns the magnitude of the gradient
Definition: edge.h:102
void load(Edge_set &edges, const std::string &fname)
Definition: edge.h:603
Edge(const Edge &edge)
Definition: edge.h:166
void load(const char *fname)
loads this edge set from a file
Definition: edge.h:539
Edge(kjb_c::Edge *edge)
Definition: edge.h:153
size_t get_num_cols() const
alias of num_cols() to comply with other KJB dimensioned objects.
Definition: edge.h:396
Edge_set(const std::vector< kjb_c::Edge_point > &edge_pts, int num_rows_in, int num_cols_in)
Definition: edge.h:272
Edge get_edge(unsigned int i) const
returns the ith edge
Definition: edge.h:374
#define KJB_THROW_2(ex, msg)
Definition: l_exception.h:48
size_t num_edges() const
Definition: edge.h:359
Edge_point(const Edge_point &pt)
Definition: edge.h:58
void swap(kjb::Gsl_Multimin_fdf &m1, kjb::Gsl_Multimin_fdf &m2)
Swap two wrapped multimin objects.
Definition: gsl_multimin.h:693
Edge_set & operator=(const Edge_set &other)
Definition: edge.h:309
const kjb_c::Edge_point & operator()(size_t edge_num, size_t point_num) const
Definition: edge.h:326
Edge_point get_edge_point(unsigned int i) const
returns the ith edge point of this edge
Definition: edge.h:184
void save(const Edge_set &edges, const std::string &fname)
Definition: edge.h:608
double get_gradient_magnitude() const
returns the magnitude of the gradient
Definition: edge.h:82
void swap(Edge_set &other)
Swaps the content of this edgeset with the edgeset provided in input.
Definition: edge.h:336
void write(const char *fname) const
writes this edge set to a file
Definition: edge.h:546
Object thrown when an argument to a function is not acceptable.
Definition: l_exception.h:377
void set_silhouette(bool isilhouette)
sets the silhouette field of this edge point
Definition: edge.h:105
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
unsigned int find_index(const kjb::Edge &iedge) const
Finds the index where the Edge pointed by iedge is stored in the edge_set. Notice that this is based ...
Definition: edge.h:426
void swap(Image &other)
Swap the implementation of two images.
Definition: i_image.h:220
Edge_point(kjb_c::Edge_point *pt)
Definition: edge.h:51
edges
Definition: APPgetLargeConnectedEdges.m:85
void randomly_color(Image &img) const
draws the edge onto the input image, using a random color
Definition: edge.h:216
Code for a wrapper class around the C struct KJB_Image.
void randomly_color(Image &img)
draws all the edges onto the input image, using color (r,g,b). Each edge is drawn using a different r...
Definition: edge.h:522
void sample_edge_set(float p)
Randomly samples a subset of edge points from this set.
Definition: edge.h:467
Wrapped version of the C struct KJB_image.
Definition: i_image.h:76
bool is_edge_set_consistenct()
For debug purposes, checks that all the c++ wrappers are consistent with the underlying c structures...
Definition: edge.cpp:28
void draw(Image &img, float r, float g, float b) const
draws this edge point onto an image
Definition: edge.h:116
size_t num_rows() const
returns the number of rows in the image the edges were detected from
Definition: edge.h:387
Edge_set(const Edge_set &edge_in)
Definition: edge.h:261
void remove_edge(unsigned int iindex)
Removes the edge at index edge_id.
Definition: edge.h:441
unsigned int get_row() const
returns the row the point lies in
Definition: edge.h:73
void set_col(unsigned int icol)
sets the column the point lies in
Definition: edge.h:90