Main Page | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

brip_roi.cxx

Go to the documentation of this file.
00001 //:
00002 // \file
00003 #include <vsol/vsol_box_2d.h>
00004 #include <brip/brip_roi.h>
00005 
00006 brip_roi::brip_roi(const unsigned n_image_cols, const unsigned n_image_rows)
00007 {
00008   n_image_cols_ = n_image_cols;
00009   n_image_rows_ = n_image_rows;
00010 }
00011 
00012 void brip_roi::set_image_bounds(const int n_image_cols,
00013                                 const int n_image_rows)
00014 {
00015   n_image_cols_ = n_image_cols;
00016   n_image_rows_ = n_image_rows;
00017 }
00018 
00019 //:expand (or contract) each region of the roi by delta, creating a new roi.
00020 brip_roi::brip_roi(brip_roi const& roi, float delta)
00021   : vbl_ref_count(), n_image_cols_(roi.n_image_cols_),
00022     n_image_rows_(roi.n_image_rows_), regions_(roi.regions_)
00023 {
00024   float tdelta = delta;
00025   if (tdelta < 0) tdelta *= -1.0f; // to guarantee dxmin <= dxmax.
00026   for (vcl_vector<vsol_box_2d_sptr>::iterator rit = regions_.begin();
00027        rit != regions_.end(); rit++)
00028   {
00029     double xmin = (*rit)->get_min_x();
00030     double ymin = (*rit)->get_min_y();
00031     double xmax = (*rit)->get_max_x();
00032     double ymax = (*rit)->get_max_y();
00033 
00034     double dxmin = (xmin-tdelta), dymin = (ymin-tdelta), 
00035       dxmax = (xmax+tdelta),  dymax = (ymax+tdelta); 
00036 
00037     //Check image bounds and crop appropriately
00038     if (dxmin < 0) dxmin = 0;
00039     if (dymin < 0) dymin = 0;
00040     if (dxmax >= n_image_cols_) dxmax = n_image_cols_-1;
00041     if (dymax >= n_image_rows_) dymax = n_image_rows_-1;
00042     
00043     vsol_box_2d_sptr dbox = new vsol_box_2d();
00044     dbox->add_point(dxmin, dymin);
00045     dbox->add_point(dxmax, dymax);
00046     (*rit)=dbox;
00047   }
00048 }
00049 
00050 vsol_box_2d_sptr brip_roi::clip_to_image_bounds(vsol_box_2d_sptr box)
00051 {
00052   if (!box||!n_image_cols_||!n_image_rows_)
00053     return box;
00054   int x0 = (int)box->get_min_x();
00055   int y0 = (int)box->get_min_y();
00056   int xm = (int)box->get_max_x();
00057   int ym = (int)box->get_max_y();
00058   //clip to image bounds
00059   if (x0 < 0)
00060     x0 = 0;
00061   if ((unsigned int)x0 >= n_image_cols_)
00062     x0 = n_image_cols_-1;
00063   if (y0 < 0)
00064     y0 = 0;
00065   if ((unsigned int)y0 >= n_image_rows_)
00066     y0 = n_image_rows_-1;
00067   if (xm < 0)
00068     xm = 0;
00069   if ((unsigned int)xm >= n_image_cols_)
00070     xm = n_image_cols_-1;
00071   if (ym < 0)
00072     ym = 0;
00073   if ((unsigned int)ym >= n_image_rows_)
00074     ym = n_image_rows_-1;
00075   vsol_box_2d_sptr cbox = new vsol_box_2d();
00076   cbox->add_point(x0, y0);
00077   cbox->add_point(xm, ym);
00078   return cbox;
00079 }
00080 
00081 void brip_roi::add_region(const int x0, const int y0, const int xs, const int ys)
00082 {
00083   vsol_box_2d_sptr reg =  new vsol_box_2d();
00084   reg->add_point(x0, y0);
00085   reg->add_point(x0+xs-1, y0);
00086   reg->add_point(x0+xs-1, y0+ys-1);
00087   reg->add_point(x0, y0+ys-1);
00088   if (!n_image_cols_||!n_image_rows_)
00089   {
00090     regions_.push_back(reg);
00091     return;
00092   }
00093   //need to potentially clip the region
00094   vsol_box_2d_sptr creg =
00095     this->clip_to_image_bounds(reg);
00096   regions_.push_back(creg);
00097 }
00098 
00099 void brip_roi::add_region(const int xc, const int yc, const int radius)
00100 {
00101   vsol_box_2d_sptr reg =  new vsol_box_2d();
00102   reg->add_point(xc-radius, yc-radius);
00103   reg->add_point(xc+radius, yc-radius);
00104   reg->add_point(xc+radius, yc+radius);
00105   reg->add_point(xc-radius, yc+radius);
00106   if (!n_image_cols_||!n_image_rows_)
00107   {
00108     regions_.push_back(reg);
00109     return;
00110   }
00111   //need to potentially clip the region
00112   vsol_box_2d_sptr creg =
00113     this->clip_to_image_bounds(reg);
00114   regions_.push_back(creg);
00115 }
00116 
00117 void brip_roi::add_region(vsol_box_2d_sptr const & box)
00118 {
00119   if (!n_image_cols_||!n_image_rows_)
00120   {
00121     regions_.push_back(box);
00122     return;
00123   }
00124   //need to potentially clip the region
00125   vsol_box_2d_sptr creg =
00126     this->clip_to_image_bounds(box);
00127   regions_.push_back(creg);
00128 }
00129 
00130 //return true if there are no regions or if they are all empty
00131 bool brip_roi::empty() const
00132 {
00133   return n_regions() == 0;
00134 #if 0//later
00135   for (vcl_vector<vgl_box_2d<int> >::iterator rit = regions_.begin();
00136        rit != regions_.end(); rit++)
00137     if (!(*rit).is_empty())
00138       return false;
00139 #endif
00140 }
00141 
00142 void brip_roi::clip_to_image_bounds()
00143 {
00144   vcl_vector<vsol_box_2d_sptr> temp;
00145   for (vcl_vector<vsol_box_2d_sptr>::iterator rit = regions_.begin();
00146        rit != regions_.end(); rit++)
00147     temp.push_back(this->clip_to_image_bounds(*rit));
00148   regions_ = temp;
00149 }
00150 
00151 int brip_roi::cmin(const unsigned i) const
00152 {
00153   return i >= regions_.size() ? 0 : (int)regions_[i]->get_min_x();
00154 }
00155 
00156 int brip_roi::cmax(const unsigned i) const
00157 {
00158   return i >= regions_.size() ? 0 : (int)regions_[i]->get_max_x();
00159 }
00160 
00161 int brip_roi::rmin(const unsigned i) const
00162 {
00163   return i >= regions_.size() ? 0 : (int)regions_[i]->get_min_y();
00164 }
00165 
00166 int brip_roi::rmax(const unsigned i) const
00167 {
00168   return i >= regions_.size() ? 0 : (int)regions_[i]->get_max_y();
00169 }
00170 
00171 unsigned brip_roi::csize(const unsigned i) const
00172 {
00173   int temp = cmax(i)-cmin(i) + 1;
00174   return temp<0 ? 0 : (unsigned)temp;
00175 }
00176 
00177 unsigned brip_roi::rsize(const unsigned i) const
00178 {
00179   int temp = rmax(i)-rmin(i) + 1;
00180   return temp<0 ? 0 : (unsigned)temp;
00181 }
00182 
00183 unsigned brip_roi::ic(int local_col, unsigned i) const
00184 {
00185   int temp = cmin(i) + local_col;
00186   return temp<0 ? 0 : (unsigned)temp;
00187 }
00188 
00189 unsigned brip_roi::ir(int local_row, unsigned i) const
00190 {
00191   int temp = rmin(i) + local_row;
00192   return temp<0 ? 0 : (unsigned)temp;
00193 }
00194 
00195 unsigned brip_roi::lc(unsigned global_col, unsigned i) const
00196 {
00197   int temp = global_col - cmin(i);
00198   return temp<0 ? 0 : (unsigned)temp;
00199 }
00200 
00201 unsigned brip_roi::lr(unsigned global_row, unsigned i) const
00202 {
00203  int temp = global_row - rmin(i);
00204   return temp<0 ? 0 : (unsigned)temp;
00205 }
00206 
00207 bool brip_roi::remove_region(unsigned i)
00208 {
00209   vcl_cerr << "brip_roi::remove_region(" << i << ") NYI\n";
00210   return false;
00211 }
00212 
00213 vcl_ostream&  operator<<(vcl_ostream& s, brip_roi const& r)
00214 {
00215   s << "brip_roi (regions) \n";
00216   for(unsigned i = 0; i< r.n_regions(); ++i)
00217     s << *(r.region(i)) <<'\n';
00218   return s;
00219 }

Generated on Thu Jan 10 14:52:30 2008 for contrib/brl/bseg/brip by  doxygen 1.4.4