1 // This is brl/bseg/brip/brip_roi.h
2 #ifndef brip_roi_h_
3 #define brip_roi_h_
4 //-----------------------------------------------------------------------------
5 //:
6 // \file
7 // \author J.L. Mundy
8 // \brief A composite region of interest class for image processing operations
9 //
10 // Provides a set of rectangular regions for processing in a larger image.
11 //
12 // \verbatim
13 //  Modifications
14 //   Initial version October 6, 2003
15 //   Actual implementation July 12, 2004
16 //   10-sep-2004 Peter Vanroose Added copy ctor with explicit vbl_ref_count init
17 //   07-feb-2006 Ozge Can Ozcanli fixed bug on line 41 of .cxx  was --> if (dymax >= n_image_rows_) dymax = n_image_cols_-1;
18 //                                                              now --> if (dymax >= n_image_rows_) dymax = n_image_rows_-1;
19 // \endverbatim
20 //
21 //-----------------------------------------------------------------------------
22 #include <vector>
23 #include <iostream>
24 #include <iosfwd>
25 #include <vsol/vsol_box_2d_sptr.h>
26 #include <vbl/vbl_ref_count.h>
27 #ifdef _MSC_VER
28 #  include <vcl_msvc_warnings.h>
29 #endif
30 
31 class brip_roi : public vbl_ref_count
32 {
33  public:
34   //: should initialize with image bounds on construction
35   brip_roi(const unsigned n_image_cols = 0, const unsigned n_image_rows = 0);
brip_roi(brip_roi const & r)36   brip_roi(brip_roi const& r)
37     : vbl_ref_count(), n_image_cols_(r.n_image_cols_),
38       n_image_rows_(r.n_image_rows_), regions_(r.regions_) {}
39 
40   //: expand (or contract) each region of the roi by delta, creating a new roi
41   brip_roi(brip_roi const& roi, const float delta);
42 
43   ~brip_roi() override = default;
44   //: replace existing image bounds
45   void set_image_bounds(const int n_image_cols,
46                         const int n_image_rows);
47 
48   //: roi from origin and size
49   void add_region(const int x0, const int y0, const int xs, const int ys);
50   //: roi from center and radius
51   void add_region(const int xc, const int yc, const int radius);
52   //: roi from box
53   void add_region(vsol_box_2d_sptr const & box);
54 
55   //: useful for inserting a new region, doesn't affect existing image bounds
56   vsol_box_2d_sptr clip_to_image_bounds(const vsol_box_2d_sptr& box);
57   //: clips all existing regions, doesn't affect existing image bounds
58   void clip_to_image_bounds();
59   bool empty() const;
n_regions()60   unsigned int n_regions() const { return regions_.size(); }
61   int cmin(const unsigned i) const; //!< column minimum for region_i
62   int cmax(const unsigned i) const; //!< column maximum for region_i
63   int rmin(const unsigned i) const; //!< row minimum for region_i
64   int rmax(const unsigned i) const; //!< row maximum for region_i
65   unsigned csize(const unsigned i) const; //!< number of cols for region_i
66   unsigned rsize(const unsigned i) const; //!< number of rows for region_i
67 
68   //: image column and row coordinates from local roi coordinates for region i
69   unsigned ic(int local_col, unsigned i = 0) const;
70   unsigned ir(int local_row, unsigned i = 0) const;
71 
72   //: local roi column and row coordinates from global image coordinates for region i
73   unsigned lc(unsigned global_col, unsigned i = 0) const;
74   unsigned lr(unsigned global_row, unsigned i = 0) const;
75 
region(unsigned i)76   vsol_box_2d_sptr region(unsigned i) const { return regions_[i]; }
77   bool remove_region(unsigned i);
78 
79  protected:
80   unsigned n_image_cols_;
81   unsigned n_image_rows_;
82   std::vector<vsol_box_2d_sptr> regions_;
83 };
84 
85 std::ostream&  operator<<(std::ostream& s, brip_roi const& r);
86 
87 #include "brip_roi_sptr.h"
88 
89 #endif // brip_roi_h_
90