Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
FitCircleFrame.cpp
1 #include "FitCircleFrame.hh"
2 
3 using namespace std;
4 using namespace BIAS;
5 
6 
7 FitCircleFrame::
8 FitCircleFrame(const wxString& title,
9  const wxPoint& pos,
10  const wxSize& size,
11  const Image<unsigned char> &img)
12  : wxDialog((wxFrame *)NULL, -1, title, pos, size,
13  wxRESIZE_BORDER |wxCAPTION | wxSYSTEM_MENU){
14  xp = NULL;
15  yp = NULL;
16  rp = NULL;
19 
20  wxMenu *menuFile = new wxMenu;
21  menuFile->Append( id_quit, wxT("E&xit") );
22  wxMenuBar *menuBar = new wxMenuBar;
23  menuBar->Append(menuFile, wxT("&File"));
24  // SetMenuBar(menuBar);
25  // CreateStatusBar(3);
26 
27  //convert to RGB and to Orig
29  //Save in WorkImg_ for rescaling and in UpdateImage
30  //convert WorkImg_ to DrawImg_ for each change
32 
33  IC_ = new ImageCanvas(this,NULL, 0,-1,wxDefaultPosition,
34  wxSize(img.GetWidth(),img.GetHeight()));
35  inkr = 1.0;
36  Threshold_ = 0;
37  thecolor[0] = 255; thecolor[1] = 0; thecolor[2] = 0;
38 
39  wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
40  vbox->Add(IC_,1, wxGROW |wxALL , 5);
41 
42  // use scrollbars if image is huge
43  wxScreenDC screenDC;
44  int screenWidth, screenHeight;
45  screenDC.GetSize(&screenWidth, &screenHeight);
46  if ((int)img.GetWidth() > screenWidth - 100 ||
47  (int)img.GetHeight() > screenHeight - 100)
48  {
49  vbox->SetItemMinSize(IC_, 800, 600);
50  }
51 
52  wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
53  wxButton *button;
54  button = new wxButton(this,id_left,wxT("Left"));
55  hbox->Add(button);
56  button = new wxButton(this,id_up,wxT("Up"));
57  hbox->Add(button);
58  button = new wxButton(this,id_down,wxT("Down"));
59  hbox->Add(button);
60  button = new wxButton(this,id_right,wxT("Right"));
61  hbox->Add(button);
62 
63  hbox->Add(10, 5, 0,
64  wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
65  wxStaticText* itemStaticText =
66  new wxStaticText( this, wxID_STATIC, _("Max Camera Angle [degree]"),
67  wxDefaultPosition, wxDefaultSize, 0 );
68  spinCtrlAngle = new wxSpinCtrl( this, id_maxangle,wxT("40"), wxDefaultPosition,wxSize(50,30),
69  wxSP_ARROW_KEYS,40,360,180,wxT("Angle"));
70 
71  hbox->Add(spinCtrlAngle);
72  hbox->Add(itemStaticText);
73 
74  spinCtrlRescale = new wxSpinCtrl(this,id_rescale,
75  wxT("100"), wxDefaultPosition,wxSize(50,30),
76  wxSP_ARROW_KEYS,10,600,100,wxT("Zoom"));
77  spinCtrlRescale->SetToolTip(wxT("Rescale image for visibility."));
78 
79  wxStaticText *wxText = new wxStaticText(this,wxID_STATIC,wxT(" Zoom (%)"));
80  //add space
81  hbox->Add(10, 5, 0,
82  wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
83  hbox->Add(spinCtrlRescale);
84  hbox->Add(wxText);
85  //add to vertical box
86  vbox->Add(hbox);
87 
88 
89  ////////////////////////////////////////
90  // second row /////////////////////////
91 
92  hbox = new wxBoxSizer(wxHORIZONTAL);
93  button = new wxButton(this,id_shrink,wxT("shrink"));
94  hbox->Add(button);
95  button = new wxButton(this,id_expand,wxT("Expand"));
96  hbox->Add(button);
97  button = new wxButton(this,id_dump,wxT("Dump"));
98  hbox->Add(button);
99  hbox->Add(95, 5, 0,
100  wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
101 
102  wxSpinCtrl *threshold = new wxSpinCtrl(this,id_threshold);
103  threshold->SetRange(0,255);
104  threshold->SetValue(0);
105  hbox->Add(threshold);
106 
107  wxStaticText* itemStaticText2 =
108  new wxStaticText( this, wxID_STATIC, _("Image Threshold"),
109  wxDefaultPosition, wxDefaultSize, 0 );
110  hbox->Add(itemStaticText2);
111 
112  vbox->Add(hbox);
113  //////////////////////////////
114  wxSize sliderS(200,35);
115  //intermediate row for labels
116  hbox = new wxBoxSizer(wxHORIZONTAL);
117  wxStaticText* itemStaticText3 =
118  new wxStaticText( this, wxID_STATIC, _("Circle Size"),
119  wxDefaultPosition,sliderS , 0 );
120  hbox->Add(itemStaticText3);
121  wxStaticText* itemStaticText4 =
122  new wxStaticText( this, wxID_STATIC, _("Circle x Position"),
123  wxDefaultPosition, sliderS, 0 );
124  hbox->Add(itemStaticText4);
125  wxStaticText* itemStaticText5 =
126  new wxStaticText( this, wxID_STATIC, _("Circle y Position"),
127  wxDefaultPosition, sliderS, 0 );
128 
129  hbox->Add(itemStaticText5);
130  vbox->Add(hbox);
131  ////////////////////////////////////////////
132  //third row
133  //add slider for expand and shrink
134  hbox = new wxBoxSizer(wxHORIZONTAL);
135 
136  sizeSlider =
137  new wxSlider(this,id_sizeslider,100,0,5000,
138  wxDefaultPosition,sliderS,
139  wxSL_HORIZONTAL | wxSL_LABELS| wxSL_BOTTOM);
140  hbox->Add(sizeSlider);
141  //////////////////
142  xSlider =
143  new wxSlider(this,id_xslider,800,0,10000,
144  wxDefaultPosition,sliderS,
145  wxSL_HORIZONTAL | wxSL_LABELS| wxSL_BOTTOM);
146 
147  hbox->Add(xSlider);
148 
149  ////////////////////
150  ySlider =
151  new wxSlider(this,id_yslider,600,0,8000,
152  wxDefaultPosition,sliderS,
153  wxSL_HORIZONTAL | wxSL_LABELS| wxSL_BOTTOM);
154 
155  hbox->Add(ySlider);
156  // ok button
157  hbox->Add(100, 50, 0,
158  wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL, 5);
159  button = new wxButton(this,id_quit,wxT("OK"));
160  hbox->Add(button,wxALIGN_RIGHT,10);
161 
162  vbox->Add(hbox);
163  ////////////////////////////////////////////
164  vbox->SetSizeHints(this);
165  SetMinSize(wxSize(800,600));
166  SetSizer(vbox);
167  SetAutoLayout(true);
168  Fit();
169  Show(TRUE);
170 }
171 
172 
173 void FitCircleFrame::
174 ListenToChange(float *x,float *y,float *r,float *maxangle){
175  xp = x;
176  yp = y;
177  rp = r;
179 }
180 
181 
182 void FitCircleFrame::
183 SetXYRA(float newx,float newy,float newr, float angle)
184 {
185  x = newx;
186  y = newy;
187  r = newr;
188  sizeSlider->SetValue((int)rint(r));
189  xSlider->SetValue((int)rint(x));
190  ySlider->SetValue((int)rint(y));
191  maxangle = angle;
192  spinCtrlAngle->SetValue((int)rint(maxangle));
193  UpdateImage();
194 }
195 
196 void FitCircleFrame::
197 OnQuit(wxCommandEvent& WXUNUSED(event))
198 {
199  Close(TRUE);
200  Destroy();
201 }
202 
203 void FitCircleFrame::
204 OnDump(wxCommandEvent& )
205 {
206  unsigned int cutwidth,cutheight;
207  if (DrawImg_.GetWidth() >640)
208  cutwidth = cutheight = 640;
209  else
210  cutwidth = cutheight = 384;
211 
212  cout <<"CutOut of Size: "<<cutwidth<<" x "<<cutheight<<endl;
213  cout <<" at: "<<x-(cutwidth/2)<<" , "<<y-(cutwidth/2)<<endl;
214  wxString text;
215  text.Printf(wxT("Center: %3.0f, %3.0f\nRadius: %3.0f\nCutOut size: %d, %d\nOffset: %d, %d"),
216  x, y, r, (int)cutwidth, (int)cutheight, (int)(x-(cutwidth/2)), (int)(y-(cutwidth/2)));
217  wxMessageDialog dump(NULL, text);
218  dump.ShowModal();
219 
220  }
221 
222 void FitCircleFrame::
223 OnRescaleImage(wxSpinEvent& event)
224 {
225  fRescaleImageFactor_ = event.GetPosition()/100.0;
226 
227  if(fRescaleImageFactor_ != 1.0){
228  if(fRescaleImageFactor_ >1.0){
230  (unsigned int)(OrigImg_.GetWidth() * fRescaleImageFactor_),
231  (unsigned int)(OrigImg_.GetHeight() * fRescaleImageFactor_));
232  }
233  else if(fRescaleImageFactor_ <1.0){
235  (unsigned int)(OrigImg_.GetWidth() * fRescaleImageFactor_),
236  (unsigned int)(OrigImg_.GetHeight() * fRescaleImageFactor_));
237  }
238  }
239  UpdateImage();
240 }
241 
242 void FitCircleFrame::
243 OnModifyCircle(wxCommandEvent& event)
244 {
245  // find out which button it was and adapt x,y or r
246  switch(event.GetId()) {
247  case id_left: x -= inkr; break;
248  case id_right: x += inkr; break;
249  case id_up: y -= inkr; break;
250  case id_down: y += inkr; break;
251  case id_shrink: r -= inkr; break;
252  case id_expand: r += inkr; break;
253  case id_sizeslider:
254  r = (float)sizeSlider->GetValue();
255  break;
256  case id_xslider:
257  x = (float)xSlider->GetValue();
258  break;
259  case id_yslider:
260  y = (float)ySlider->GetValue();
261  break;
262  }
263 
264  UpdateImage();
265 }
266 
267 void FitCircleFrame::
268 OnSlider(wxScrollEvent& event){
269  switch(event.GetId()) {
270  case id_sizeslider:
271  r = (float)sizeSlider->GetValue();
272  break;
273  case id_xslider:
274  x = (float)xSlider->GetValue();
275  break;
276  case id_yslider:
277  y = (float)ySlider->GetValue();
278  break;
279  }
280  UpdateImage();
281 }
282 
283 void FitCircleFrame::
284 OnKey(wxKeyEvent &event)
285 {
286  cout << "Key: "<<event.GetKeyCode()<<endl;
287  switch(event.GetKeyCode()) {
288  case WXK_LEFT: x -= inkr; break;
289  case WXK_RIGHT: x += inkr; break;
290  case WXK_UP: y -= inkr; break;
291  case WXK_DOWN: y += inkr; break;
292  case '-': r -= inkr; break;
293  case '+': r += inkr; break;
294  }
295 
296  UpdateImage();
297 }
298 
299 
300 void FitCircleFrame::
301 OnThreshold(wxSpinEvent & event)
302 {
303  Threshold_=(unsigned char)event.GetPosition();
304  UpdateImage();
305 }
306 
307 
308 void FitCircleFrame::
309 OnMaxAngle(wxSpinEvent & event)
310 {
311  maxangle=(float)event.GetPosition();
312  UpdateImage();
313 }
314 
315 
316 void FitCircleFrame::
318 {
319  //update listening pointers
320  if(xp != NULL && yp != NULL && rp != NULL && maxanglep != NULL){
321  *xp = x; *yp=y; *rp=r; *maxanglep=maxangle;
322  }
323 
324  //refresh image without circle
325  DrawImg_ = WorkImg_;
326 
327  if (Threshold_ >0)
329 
330 
331  // store current scrollbar position
332  int sx, sy;
333  IC_->GetViewStart(&sx, &sy);
334 
335  int dX = int(x);
336  int dY = int(y);
337  int dR = int(r);
338  if(fRescaleImageFactor_ != 1.0){
339  dX = (int)(fRescaleImageFactor_*dX);
340  dY = (int)(fRescaleImageFactor_*dY);
341  dR = (int)(fRescaleImageFactor_*dR);
342  }
344  IC_->Show(DrawImg_,"Foo");
345 
346  // restore scrollbar position
347  IC_->Scroll(sx, sy);
348 }
349 
350 
351 BEGIN_EVENT_TABLE(FitCircleFrame, wxDialog)
352  EVT_MENU(id_quit, FitCircleFrame::OnQuit)
353  EVT_BUTTON(id_left, FitCircleFrame::OnModifyCircle)
354  EVT_BUTTON(id_quit, FitCircleFrame::OnQuit)
355  EVT_BUTTON(id_up, FitCircleFrame::OnModifyCircle)
356  EVT_BUTTON(id_down, FitCircleFrame::OnModifyCircle)
357  EVT_BUTTON(id_right, FitCircleFrame::OnModifyCircle)
358  EVT_BUTTON(id_shrink, FitCircleFrame::OnModifyCircle)
359  EVT_BUTTON(id_expand, FitCircleFrame::OnModifyCircle)
360  EVT_BUTTON(id_dump, FitCircleFrame::OnDump)
361  EVT_SPINCTRL(id_threshold, FitCircleFrame::OnThreshold)
362  EVT_SPINCTRL(id_maxangle, FitCircleFrame::OnMaxAngle)
363  EVT_SPINCTRL(id_rescale, FitCircleFrame::OnRescaleImage)
364  EVT_SCROLL(FitCircleFrame::OnSlider)
365  EVT_CHAR(FitCircleFrame::OnKey)
366 END_EVENT_TABLE()
367 
int AboveThresholdToValue(StorageType Threshold, StorageType Value)
sets alls pixels with values above Threshold to Value
Definition: Image.cpp:1028
void OnThreshold(wxSpinEvent &event)
void SetXYRA(float newx, float newy, float newr, float angle)
void SetLowPassType(int lpt)
Sets the lowpass filter by a lowpass filter type.
Definition: Rescale.cpp:2060
display image in wx application, provides zoom and investigation functionality
Definition: ImageCanvas.hh:38
wxSpinCtrl * spinCtrlAngle
BIAS::Rescale< unsigned char, unsigned char > rescaler_
void ListenToChange(float *x, float *y, float *r, float *maxangle)
int Downsample(const Image< InputStorageType > &src, Image< OutputStorageType > &dst)
generic downsample function.
Definition: Rescale.cpp:111
unsigned int GetWidth() const
Definition: ImageBase.hh:312
void OnRescaleImage(wxSpinEvent &event)
void OnSlider(wxScrollEvent &event)
unsigned char Threshold_
void OnDump(wxCommandEvent &)
static int CircleCenter(Image< StorageType > &im, unsigned int CenterX, unsigned int CenterY, unsigned int Radius, const StorageType Value[]=NULL)
draws a circular line, either using Value or a good contrast value
Definition: ImageDraw.cpp:977
Image< unsigned char > WorkImg_
unsigned char thecolor[3]
Image< unsigned char > DrawImg_
unsigned int GetHeight() const
Definition: ImageBase.hh:319
void OnKey(wxKeyEvent &event)
int Upsample(const Image< InputStorageType > &src, Image< OutputStorageType > &dst)
generic upsample function
Definition: Rescale.cpp:1157
void OnQuit(wxCommandEvent &WXUNUSED(event))
void OnModifyCircle(wxCommandEvent &event)
wxSpinCtrl * spinCtrlRescale
virtual void Show(BIAS::Image< unsigned char > &im, std::string name="")
void OnMaxAngle(wxSpinEvent &event)
static int ToRGB(const Image< StorageType > &source, Image< StorageType > &dest)
Create a RGB converted copy of source image in this.
Image< unsigned char > OrigImg_