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)
89 if (!wxPanel::Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL,
"panel"))
99 wxXmlResource::Get()->LoadPanel(
this,
"perspective_panel");
101 wxXmlResource::Get()->AttachUnknownControl(
"perspective_preview_window",
m_preview,
this);
103 wxPanel* mainPanel = XRCCTRL(*
this,
"perspective_panel", wxPanel);
104 wxBoxSizer* topsizer =
new wxBoxSizer(wxVERTICAL);
105 topsizer->Add(mainPanel, wxSizerFlags(1).Expand());
109 m_cropTextCtrl = XRCCTRL(*
this,
"perspective_cropfactor", wxTextCtrl);
111 m_zoomChoice = XRCCTRL(*
this,
"perspective_choice_zoom", wxChoice);
113 m_modeChoice = XRCCTRL(*
this,
"perspective_mode", wxChoice);
115 m_helpTextCtrl = XRCCTRL(*
this,
"perspective_help_text", wxStaticText);
116 #if wxCHECK_VERSION(3,3,2)
122 wxConfigBase* config = wxConfigBase::Get();
124 wxColour colour, defaultColour;
126 colour = config->Read(
"/ToolboxFrame/Perspective/LineColour", defaultColour.GetAsString(wxC2S_HTML_SYNTAX));
127 XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->SetColour(colour);
129 m_degDigits = config->Read(
"/General/DegreeFractionalDigitsEdit", 3);
143 wxCommandEvent commandEvent;
153 switch (e.GetSelection())
217 XRCCTRL(*
this,
"perspective_filename", wxStaticText)->SetLabel(filename);
238 const double cropFactor =
m_srcImage.getCropFactor();
239 if (focallength > 0 && focallength < 10000)
244 if (cropFactor > 0 && cropFactor < 1000)
248 const double rotation =
m_srcImage.getExifOrientation();
277 wxConfigBase* config = wxConfigBase::Get();
278 wxString path = config->Read(
"/actualPath",
"");
279 wxFileDialog dlg(
this, _(
"Add images"), path, wxEmptyString,
GetFileDialogImageFilters(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_PREVIEW, wxDefaultPosition);
280 dlg.SetDirectory(path);
284 if (config->HasEntry(
"lastImageType"))
286 img_ext = config->Read(
"lastImageType").c_str();
288 if (img_ext ==
"all images")
289 dlg.SetFilterIndex(0);
290 else if (img_ext ==
"jpg")
291 dlg.SetFilterIndex(1);
292 else if (img_ext ==
"tiff")
293 dlg.SetFilterIndex(2);
294 else if (img_ext ==
"png")
295 dlg.SetFilterIndex(3);
296 else if (img_ext ==
"hdr")
297 dlg.SetFilterIndex(4);
298 else if (img_ext ==
"exr")
299 dlg.SetFilterIndex(5);
300 else if (img_ext ==
"all files")
301 dlg.SetFilterIndex(6);
304 if (dlg.ShowModal() == wxID_OK)
309 config->Write(
"/actualPath", dlg.GetDirectory());
311 switch (dlg.GetFilterIndex())
313 case 0: config->Write(
"lastImageType",
"all images");
break;
314 case 1: config->Write(
"lastImageType",
"jpg");
break;
315 case 2: config->Write(
"lastImageType",
"tiff");
break;
316 case 3: config->Write(
"lastImageType",
"png");
break;
317 case 4: config->Write(
"lastImageType",
"hdr");
break;
318 case 5: config->Write(
"lastImageType",
"exr");
break;
319 case 6: config->Write(
"lastImageType",
"all files");
break;
327 wxConfigBase::Get()->Write(
"/ToolboxFrame/Perspective/LineColour", e.GetColour().GetAsString(wxC2S_HTML_SYNTAX));
351 const bool isRectMode =
m_modeChoice->GetSelection() == 0;
364 m_helpTextCtrl->Wrap(XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->GetSize().GetWidth());
376 if (wxGetKeyState(WXK_COMMAND))
398 wxConfigBase* config = wxConfigBase::Get();
399 wxString path = config->Read(
"/actualPath",
"");
403 wxFileDialog dlg(
this, _(
"Save project file"), path, wxEmptyString,
404 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
405 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
406 if (dlg.ShowModal() == wxID_OK)
408 wxConfig::Get()->Write(
"/actualPath", dlg.GetDirectory());
409 wxString fn = dlg.GetPath();
410 if (fn.Right(4).CmpNoCase(
".pto") != 0)
413 if (wxFile::Exists(fn))
433 wxConfigBase* config = wxConfigBase::Get();
434 wxString path = config->Read(
"/actualPath",
"");
435 wxFileDialog dlg(
this, _(
"Save output"), path, wxEmptyString,
GetMainImageFilters(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
436 dlg.SetDirectory(path);
440 if (config->HasEntry(
"lastImageType"))
442 img_ext = config->Read(
"lastImageType").c_str();
444 if (img_ext ==
"jpg")
446 dlg.SetFilterIndex(0);
450 if (img_ext ==
"tiff")
452 dlg.SetFilterIndex(1);
456 if (img_ext ==
"png")
458 dlg.SetFilterIndex(2);
463 wxString inputFilename = outputfilename.GetFullPath();
464 outputfilename.SetName(outputfilename.GetName() +
"_corrected");
465 dlg.SetFilename(outputfilename.GetFullPath());
467 if (dlg.ShowModal() == wxID_OK)
471 config->Write(
"/actualPath", dlg.GetDirectory());
475 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
477 switch (dlg.GetFilterIndex())
480 config->Write(
"lastImageType",
"jpg");
481 nonaArgs.Append(
"-m JPEG ");
485 config->Write(
"lastImageType",
"tiff");
486 nonaArgs.Append(
"-m TIFF ");
489 config->Write(
"lastImageType",
"png");
490 nonaArgs.Append(
"-m PNG ");
497 wxString exiftoolArgs(
"-overwrite_original -tagsfromfile ");
500 exiftoolArgs.Append(
" -all:all --thumbnail --thumbnailimage --xposition --yposition --orientation --imagefullwidth --imagefullheight ");
518 if (wxFileExists(file))
532 return _(
"Adjust the rectangle to an area which should be rectangular in the projected image.");
536 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.");
548 if (focallengthText.IsEmpty())
553 double focallength, cropfactor;
560 if (focallength < 0.1)
566 if (cropfactorText.IsEmpty())
577 if (cropfactor < 0.1)
585 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."),
586 _(
"Hugin toolbox"), wxICON_QUESTION | wxOK,
this);
608 std::set<std::string> imgopt;
612 optvec.push_back(imgopt);
636 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 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
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