29 #include "wx/clrpicker.h"
41 #include "wx/stdpaths.h"
54 bool OnDropFiles(wxCoord x, wxCoord y,
const wxArrayString& filenames)
57 if (filenames.size() == 1)
59 wxFileName file(filenames[0]);
60 if (file.GetExt().CmpNoCase(
"jpg") == 0 ||
61 file.GetExt().CmpNoCase(
"jpeg") == 0 ||
62 file.GetExt().CmpNoCase(
"tif") == 0 ||
63 file.GetExt().CmpNoCase(
"tiff") == 0 ||
64 file.GetExt().CmpNoCase(
"png") == 0 ||
65 file.GetExt().CmpNoCase(
"bmp") == 0 ||
66 file.GetExt().CmpNoCase(
"gif") == 0 ||
67 file.GetExt().CmpNoCase(
"pnm") == 0)
90 wxConfigBase* config = wxConfigBase::Get();
96 if (!wxPanel::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL,
"panel"))
106 wxXmlResource::Get()->LoadPanel(
this,
"perspective_panel");
108 wxXmlResource::Get()->AttachUnknownControl(
"perspective_preview_window",
m_preview,
this);
110 wxPanel* mainPanel = XRCCTRL(*
this,
"perspective_panel", wxPanel);
111 wxBoxSizer* topsizer =
new wxBoxSizer(wxVERTICAL);
112 topsizer->Add(mainPanel, wxSizerFlags(1).Expand());
116 m_cropTextCtrl = XRCCTRL(*
this,
"perspective_cropfactor", wxTextCtrl);
118 m_zoomChoice = XRCCTRL(*
this,
"perspective_choice_zoom", wxChoice);
120 m_modeChoice = XRCCTRL(*
this,
"perspective_mode", wxChoice);
122 m_helpTextCtrl = XRCCTRL(*
this,
"perspective_help_text", wxStaticText);
126 wxConfigBase* config = wxConfigBase::Get();
128 wxColour colour, defaultColour;
130 colour = config->Read(
"/ToolboxFrame/LineColour", defaultColour.GetAsString(wxC2S_HTML_SYNTAX));
131 XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->SetColour(colour);
133 m_degDigits = config->Read(
"/General/DegreeFractionalDigitsEdit", 3);
148 wxCommandEvent commandEvent;
166 switch (e.GetSelection())
230 XRCCTRL(*
this,
"perspective_filename", wxStaticText)->SetLabel(filename);
251 const double cropFactor =
m_srcImage.getCropFactor();
252 if (focallength > 0 && focallength < 10000)
257 if (cropFactor > 0 && cropFactor < 1000)
261 const double rotation =
m_srcImage.getExifOrientation();
290 wxConfigBase* config = wxConfigBase::Get();
291 wxString path = config->Read(
"/actualPath",
"");
292 wxFileDialog dlg(
this, _(
"Add images"), path, wxEmptyString,
GetFileDialogImageFilters(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_PREVIEW, wxDefaultPosition);
293 dlg.SetDirectory(path);
297 if (config->HasEntry(
"lastImageType"))
299 img_ext = config->Read(
"lastImageType").c_str();
301 if (img_ext ==
"all images")
302 dlg.SetFilterIndex(0);
303 else if (img_ext ==
"jpg")
304 dlg.SetFilterIndex(1);
305 else if (img_ext ==
"tiff")
306 dlg.SetFilterIndex(2);
307 else if (img_ext ==
"png")
308 dlg.SetFilterIndex(3);
309 else if (img_ext ==
"hdr")
310 dlg.SetFilterIndex(4);
311 else if (img_ext ==
"exr")
312 dlg.SetFilterIndex(5);
313 else if (img_ext ==
"all files")
314 dlg.SetFilterIndex(6);
317 if (dlg.ShowModal() == wxID_OK)
322 config->Write(
"/actualPath", dlg.GetDirectory());
324 switch (dlg.GetFilterIndex())
326 case 0: config->Write(
"lastImageType",
"all images");
break;
327 case 1: config->Write(
"lastImageType",
"jpg");
break;
328 case 2: config->Write(
"lastImageType",
"tiff");
break;
329 case 3: config->Write(
"lastImageType",
"png");
break;
330 case 4: config->Write(
"lastImageType",
"hdr");
break;
331 case 5: config->Write(
"lastImageType",
"exr");
break;
332 case 6: config->Write(
"lastImageType",
"all files");
break;
340 wxConfigBase::Get()->Write(
"/ToolboxFrame/LineColour", e.GetColour().GetAsString(wxC2S_HTML_SYNTAX));
364 const bool isRectMode =
m_modeChoice->GetSelection() == 0;
377 m_helpTextCtrl->Wrap(XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->GetSize().GetWidth());
389 if (wxGetKeyState(WXK_COMMAND))
411 wxConfigBase* config = wxConfigBase::Get();
412 wxString path = config->Read(
"/actualPath",
"");
416 wxFileDialog dlg(
this, _(
"Save project file"), path, wxEmptyString,
417 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
418 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
419 if (dlg.ShowModal() == wxID_OK)
421 wxConfig::Get()->Write(
"/actualPath", dlg.GetDirectory());
422 wxString fn = dlg.GetPath();
423 if (fn.Right(4).CmpNoCase(
".pto") != 0)
426 if (wxFile::Exists(fn))
446 wxConfigBase* config = wxConfigBase::Get();
447 wxString path = config->Read(
"/actualPath",
"");
448 wxFileDialog dlg(
this, _(
"Save output"), path, wxEmptyString,
GetMainImageFilters(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
449 dlg.SetDirectory(path);
453 if (config->HasEntry(
"lastImageType"))
455 img_ext = config->Read(
"lastImageType").c_str();
457 if (img_ext ==
"jpg")
459 dlg.SetFilterIndex(0);
463 if (img_ext ==
"tiff")
465 dlg.SetFilterIndex(1);
469 if (img_ext ==
"png")
471 dlg.SetFilterIndex(2);
476 wxString inputFilename = outputfilename.GetFullPath();
477 outputfilename.SetName(outputfilename.GetName() +
"_corrected");
478 dlg.SetFilename(outputfilename.GetFullPath());
480 if (dlg.ShowModal() == wxID_OK)
484 config->Write(
"/actualPath", dlg.GetDirectory());
488 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
490 switch (dlg.GetFilterIndex())
493 config->Write(
"lastImageType",
"jpg");
494 nonaArgs.Append(
"-m JPEG ");
498 config->Write(
"lastImageType",
"tiff");
499 nonaArgs.Append(
"-m TIFF ");
502 config->Write(
"lastImageType",
"png");
503 nonaArgs.Append(
"-m PNG ");
510 wxString exiftoolArgs(
"-overwrite_original -tagsfromfile ");
513 exiftoolArgs.Append(
" -all:all --thumbnail --xposition --yposition --orientation --imagefullwidth --imagefullheight ");
531 if (wxFileExists(file))
545 return _(
"Adjust the rectangle to an area which should be rectangular in the projected image.");
549 return _(
"Create a new line by dragging with left mouse button on a free space.\nExisting lines or line end points can be moved by dragging with left mouse button.\nA line can be deleted by clicking with the right mouse button.");
561 if (focallengthText.IsEmpty())
566 double focallength, cropfactor;
573 if (focallength < 0.1)
579 if (cropfactorText.IsEmpty())
590 if (cropfactor < 0.1)
598 hugin_utils::HuginMessageBox(_(
"The focal length and crop factor result in a invalid value of %d for the horizontal field of view.\nPlease input a valid combination of focal length and crop factor."),
599 _(
"Hugin toolbox"), wxICON_QUESTION | wxOK,
this);
621 std::set<std::string> imgopt;
625 optvec.push_back(imgopt);
649 const int cropMode = XRCCTRL(*
this,
"perspective_crop", wxChoice)->GetSelection();
wxArrayString m_tempFiles
temp files, which should be deleted at end
normal command for queue, processing is stopped if an error occurred in program
wxTextCtrl * m_cropTextCtrl
bool Create(wxWindow *parent, MyExecPanel *logWindow)
create the panel and populate all controls
Dummy progress display, without output.
bool AskUserOverwrite(const wxString &filename, const wxString &caption, wxWindow *parent)
ask user if the given file should be overwritten, return true if the user confirmed the overwritting ...
static double calcOptimalPanoScale(const SrcPanoImage &src, const PanoramaOptions &dest)
function to calculate the scaling factor so that the distances in the input image and panorama image ...
wxString GetStatusString()
return help text for current mode
void OnSize(wxSizeEvent &e)
void OnFindLines(wxCommandEvent &e)
bool applyEXIFValues(bool applyEVValue=true)
apply values found in EXIF data to SrcPanoImage class, call readEXIF() before to initialize some valu...
const wxString GetConfigTempDir(const wxConfigBase *config)
return the temp dir from the preferences, ensure that it ends with path separator ...
void setHeight(unsigned int h)
set panorama height
bool str2double(const wxString &s, double &d)
HuginBase::CPVector GetVerticalLines(const HuginBase::Panorama &pano, const unsigned int imgNr, vigra::UInt8RGBImage &image, vigra::BImage &mask, const unsigned int nrLines)
searches for vertical control points in given image
optional command for queue, processing of queue is always continued, also if an error occurred ...
declaration of panel for perspective correction GUI
wxButton * m_outputButton
declaration of functions for finding lines
wxStaticText * m_helpTextCtrl
void registerPTWXDlgFcn()
int ExecQueue(HuginQueue::CommandQueue *queue)
bool checkImageSizeKnown()
check if the image size is known, if try to load the information from the file
void ChangeRotation(ImageRotation newRot)
void OnModeChanged(wxCommandEvent &e)
void ClearOutput()
clear the output
void deregisterPTWXDlgFcn()
wxString doubleTowxString(double d, int digits)
wxString GetInternalProgram(const wxString &bindir, const wxString &name)
return path and name of external program, which comes bundled with Hugin
const double GetRoll() const
return the roll angle in degree
void setScale(double factor)
set the scaling factor for mask editing display.
void SetRectMode(bool newMode)
set line or rect mode
virtual void run()
runs the algorithm.
const CPVector & getCtrlPoints() const
get all control point of this Panorama
void setOptimizeVector(const OptimizeVector &optvec)
set optimize setting
PerspectivePanel * m_perspectivePanel
basic classes and function for queuing commands in wxWidgets
bool Create(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL, const wxString &name="panel")
creates the control
void setImage(const std::string &filename, ImageRotation rot)
set the current image and mask list, this loads also the image from cache
bool ReadInputs()
read the values from the input boxes
void SetRemappedMode(const HuginBase::Panorama &pano)
set the panorama object for remapping, the mouse handler are deactivated
PerspectiveImageCtrl::ImageRotation m_exifRotation
save rotation as written in EXIF
void AddLines(const HuginBase::CPVector &lines)
add the lines to the list
std::string getPathPrefix(const std::string &filename)
Get the path to a filename.
void OnProcessFinished(wxCommandEvent &e)
clean up temporary files at end
const PerspectiveImageCtrl::ImageRotation GetRotation() const
return the image rotation
~PerspectivePanel()
destructor, save position and size
void OnSaveOutput(wxCommandEvent &e)
void OnZoom(wxCommandEvent &e)
HuginBase::CPVector GetControlPoints(const unsigned int index)
return list of control points
void setCtrlPoints(const CPVector &points)
set all control points (Ippei: Is this supposed to be 'add' method?)
void OnLoadImage(wxCommandEvent &e)
virtual vigra::Rect2D getResultOptimalROI()
return the ROI structure?, for now area
virtual double getResultHeight()
void SetLineColour(wxColour newColour)
sets the colour for the lines
PerspectiveImageCtrl * m_preview
controls
IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow, wxWindow)
bool GetPanorama(HuginBase::Panorama &pano, const bool optimized=true)
return Pano object, it is optimized and the crop set when optimized=true
HuginBase::CPVector GetLines(const HuginBase::Panorama &pano, const unsigned int imgNr, vigra::UInt8RGBImage &image, vigra::BImage &mask)
searches for all lines, the same as GetVerticalLines execpt that no filtering according to roll angle...
image previewer for perspective correction
static double calcFocalLength(SrcPanoImage::Projection proj, double hfov, double crop, vigra::Size2D imageSize)
calcualte focal length, given crop factor and hfov
ImageCache::EntryPtr getCachedImage()
return pointer to ImageCache
MyExecPanel * m_logWindow
void setROI(const vigra::Rect2D &val)
!! from PTOptimise.h 1951
bool IsOriginalShown() const
unsigned int addImage(const SrcPanoImage &img)
the the number for a specific image
bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &filenames)
void setOriginalMode()
show the original images with selected zoom ration, the mouse handlers are activated ...
void OnCropChanged(wxCommandEvent &e)
void OnRotationChanged(wxCommandEvent &e)
void setHFOV(double h, bool keepView=true)
set the horizontal field of view.
wxButton * m_findLineButton
unsigned int getWidth() const
ImageRotation
image rotation.
void OnColourChanged(wxColourPickerEvent &e)
virtual double getResultHorizontalFOV()
virtual vigra::Rect2D getResultOptimalROI()
returns the found crop rect
str wxEscapeFilename(const str &arg)
special escaping routine for CommandQueues
#define HUGIN_MASK_COLOUR_POINT_SELECTED
bool readEXIF()
try to fill out information about the image, by examining the exif data
file drag and drop handler method
std::vector< ControlPoint > CPVector
static double calcHFOV(SrcPanoImage::Projection proj, double fl, double crop, vigra::Size2D imageSize)
calculate hfov of an image given focal length, image size and crop factor
bool WritePTOFile(const std::string &filename, const std::string &prefix="")
write data to given pto file
std::vector< std::set< std::string > > OptimizeVector
void OnSavePTO(wxCommandEvent &e)
HuginBase::SrcPanoImage m_srcImage
SrcPanoImage, contains information about the image.
void setOptions(const PanoramaOptions &opt)
set new output settings This is not used directly for optimizing/stiching, but it can be feed into ru...
void OnPreview(wxCommandEvent &e)
wxTextCtrl * m_focallengthTextCtrl
void SetImage(const wxString &filename)
load the given image
All variables of a source image.
void setProjection(ProjectionFormat f)
set the Projection format and adjust the hfov/vfov if nessecary
bool readCropfactorFromDB()
tries to read cropfactor from lens database you need to call SrcPanoImage::readEXIF before to fill so...
int HuginMessageBox(const wxString &message, const wxString &caption, int style, wxWindow *parent)
virtual bool hasRunSuccessfully()
wxString GetExternalProgram(wxConfigBase *config, const wxString &bindir, const wxString &name)
return path and name of external program, which can be overwritten by the user
std::vector< NormalCommand * > CommandQueue
void setWidth(unsigned int w, bool keepView=true)
set panorama width keep the HFOV, if keepView=true
wxChoice * m_previewChoice
PerspectiveDropTarget(PerspectivePanel *parent)
double outputExposureValue
wxChoice * m_rotationChoice