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