00001
00002
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
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;
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
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
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
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
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
00125 vsol_box_2d_sptr creg =
00126 this->clip_to_image_bounds(box);
00127 regions_.push_back(creg);
00128 }
00129
00130
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 }