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);
116 m_helpTextCtrl = XRCCTRL(*
this,
"perspective_help_text", wxStaticText);
117 #if wxCHECK_VERSION(3,3,2)
123 wxConfigBase* config = wxConfigBase::Get();
125 wxColour colour, defaultColour;
127 colour = config->Read(
"/ToolboxFrame/Perspective/LineColour", defaultColour.GetAsString(wxC2S_HTML_SYNTAX));
128 XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->SetColour(colour);
130 m_degDigits = config->Read(
"/General/DegreeFractionalDigitsEdit", 3);
146 wxCommandEvent commandEvent;
156 switch (e.GetSelection())
220 XRCCTRL(*
this,
"perspective_filename", wxStaticText)->SetLabel(filename);
227 m_srcImage.setFilename(filenameString);
228 m_srcImage.checkImageSizeKnown();
232 if (m_srcImage.readEXIF())
234 bool ok = m_srcImage.applyEXIFValues();
236 if (m_srcImage.getCropFactor() < 0.1)
238 m_srcImage.readCropfactorFromDB();
239 ok = (m_srcImage.getExifFocalLength() > 0 && m_srcImage.getCropFactor() > 0.1);
243 const double cropFactor = m_srcImage.getCropFactor();
244 if (focallength > 0 && focallength < 10000)
249 if (cropFactor > 0 && cropFactor < 1000)
253 const double rotation = m_srcImage.getExifOrientation();
282 wxConfigBase* config = wxConfigBase::Get();
283 wxString path = config->Read(
"/actualPath",
"");
284 wxFileDialog dlg(
this, _(
"Add images"), path, wxEmptyString,
GetFileDialogImageFilters(), wxFD_OPEN | wxFD_FILE_MUST_EXIST | wxFD_PREVIEW, wxDefaultPosition);
285 dlg.SetDirectory(path);
289 if (config->HasEntry(
"lastImageType"))
291 img_ext = config->Read(
"lastImageType").c_str();
293 if (img_ext ==
"all images")
294 dlg.SetFilterIndex(0);
295 else if (img_ext ==
"jpg")
296 dlg.SetFilterIndex(1);
297 else if (img_ext ==
"tiff")
298 dlg.SetFilterIndex(2);
299 else if (img_ext ==
"png")
300 dlg.SetFilterIndex(3);
301 else if (img_ext ==
"hdr")
302 dlg.SetFilterIndex(4);
303 else if (img_ext ==
"exr")
304 dlg.SetFilterIndex(5);
305 else if (img_ext ==
"all files")
306 dlg.SetFilterIndex(6);
309 if (dlg.ShowModal() == wxID_OK)
314 config->Write(
"/actualPath", dlg.GetDirectory());
316 switch (dlg.GetFilterIndex())
318 case 0: config->Write(
"lastImageType",
"all images");
break;
319 case 1: config->Write(
"lastImageType",
"jpg");
break;
320 case 2: config->Write(
"lastImageType",
"tiff");
break;
321 case 3: config->Write(
"lastImageType",
"png");
break;
322 case 4: config->Write(
"lastImageType",
"hdr");
break;
323 case 5: config->Write(
"lastImageType",
"exr");
break;
324 case 6: config->Write(
"lastImageType",
"all files");
break;
354 wxConfigBase::Get()->Write(
"/ToolboxFrame/Perspective/LineColour", e.GetColour().GetAsString(wxC2S_HTML_SYNTAX));
378 const bool isRectMode =
m_modeChoice->GetSelection() == 0;
393 m_helpTextCtrl->Wrap(XRCCTRL(*
this,
"perspective_color_picker", wxColourPickerCtrl)->GetSize().GetWidth());
405 if (wxGetKeyState(WXK_COMMAND))
435 wxConfigBase* config = wxConfigBase::Get();
436 wxString path = config->Read(
"/actualPath",
"");
440 wxFileDialog dlg(
this, _(
"Save project file"), path, wxEmptyString,
441 _(
"Project files (*.pto)|*.pto|All files (*)|*"),
442 wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
443 if (dlg.ShowModal() == wxID_OK)
445 wxConfig::Get()->Write(
"/actualPath", dlg.GetDirectory());
446 wxString fn = dlg.GetPath();
447 if (fn.Right(4).CmpNoCase(
".pto") != 0)
450 if (wxFile::Exists(fn))
470 wxConfigBase* config = wxConfigBase::Get();
471 wxString path = config->Read(
"/actualPath",
"");
472 wxFileDialog dlg(
this, _(
"Save output"), path, wxEmptyString,
GetMainImageFilters(), wxFD_SAVE | wxFD_OVERWRITE_PROMPT, wxDefaultPosition);
473 dlg.SetDirectory(path);
477 if (config->HasEntry(
"lastImageType"))
479 img_ext = config->Read(
"lastImageType").c_str();
481 if (img_ext ==
"jpg")
483 dlg.SetFilterIndex(0);
487 if (img_ext ==
"tiff")
489 dlg.SetFilterIndex(1);
493 if (img_ext ==
"png")
495 dlg.SetFilterIndex(2);
500 wxString inputFilename = outputfilename.GetFullPath();
501 outputfilename.SetName(outputfilename.GetName() +
"_corrected");
502 dlg.SetFilename(outputfilename.GetFullPath());
504 if (dlg.ShowModal() == wxID_OK)
508 config->Write(
"/actualPath", dlg.GetDirectory());
512 const wxFileName exePath(wxStandardPaths::Get().GetExecutablePath());
514 switch (dlg.GetFilterIndex())
517 config->Write(
"lastImageType",
"jpg");
518 nonaArgs.Append(
"-m JPEG ");
522 config->Write(
"lastImageType",
"tiff");
523 nonaArgs.Append(
"-m TIFF ");
526 config->Write(
"lastImageType",
"png");
527 nonaArgs.Append(
"-m PNG ");
534 wxString exiftoolArgs(
"-overwrite_original -tagsfromfile ");
537 exiftoolArgs.Append(
" -all:all --thumbnail --thumbnailimage --xposition --yposition --orientation --imagefullwidth --imagefullheight ");
555 if (wxFileExists(file))
569 return _(
"Adjust the rectangle to an area which should be rectangular in the projected image.");
573 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.");
585 if (focallengthText.IsEmpty())
590 double focallength, cropfactor;
597 if (focallength < 0.1)
603 if (cropfactorText.IsEmpty())
614 if (cropfactor < 0.1)
622 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."),
623 _(
"Hugin toolbox"), wxICON_QUESTION | wxOK,
this);
645 std::set<std::string> imgopt;
649 optvec.push_back(imgopt);
673 const int cropMode = XRCCTRL(*
this,
"perspective_crop", wxChoice)->GetSelection();
wxArrayString m_tempFiles
temp files, which should be deleted at end
wxButton * m_removeLinesButton
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 ...
void RemoveLines()
remove all lines from the list
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)
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)
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
void OnLoadDistortion(wxCommandEvent &e)
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
void OnRemoveLines(wxCommandEvent &e)
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
bool readDistortionFromDB()
tries to read distortion data from lens database you need to call SrcPanoImage::readEXIF before to fi...
str wxEscapeFilename(const str &arg)
special escaping routine for CommandQueues
#define HUGIN_MASK_COLOUR_POINT_SELECTED
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
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