Hugintrunk  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ImageVariableDialog.cpp
Go to the documentation of this file.
1 // -*- c-basic-offset: 4 -*-
2 
11 /* This is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This software is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public
22  * License along with this software. If not, see
23  * <http://www.gnu.org/licenses/>.
24  *
25  */
26 
28 #include "base_wx/GraphTools.h"
29 #include "base_wx/wxPlatform.h"
30 #include "panoinc.h"
32 #include <map>
33 #include <string>
34 
35 #include "hugin/huginApp.h"
36 #include "base_wx/CommandHistory.h"
37 #include "base_wx/PanoCommand.h"
38 
39 BEGIN_EVENT_TABLE(ImageVariableDialog,wxDialog)
40  EVT_BUTTON(wxID_OK, ImageVariableDialog::OnOk)
41  EVT_BUTTON(wxID_HELP, ImageVariableDialog::OnHelp)
42  EVT_BUTTON(XRCID("image_show_distortion_graph"), ImageVariableDialog::OnShowDistortionGraph)
43  EVT_BUTTON(XRCID("image_show_vignetting_graph"), ImageVariableDialog::OnShowVignettingGraph)
44  EVT_BUTTON(XRCID("image_show_response_graph"), ImageVariableDialog::OnShowResponseGraph)
45  EVT_CHOICE(XRCID("image_variable_responseType"), ImageVariableDialog::OnResponseSelected)
47 
48 ImageVariableDialog::ImageVariableDialog(wxWindow *parent, HuginBase::Panorama* pano, HuginBase::UIntSet imgs)
49 {
50  // load our children. some children might need special
51  // initialization. this will be done later.
52  wxXmlResource::Get()->LoadDialog(this, parent, wxT("image_variables_dialog"));
53 
54 #ifdef __WXMSW__
55  wxIconBundle myIcons(huginApp::Get()->GetXRCPath() + wxT("data/hugin.ico"),wxBITMAP_TYPE_ICO);
56  SetIcons(myIcons);
57 #else
58  wxIcon myIcon(huginApp::Get()->GetXRCPath() + wxT("data/hugin.png"),wxBITMAP_TYPE_PNG);
59  SetIcon(myIcon);
60 #endif
61 
62  wxConfigBase * cfg = wxConfigBase::Get();
63  //position
64  int x = cfg->Read(wxT("/ImageVariablesDialog/positionX"),-1l);
65  int y = cfg->Read(wxT("/ImageVariablesDialog/positionY"),-1l);
66  if ( y >= 0 && x >= 0)
67  {
68  this->Move(x, y);
69  }
70  else
71  {
72  this->Move(0, 44);
73  };
74  m_pano=pano;
75  m_images=imgs;
76  m_popup=NULL;
77  InitValues();
78 };
79 
81 {
82  wxConfigBase * cfg = wxConfigBase::Get();
83  wxPoint ps = this->GetPosition();
84  cfg->Write(wxT("/ImageVariablesDialog/positionX"), ps.x);
85  cfg->Write(wxT("/ImageVariablesDialog/positionY"), ps.y);
86  cfg->Flush();
87 };
88 
90 {
91  XRCCTRL(*this, "image_variable_notebook", wxNotebook)->SetSelection(i);
92 };
93 
94 wxTextCtrl* GetImageVariableControl(const wxWindow* parent, const char* varname)
95 {
96  return wxStaticCast(
97  parent->FindWindow(
98  wxXmlResource::GetXRCID(
99  wxString(wxT("image_variable_")).append(wxString(varname, wxConvLocal)).c_str()
100  )
101  ), wxTextCtrl
102  );
103 };
104 
106 {
107  if(m_images.empty())
108  {
109  return;
110  };
111  HuginBase::BaseSrcPanoImage::ResponseType responseType = m_pano->getImage(*m_images.begin()).getResponseType();
112  bool identical=true;
113 
114  for (HuginBase::UIntSet::const_iterator it = m_images.begin(); it != m_images.end() && identical; ++it)
115  {
116  identical=(responseType==m_pano->getImage(*it).getResponseType());
117  };
118  if(identical)
119  {
120  XRCCTRL(*this, "image_variable_responseType", wxChoice)->SetSelection(responseType);
121  };
122 
123  int degDigits = wxConfigBase::Get()->Read(wxT("/General/DegreeFractionalDigitsEdit"),3);
124  int pixelDigits = wxConfigBase::Get()->Read(wxT("/General/PixelFractionalDigitsEdit"),2);
125  int distDigitsEdit = wxConfigBase::Get()->Read(wxT("/General/DistortionFractionalDigitsEdit"),5);
126 
128 
129  for (const char** varname = m_varNames; *varname != 0; ++varname)
130  {
131  // update parameters
132  int ndigits = distDigitsEdit;
133  if (strcmp(*varname, "y") == 0 || strcmp(*varname, "p") == 0 ||
134  strcmp(*varname, "r") == 0 || strcmp(*varname, "TrX") == 0 ||
135  strcmp(*varname, "TrY") == 0 || strcmp(*varname, "TrZ") == 0 )
136  {
137  ndigits=degDigits;
138  };
139  if (strcmp(*varname, "v") == 0 || strcmp(*varname, "d") == 0 ||
140  strcmp(*varname, "e") == 0 )
141  {
142  ndigits = pixelDigits;
143  }
144  double val=const_map_get(imgVarVector[*m_images.begin()],*varname).getValue();
145  bool identical=true;
146  for(HuginBase::UIntSet::const_iterator it=m_images.begin();it!=m_images.end() && identical;++it)
147  {
148  identical=(val==const_map_get(imgVarVector[*it],*varname).getValue());
149  };
150  if(identical)
151  {
152  GetImageVariableControl(this, *varname)->SetValue(hugin_utils::doubleTowxString(val,ndigits));
153  };
154  };
155  wxCommandEvent dummy;
156  OnResponseSelected(dummy);
157 };
158 
160 {
161  // translation
162  XRCCTRL(*this, "image_variable_text_translation", wxStaticText)->Show(newLevel==GUI_EXPERT);
163  XRCCTRL(*this, "image_variable_text_translation_x", wxStaticText)->Show(newLevel==GUI_EXPERT);
164  XRCCTRL(*this, "image_variable_text_translation_y", wxStaticText)->Show(newLevel==GUI_EXPERT);
165  XRCCTRL(*this, "image_variable_text_translation_z", wxStaticText)->Show(newLevel==GUI_EXPERT);
166  XRCCTRL(*this, "image_variable_text_translation_Tpy", wxStaticText)->Show(newLevel==GUI_EXPERT);
167  XRCCTRL(*this, "image_variable_text_translation_Tpp", wxStaticText)->Show(newLevel==GUI_EXPERT);
168  XRCCTRL(*this, "image_variable_TrX", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
169  XRCCTRL(*this, "image_variable_TrY", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
170  XRCCTRL(*this, "image_variable_TrZ", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
171  XRCCTRL(*this, "image_variable_Tpy", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
172  XRCCTRL(*this, "image_variable_Tpp", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
173  // shear
174  XRCCTRL(*this, "image_variable_text_shear", wxStaticText)->Show(newLevel==GUI_EXPERT);
175  XRCCTRL(*this, "image_variable_text_shear_g", wxStaticText)->Show(newLevel==GUI_EXPERT);
176  XRCCTRL(*this, "image_variable_text_shear_t", wxStaticText)->Show(newLevel==GUI_EXPERT);
177  XRCCTRL(*this, "image_variable_g", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
178  XRCCTRL(*this, "image_variable_t", wxTextCtrl)->Show(newLevel==GUI_EXPERT);
179 };
180 
182 {
183  std::vector<PanoCommand::PanoCommand*> commands;
184  HuginBase::VariableMap varMap;
185  for (const char** varname = m_varNames; *varname != 0; ++varname)
186  {
187  wxString s=GetImageVariableControl(this, *varname)->GetValue();
188  if(!s.empty())
189  {
190  double val;
191  if(hugin_utils::str2double(s,val))
192  {
193  if(strcmp(*varname, "v")==0)
194  {
195  if (val < 0.05)
196  {
197  wxMessageBox(_("The horizontal field of view must be positive."),
198 #ifdef __WXMSW__
199  _("Hugin"),
200 #else
201  wxT(""),
202 #endif
203  wxICON_EXCLAMATION | wxOK);
204  return false;
205  };
206  switch(m_pano->getImage(*m_images.begin()).getProjection())
207  {
209  if(val>179)
210  {
211  val=179;
212  };
213  break;
215  if(val>190)
216  {
217  if(wxMessageBox(
218  wxString::Format(_("You have given a field of view of %.2f degrees.\n But the orthographic projection is limited to a field of view of 180 degress.\nDo you want still use that high value?"), val),
219 #ifdef __WXMSW__
220  _("Hugin"),
221 #else
222  wxT(""),
223 #endif
224  wxICON_EXCLAMATION | wxYES_NO)==wxNO)
225  {
226  return false;
227  };
228  };
229  break;
230  default:
231  break;
232  };
233  };
234  varMap.insert(std::make_pair(std::string(*varname), HuginBase::Variable(std::string(*varname), val)));
235  }
236  else
237  {
238  wxLogError(_("Value must be numeric."));
239  return false;
240  };
241  };
242  };
243  int sel=XRCCTRL(*this, "image_variable_responseType", wxChoice)->GetSelection();
244  if(sel!=wxNOT_FOUND)
245  {
246  std::vector<HuginBase::SrcPanoImage> SrcImgs;
247  for (HuginBase::UIntSet::const_iterator it=m_images.begin(); it!=m_images.end(); ++it)
248  {
250  img.setResponseType((HuginBase::SrcPanoImage::ResponseType)sel);
251  SrcImgs.push_back(img);
252  }
253  commands.push_back(new PanoCommand::UpdateSrcImagesCmd( *m_pano, m_images, SrcImgs ));
254  }
255  if(!varMap.empty())
256  {
257  for(HuginBase::UIntSet::const_iterator it=m_images.begin();it!=m_images.end();++it)
258  {
259  commands.push_back(
261  );
262  };
263  };
264  if(!commands.empty())
265  {
267  return true;
268  }
269  else
270  {
271  return false;
272  };
273 };
274 
275 void ImageVariableDialog::OnOk(wxCommandEvent & e)
276 {
277  if(ApplyNewVariables())
278  {
279  e.Skip();
280  };
281 };
282 
283 void ImageVariableDialog::OnHelp(wxCommandEvent & e)
284 {
285  // open help on appropriate page
286  switch(XRCCTRL(*this, "image_variable_notebook", wxNotebook)->GetSelection())
287  {
288  //lens parameters
289  case 1:
290  MainFrame::Get()->DisplayHelp(wxT("Lens_correction_model.html"));
291  break;
292  case 2:
293  MainFrame::Get()->DisplayHelp(wxT("Vignetting.html"));
294  break;
295  case 3:
296  MainFrame::Get()->DisplayHelp(wxT("Camera_response_curve.html"));
297  break;
298  default:
299  MainFrame::Get()->DisplayHelp(wxT("Image_positioning_model.html"));
300  break;
301  };
302 };
303 
305 {
306  const bool showResponseParam = XRCCTRL(*this, "image_variable_responseType", wxChoice)->GetSelection() == 0;
307  wxTextCtrl* control = XRCCTRL(*this, "image_variable_Ra", wxTextCtrl);
308  control->Enable(showResponseParam);
309  control->Show(showResponseParam);
310  control = XRCCTRL(*this, "image_variable_Rb", wxTextCtrl);
311  control->Enable(showResponseParam);
312  control->Show(showResponseParam);
313  control = XRCCTRL(*this, "image_variable_Rc", wxTextCtrl);
314  control->Enable(showResponseParam);
315  control->Show(showResponseParam);
316  control = XRCCTRL(*this, "image_variable_Rd", wxTextCtrl);
317  control->Enable(showResponseParam);
318  control->Show(showResponseParam);
319  control = XRCCTRL(*this, "image_variable_Re", wxTextCtrl);
320  control->Enable(showResponseParam);
321  control->Show(showResponseParam);
322 };
323 
324 const char *ImageVariableDialog::m_varNames[] = { "y", "p", "r", "TrX", "TrY", "TrZ", "Tpy", "Tpp",
325  "v", "a", "b", "c", "d", "e", "g", "t",
326  "Eev", "Er", "Eb",
327  "Vb", "Vc", "Vd", "Vx", "Vy",
328  "Ra", "Rb", "Rc", "Rd", "Re", 0};
329 
331 {
332  wxString stringa=GetImageVariableControl(this, "a")->GetValue();
333  wxString stringb=GetImageVariableControl(this, "b")->GetValue();
334  wxString stringc=GetImageVariableControl(this, "c")->GetValue();
335  if(stringa.empty() || stringb.empty() || stringc.empty())
336  {
337  wxBell();
338  return;
339  };
340  std::vector<double> radialDist(4 ,0);
341  if(!hugin_utils::str2double(stringa, radialDist[0]) || !hugin_utils::str2double(stringb, radialDist[1]) || !hugin_utils::str2double(stringc, radialDist[2]))
342  {
343  wxBell();
344  return;
345  };
346  radialDist[3] = 1 - radialDist[0] - radialDist[1] - radialDist[2];
347 
348  //create transformation
350  srcImage.setSize(m_pano->getImage(*(m_images.begin())).getSize());
351  // set projection to rectilinear, just in case, it should be the default value
352  srcImage.setProjection(HuginBase::SrcPanoImage::RECTILINEAR);
353  srcImage.setRadialDistortion(radialDist);
354 
355  delete m_popup;
356  //show popup
358  wxWindow *button = (wxWindow*) e.GetEventObject();
359  wxPoint pos=button->ClientToScreen(wxPoint(0,0));
360  m_popup->Position(pos, button->GetSize());
361  m_popup->Popup();
362 };
363 
365 {
366  wxString stringVb=GetImageVariableControl(this, "Vb")->GetValue();
367  wxString stringVc=GetImageVariableControl(this, "Vc")->GetValue();
368  wxString stringVd=GetImageVariableControl(this, "Vd")->GetValue();
369  if(stringVb.empty() || stringVc.empty() || stringVd.empty())
370  {
371  wxBell();
372  return;
373  };
374  std::vector<double> vigCorr(4,0);
375  vigCorr[0]=1.0;
376  if(!hugin_utils::str2double(stringVb, vigCorr[1]) || !hugin_utils::str2double(stringVc, vigCorr[2]) || !hugin_utils::str2double(stringVd, vigCorr[3]))
377  {
378  wxBell();
379  return;
380  };
381  delete m_popup;
382  wxGraphTools::Graph graph(300, 200, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
383  graph.SetChartArea(10, 10, 290, 190);
384  graph.SetChartDisplay(0, 0.8, 1, 1);
385  graph.DrawGrid(6, 6);
386 
387  //create ResponseTransform with vignetting only
389  srcImage.setRadialVigCorrCoeff(vigCorr);
390 #define NRPOINTS 100
391  srcImage.setSize(vigra::Size2D(2*NRPOINTS, 2*NRPOINTS));
393  transform.enforceMonotonicity();
394 
395  //now calc vignetting curve
396  std::vector<hugin_utils::FDiff2D> points;
397 #define NRPOINTS 100
398  for(size_t i=0; i<=NRPOINTS; i++)
399  {
400  points.push_back(hugin_utils::FDiff2D(i/double(NRPOINTS),transform(1.0, hugin_utils::FDiff2D(NRPOINTS-i, NRPOINTS-i))));
401  };
402  graph.DrawLine(points, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), 2);
403 
404  //display popup
405  m_popup = new wxGraphTools::GraphPopupWindow(this, graph.GetGraph());
406  wxWindow *button = (wxWindow*) e.GetEventObject();
407  wxPoint pos=button->ClientToScreen(wxPoint(0,0));
408  m_popup->Position(pos, button->GetSize());
409  m_popup->Popup();
410 };
411 
413 {
414  HuginBase::SrcPanoImage::ResponseType responseType=(HuginBase::SrcPanoImage::ResponseType)XRCCTRL(*this, "image_variable_responseType", wxChoice)->GetSelection();
415  wxString stringRa=GetImageVariableControl(this, "Ra")->GetValue();
416  wxString stringRb=GetImageVariableControl(this, "Rb")->GetValue();
417  wxString stringRc=GetImageVariableControl(this, "Rc")->GetValue();
418  wxString stringRd=GetImageVariableControl(this, "Rd")->GetValue();
419  wxString stringRe=GetImageVariableControl(this, "Re")->GetValue();
420  if(stringRa.empty() || stringRb.empty() || stringRc.empty() || stringRd.empty() || stringRe.empty())
421  {
422  wxBell();
423  return;
424  };
425  double Ra, Rb, Rc, Rd, Re;
426  if(!hugin_utils::str2double(stringRa, Ra) || !hugin_utils::str2double(stringRb, Rb) || !hugin_utils::str2double(stringRc, Rc) ||
427  !hugin_utils::str2double(stringRd, Rd) || !hugin_utils::str2double(stringRe, Re))
428  {
429  wxBell();
430  return;
431  };
432  delete m_popup;
433  wxGraphTools::Graph graph(300, 200, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
434  graph.SetChartArea(10, 10, 290, 190);
435  graph.SetChartDisplay(0, 0, 1, 1);
436  graph.DrawGrid(6, 6);
437  switch(responseType)
438  {
440  {
441  //draw standard EMOR curve
442  std::vector<float> emor(5, 0.0);
443  std::vector<double> outLutStd;
444  vigra_ext::EMoR::createEMoRLUT(emor, outLutStd);
446  graph.SetChartDisplay(0, 0, outLutStd.size()-1.0, 1.0);
447  std::vector<hugin_utils::FDiff2D> points;
448  for(size_t i=0; i<outLutStd.size(); i++)
449  {
450  points.push_back(hugin_utils::FDiff2D(i, outLutStd[i]));
451  };
452  graph.DrawLine(points, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), 1);
453  outLutStd.clear();
454  points.clear();
455  // now draw our curve
456  emor[0]=Ra;
457  emor[1]=Rb;
458  emor[2]=Rc;
459  emor[3]=Rd;
460  emor[4]=Re;
461  std::vector<double> outLut;
462  vigra_ext::EMoR::createEMoRLUT(emor, outLut);
464  graph.SetChartDisplay(0, 0, outLut.size()-1.0, 1.0);
465  for(size_t i=0; i<outLut.size(); i++)
466  {
467  points.push_back(hugin_utils::FDiff2D(i, outLut[i]));
468  };
469  graph.DrawLine(points, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), 2);
470  };
471  break;
473  default:
474  {
475  std::vector<hugin_utils::FDiff2D> points;
476  points.push_back(hugin_utils::FDiff2D(0, 0));
477  points.push_back(hugin_utils::FDiff2D(1, 1));
478  graph.DrawLine(points, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT), 2);
479  };
480  break;
481  };
482  //show popup
483  m_popup = new wxGraphTools::GraphPopupWindow(this, graph.GetGraph());
484  wxWindow *button = (wxWindow*) e.GetEventObject();
485  wxPoint pos=button->ClientToScreen(wxPoint(0,0));
486  m_popup->Position(pos, button->GetSize());
487  m_popup->Popup();
488 };
void DisplayHelp(wxString section=wxEmptyString)
call help browser with given file
Definition: MainFrame.cpp:1504
update source images
Definition: PanoCommand.h:404
#define NRPOINTS
void OnShowDistortionGraph(wxCommandEvent &e)
shows a popup with distortion graph
bool str2double(const wxString &s, double &d)
Definition: wxPlatform.cpp:37
SrcPanoImage getSrcImage(unsigned imgNr) const
get a description of a source image
Definition: Panorama.cpp:1620
void SetGuiLevel(GuiLevel newLevel)
sets the GuiLevel
radiometric transformation, includes exposure, vignetting and white balance.
void OnShowVignettingGraph(wxCommandEvent &e)
shows a popup with vignetting graph
void enforceMonotonicity(LUT &lut)
enforce monotonicity of an array (mostly used for lookup tables)
Definition: lut.h:87
wxString doubleTowxString(double d, int digits)
Definition: wxPlatform.cpp:31
void SelectTab(size_t i)
selects the tab with index i
a variable has a value and a name.
END_EVENT_TABLE()
include file for the hugin project
update variables of a single image
Definition: PanoCommand.h:160
simple popup to show graph
Definition: GraphTools.h:38
vigra::pair< typename ROIImage< Image, Mask >::image_const_traverser, typename ROIImage< Image, Mask >::ImageConstAccessor > srcImage(const ROIImage< Image, Mask > &img)
Definition: ROIImage.h:300
void DrawGrid(size_t linesX, size_t linesY)
draws the grid with linesX lines in x-direction and linexY lines in y-direction
Definition: GraphTools.cpp:145
const Map::mapped_type & const_map_get(const Map &m, const typename Map::key_type &key)
Definition: stl_utils.h:110
void OnResponseSelected(wxCommandEvent &e)
response type changed
static huginApp * Get()
hack.. kind of a pseudo singleton...
Definition: huginApp.cpp:649
PanoCommand to combine other PanoCommands.
Definition: PanoCommand.h:39
std::set< unsigned int > UIntSet
Definition: PanoramaData.h:51
std::vector< VariableMap > VariableMapVector
empirical model of response
Definition: SrcPanoImage.h:100
wxGraphTools::GraphPopupWindow * m_popup
VariableMapVector getVariables() const
get variables of this panorama
Definition: Panorama.cpp:118
Definition of dialog to edit image variables.
void OnHelp(wxCommandEvent &e)
shows the help
static MainFrame * Get()
hack.. kind of a pseudo singleton...
Definition: MainFrame.cpp:2181
wxTextCtrl * GetImageVariableControl(const wxWindow *parent, const char *varname)
void SetChartArea(int left, int top, int right, int bottom)
set where to draw the chart on the bitmap
Definition: GraphTools.cpp:125
void SetChartDisplay(double xmin, double ymin, double xmax, double ymax)
set the real dimension of the chart
Definition: GraphTools.cpp:136
bool ApplyNewVariables()
applies the changed variables to the Panorama class, using CommandHistory
static GlobalCmdHist & getInstance()
void DrawLine(std::vector< hugin_utils::FDiff2D > points, wxColour colour, int penWidth=1)
draws a line with the coordinates given in points
Definition: GraphTools.cpp:161
void OnOk(wxCommandEvent &e)
Saves current state of all checkboxes when closing dialog with Ok.
void addCommand(PanoCommand *command, bool execute=true)
Adds a command to the history.
void createEMoRLUT(const std::vector< float > &params, VECTOR &lut)
Definition: emor.h:44
std::map< std::string, Variable > VariableMap
help class to draw charts
Definition: GraphTools.h:51
~ImageVariableDialog()
destructor, saves position
void OnShowResponseGraph(wxCommandEvent &e)
shows a popup with response graph
wxBitmap GetDistortionGraph(const HuginBase::SrcPanoImage &srcImage)
return wxBitmap with graph of distortion for given SrcPanoImage
Definition: GraphTools.cpp:193
void setSize(vigra::Size2D val)
Set the image size in pixels.
platform/compiler specific stuff.
const SrcPanoImage & getImage(std::size_t nr) const
get a panorama image, counting starts with 0
Definition: Panorama.h:211
GuiLevel
Definition: GuiLevel.h:31
const wxBitmap GetGraph() const
Definition: GraphTools.cpp:178
static const char * m_varNames[]
All variables of a source image.
Definition: SrcPanoImage.h:194
HuginBase::UIntSet m_images
HuginBase::Panorama * m_pano
Dialog for editing image variables.
void InitValues()
copy the variables from Panorama to dialog