27#include "hugin_config.h"
57#include "vigra/cornerdetection.hxx"
58#include "vigra/localminmax.hxx"
95 wxXmlResource::Get()->LoadPanel(
this,
"cp_editor_panel");
96 wxPanel *
panel =
XRCCTRL(*
this,
"cp_editor_panel", wxPanel);
135 for (
int j=0;
j <
m_cpList->GetColumnCount() ;
j++ )
138 int width =
config->Read(wxString::Format(
"/CPEditorPanel/ColumnWidth%d",
j ), -1);
224 wxCommandEvent
dummy;
321 ImageCache::getInstance().softFlush();
358 ImageCache::getInstance().softFlush();
382 img.setTranslationPlaneYaw(0);
383 img.setTranslationPlanePitch(0);
403 img.setTranslationPlaneYaw(0);
404 img.setTranslationPlanePitch(0);
433#define SORTASCENDING(functionName, var) \
434int wxCALLBACK functionName(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData)\
436 HuginBase::CPointVector* data = (HuginBase::CPointVector*)(sortData);\
437 if (data->at(item1).second.var > data->at(item2).second.var)\
439 if (data->at(item1).second.var < data->at(item2).second.var)\
444#define SORTDESCENDING(functionName, var) \
445int wxCALLBACK functionName(wxIntPtr item1, wxIntPtr item2, wxIntPtr sortData)\
447 HuginBase::CPointVector* data = (HuginBase::CPointVector*)(sortData); \
448 if (data->at(item1).second.var < data->at(item2).second.var)\
450 if (data->at(item1).second.var > data->at(item2).second.var)\
560 }
else if (ev.GetEventObject() ==
m_rightImg){
637 DEBUG_ERROR(
"invalid point number while moving point")
643 <<
" " <<
cp.x2 <<
"," <<
cp.y2);
833 m_x1Text->SetValue(wxString::Format(
"%.2f",p.
x1));
834 m_y1Text->SetValue(wxString::Format(
"%.2f",p.
y1));
835 m_x2Text->SetValue(wxString::Format(
"%.2f",p.
x2));
836 m_y2Text->SetValue(wxString::Format(
"%.2f",p.
y2));
859 DEBUG_ERROR(
"CPEditor::setGlobalPoint: point " <<
globalNr <<
" not found in currentPoints");
901 if (op.
x < (
int)
pImg.getSize().width() && op.
x >= 0
902 && op.
y < (
int)
pImg.getSize().height() && op.
y >= 0)
926 }
catch (std::exception & e) {
946 s1.Printf(
_(
"Point fine-tuned, angle: %.0f deg, correlation coefficient: %0.3f, curvature: %0.3f %0.3f"),
949 wxString s2 =
s1 +
" -- " +
wxString(
_(
"change points, or press right mouse button to add the pair"));
1007 if (
thisImg->getScale() < 1) {
1052 double sAreaPercent = wxConfigBase::Get()->Read(
"/Finetune/SearchAreaPercent",
1066 }
catch (std::exception & e) {
1091 s1.Printf(
_(
"Point fine-tuned, angle: %.0f deg, correlation coefficient: %0.3f, curvature: %0.3f %0.3f"),
1094 corrMsg =
s1 +
" -- " +
wxString(
_(
"change points, or press right mouse button to add the pair"));
1100 if (
thisImg->getScale() < 1) {
1148 imgMod.setProjection(img.getProjection());
1149 imgMod.setHFOV(img.getHFOV());
1242 if (
templ.getProjection() ==
search.getProjection()
1296 vigra::BImage alpha(opts.
getSize());
1309#if defined DEBUG_EXPORT_FINE_TUNE_REMAPPING
1311 vigra::ImageExportInfo
templExport(
"template_remapped.tif");
1313 vigra::ImageExportInfo
searchExport(
"search_remapped.tif");
1353 MainFrame::Get()->SetStatusText(
_(
"Distance between line control points too short, skipping fine-tune."));
1361 wxConfigBase::Get()->Read(
"/Finetune/CorrThreshold",&corrThresh,
1384 MainFrame::Get()->SetStatusText(wxString::Format(
_(
"Point fine-tuned, angle: %.0f deg, correlation coefficient: %0.3f, curvature: %0.3f %0.3f"),
1390 dlg->SetExtendedMessage(
_(
"An internal transformation went wrong.\nCheck that the point is inside the image."));
1398 dlg->SetExtendedMessage(wxString::Format(
_(
"Check the similarity visually.\nCorrelation coefficient (%.3f) is lower than the threshold set in the preferences."),
1448 item.SetText(
_(
"Correlation"));
1452 item.SetText(
_(
"Distance"));
1509 ImageCache::getInstance().softFlush();
1513 for (
unsigned int i=0;
i < ((
nrTabs < nrImages)?
nrTabs: nrImages);
i++) {
1526 for (
unsigned int i=
nrTabs;
i < nrImages;
i++)
1574 unsigned int imgNr = *
it;
1628 if (update || nrImages == 0) {
1672 HuginBase::CPVector::size_type
i = 0;
1675 for (HuginBase::CPVector::size_type index = 0; index <
controlPoints.size(); ++index)
1698 for (
int i = 0;
i <
m_cpList->GetItemCount();
i++)
1713 long item =
m_cpList->InsertItem(
i, wxString::Format(
"%d",
i), -1);
1716 m_cpList->SetItem(
i,1,wxString::Format(
"%.2f",p.
x1));
1717 m_cpList->SetItem(
i,2,wxString::Format(
"%.2f",p.
y1));
1718 m_cpList->SetItem(
i,3,wxString::Format(
"%.2f",p.
x2));
1719 m_cpList->SetItem(
i,4,wxString::Format(
"%.2f",p.
y2));
1726 mode =
_(
"vert. Line");
1729 mode =
_(
"horiz. Line");
1732 mode = wxString::Format(
_(
"Line %d"), p.
mode);
1767 m_x1Text->SetValue(wxString::Format(
"%.2f",p.
x1));
1768 m_y1Text->SetValue(wxString::Format(
"%.2f",p.
y1));
1769 m_x2Text->SetValue(wxString::Format(
"%.2f",p.
x2));
1770 m_y2Text->SetValue(wxString::Format(
"%.2f",p.
y2));
1780 for (
int j=0;
j <
m_cpList->GetColumnCount() ;
j++ )
1784 int width = wxConfigBase::Get()->Read(wxString::Format(
"/CPEditorPanel/ColumnWidth%d",
j ), -1);
1870 DEBUG_TRACE(
"OnLeftChoiceChange() to " << e.GetSelection());
1878 DEBUG_TRACE(
"OnRightChoiceChange() to " << e.GetSelection());
1885 int t = ev.GetIndex();
1934 switch (e.GetSelection()) {
1984 <<
" origin: id:" << e.GetId() <<
" obj: "
1985 << e.GetEventObject());
2010 }
else if (e.m_keyCode ==
'0') {
2011 wxCommandEvent
dummy;
2015 }
else if (e.m_keyCode ==
'1') {
2016 wxCommandEvent
dummy;
2020 }
else if (e.m_keyCode ==
'2') {
2021 wxCommandEvent
dummy;
2025 }
else if (e.CmdDown() && e.GetKeyCode() ==
WXK_LEFT) {
2027 wxCommandEvent
dummy;
2029 }
else if (e.CmdDown() && e.GetKeyCode() ==
WXK_RIGHT) {
2031 wxCommandEvent
dummy;
2033 }
else if (e.GetKeyCode() ==
'f') {
2034 bool left = e.GetEventObject() ==
m_leftImg;
2040 }
else if (e.GetKeyCode() ==
'g') {
2042 long th =
wxGetNumberFromUser(
_(
"Create control points.\nTo create less points,\nenter a higher number."),
_(
"Corner Detection threshold"),
_(
"Create control points"), 400, 0, 32000);
2046 long scale =
wxGetNumberFromUser(
_(
"Create control points"),
_(
"Corner Detection scale"),
_(
"Create control points"), 2);
2053 DEBUG_DEBUG(
"corner threshold: " <<
th <<
" scale: " << scale);
2057 }
catch (std::exception & e) {
2199 }
else if (left >=
nImgs) {
2205 }
else if (right >=
nImgs) {
2220 }
else if (left >=
nImgs) {
2226 }
else if (right >=
nImgs) {
2296 std::cout <<
"Cannot run celeste without at least one control point connecting the two images" << std::endl;
2301 progress.updateDisplayValue(
_(
"Loading model file"));
2317 int radius=(
t)?10:20;
2320 if (!
progress.updateDisplayValue(
_(
"Running Celeste")))
2326 vigra::UInt16RGBImage in;
2327 if(img->image16->width()>0)
2329 in.resize(img->image16->size());
2334 ImageCache::ImageCacheRGB8Ptr
im8=img->get8BitImage();
2335 in.resize(
im8->size());
2339 if (!img->iccProfile->empty())
2343 if (!
progress.updateDisplayValue())
2381 double x =
it->second.error;
2386 var = var / (
n - 1);
2413 m_actionButton->SetToolTip(
_(
"Create control points for image pair with currently selected control point detector on photos tab."));
2424 m_actionButton->SetToolTip(
_(
"Tries to remove control points from clouds"));
2435 m_actionButton->SetToolTip(
_(
"Remove outlying control points by statistical method"));
2441 const vigra::Diff2D &
srcPnt,
2483 if (result.
x < 0 || result.
y < 0)
2537 if (result.
x < 0 || result.
y < 0)
2568 DEBUG_WARN(
"Cannot estimate position without at least one point");
2593 std::set<std::string>
opt;
2610 cp.image1Nr = left ? 0 : 1;
2611 cp.image2Nr = left ? 1 : 0;
2631 if (
t.x < 0)
t.
x = 0;
2632 if (
t.y < 0)
t.y = 0;
2633 if (
t.x >
optPano.getImage(1).getWidth())
t.x =
optPano.getImage(1).getWidth();
2634 if (
t.y >
optPano.getImage(1).getHeight())
t.y =
optPano.getImage(1).getHeight();
2645 int colNum = e.GetColumn();
2646 wxConfigBase::Get()->Write( wxString::Format(
"/CPEditorPanel/ColumnWidth%d",
colNum),
m_cpList->GetColumnWidth(
colNum) );
2651 const int newCol = e.GetColumn();
2677 while (roll > 360) roll-= 360;
2678 while (roll < 0) roll += 360;
2680 while (pitch > 180) pitch -= 360;
2681 while (pitch < -180) pitch += 360;
2682 bool headOver = (pitch > 90 || pitch < -90);
2684 if (wxConfig::Get()->Read(
"/CPEditorPanel/AutoRot",1L)) {
2685 if (roll >= 315 || roll < 45) {
2687 }
else if (roll >= 45 && roll < 135) {
2689 }
else if (roll >= 135 && roll < 225) {
2701 : wxXmlResourceHandler()
2712 GetPosition(), GetSize(),
options wxIntPtr wxIntPtr sortData
int wxCALLBACK SortIndexAscending(wxIntPtr item1, wxIntPtr item2, wxIntPtr WXUNUSED(sortData))
#define SORTDESCENDING(functionName, var)
int wxCALLBACK SortIndexDescending(wxIntPtr item1, wxIntPtr item2, wxIntPtr WXUNUSED(sortData))
#define SORTASCENDING(functionName, var)
HuginBase::SrcPanoImage GetImageRotatedTo(const HuginBase::SrcPanoImage &img, const vigra::Diff2D &point, int testWidth, double &neededHFOV)
vigra_ext::CorrelationResult PointFineTuneProjectionAware(const HuginBase::SrcPanoImage &templ, const vigra::UInt8RGBImage &templImg, vigra::Diff2D templPos, int templSize, const HuginBase::SrcPanoImage &search, const vigra::UInt8RGBImage &searchImg, vigra::Diff2D searchPos, int sWidth)
function for fine-tune with remapping to stereographic projection
vigra_ext::CorrelationResult PointFineTuneProjectionAware(const HuginBase::SrcPanoImage &templ, const vigra::UInt8RGBImage &templImg, vigra::Diff2D templPos, int templSize, const HuginBase::SrcPanoImage &search, const vigra::UInt8RGBImage &searchImg, vigra::Diff2D searchPos, int sWidth)
function for fine-tune with remapping to stereographic projection
!! from PTOptimise.h 1951
void registerPTWXDlgFcn()
void deregisterPTWXDlgFcn()
Dummy progress display, without output.
class, which stores all settings of one cp detector
void SetProg(wxString new_prog)
sets program for one step detector or feature descriptor
virtual bool CanHandle(wxXmlNode *node)
virtual wxObject * DoCreateResource()
control point editor panel.
CPImageCtrl::ImageRotation m_leftRot
HuginBase::PTools::Transform m_leftTransform
void SelectGlobalPoint(unsigned int globalNr)
Select a point.
wxChoice * m_cpModeChoice
bool globalPNr2LocalPNr(unsigned int &localNr, unsigned int globalNr) const
map a global point nr to a local one, if possible
wxCheckBox * m_showLinesCB
void OnPrevImg(wxCommandEvent &e)
void OnDeleteButton(wxCommandEvent &e)
void OnZoom(wxCommandEvent &e)
hugin_utils::FDiff2D LocalFineTunePoint(unsigned int srcNr, const vigra::Diff2D &srcPnt, hugin_utils::FDiff2D &movedSrcPnt, unsigned int moveNr, const hugin_utils::FDiff2D &movePnt)
void estimateAndAddOtherPoint(const hugin_utils::FDiff2D &p, bool left, CPImageCtrl *thisImg, unsigned int thisImgNr, CPCreationState THIS_POINT, CPCreationState THIS_POINT_RETRY, CPImageCtrl *otherImg, unsigned int otherImgNr, CPCreationState OTHER_POINT, CPCreationState OTHER_POINT_RETRY)
estimate and set point in other image
void OnActionSelectCleanCP(wxCommandEvent &e)
void CreateNewPoint()
this is used to finally create the point in the panorama model
void OnFineTuneButton(wxCommandEvent &e)
HuginBase::PTools::Transform m_leftInvTransform
CPTabActionButtonMode m_cpActionButtonMode
CPImagesComboBox * m_leftChoice
wxCheckBox * m_fineTuneCB
void OnActionButton(wxCommandEvent &e)
void OnShowLinesCheckbox(wxCommandEvent &e)
void OnKey(wxKeyEvent &e)
void OnCPListSelect(wxListEvent &e)
CPCreationState
the state machine for point selection: it is set to the current selection
@ BOTH_POINTS_SELECTED
left and right point selected, waiting for add point.
@ LEFT_POINT
point in left image selected
@ LEFT_POINT_RETRY
right point, finetune for left point failed
@ RIGHT_POINT
selected point in right image
@ RIGHT_POINT_RETRY
point in left image selected, finetune failed in right image
@ NO_POINT
no point selected
void UpdateTransforms()
updated the internal transform object for drawing line in controls
void OnCreateCPButton(wxCommandEvent &e)
virtual ~CPEditorPanel()
dtor.
hugin_utils::FDiff2D EstimatePoint(const hugin_utils::FDiff2D &p, bool left)
Estimate position of point in the other image.
void FineTuneNewPoint(bool left)
void setRightImage(unsigned int imgNr)
set right image
void panoramaImagesChanged(HuginBase::Panorama &pano, const HuginBase::UIntSet &imgNr)
notifies about changes to images
HuginBase::PTools::Transform m_rightTransform
void UpdateDisplay(bool newImages)
updates the display after another image has been selected.
void OnColumnWidthChange(wxListEvent &e)
unsigned int m_rightImageNr
wxCheckBox * m_estimateCB
CPScrollHint m_scrollHint
void Init(HuginBase::Panorama *pano)
bool Create(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxTAB_TRAVERSAL, const wxString &name="panel")
void SortList()
sorting functions
void OnNextImg(wxCommandEvent &e)
void FineTuneSelectedPoint(bool left)
void OnActionContextMenu(wxContextMenuEvent &e)
HuginBase::Panorama * m_pano
HuginBase::PTools::Transform m_leftInvTransformMag
HuginBase::PTools::Transform m_rightInvTransform
void OnActionSelectCeleste(wxCommandEvent &e)
void OnActionSelectCreate(wxCommandEvent &e)
unsigned int m_selectedPoint
void panoramaChanged(HuginBase::Panorama &pano)
called when the panorama changes and we should update our display
HuginBase::PTools::Transform m_rightInvTransformMag
bool PointFineTune(unsigned int tmplImgNr, const vigra::Diff2D &tmplPoint, int tmplWidth, unsigned int subjImgNr, const hugin_utils::FDiff2D &subjPoint, int searchWidth, vigra_ext::CorrelationResult &tunedPos)
search for region in destImg
void SelectLocalPoint(unsigned int LVpointNr, bool scrollLeft=true, bool scrollRight=true)
select a local point.
wxButton * m_prevImgButton
void OnLeftChoiceChange(wxCommandEvent &e)
const float getVerticalCPBias()
CPCreationState cpCreationState
void OnCelesteButton(wxCommandEvent &e)
void OnColumnHeaderClick(wxListEvent &e)
void EnablePointEdit(bool state)
enable or disable controls for editing other points
wxMenu * m_cpActionContextMenu
void setLeftImage(unsigned int imgNr)
set left image
void changeState(CPCreationState newState)
void OnCleanCPButton(wxCommandEvent &e)
wxButton * m_finetuneButton
std::set< unsigned int > mirroredPoints
void OnTextPointChange(wxCommandEvent &e)
void OnRightChoiceChange(wxCommandEvent &e)
wxButton * m_nextImgButton
CPImageCtrl::ImageRotation GetRot(double yaw, double roll, double pitch)
calculate rotation required for upright image display from roll, pitch and yaw angles
unsigned int m_leftImageNr
bool m_listenToPageChange
CPImageCtrl::ImageRotation m_rightRot
void NewPointChange(hugin_utils::FDiff2D p, bool left)
wxButton * m_actionButton
void ClearSelection()
unselect a point
double m_detailZoomFactor
HuginBase::PTools::Transform m_rightTransformMag
void OnCPListDeselect(wxListEvent &e)
void OnCPEvent(CPEvent &ev)
unsigned int localPNr2GlobalPNr(unsigned int localNr) const
find a local point
void OnAddButton(wxCommandEvent &e)
CPImagesComboBox * m_rightChoice
void ShowControlPoint(unsigned int cpNr)
show a control point
HuginBase::PTools::Transform m_leftTransformMag
HuginBase::CPointVector currentPoints
Events to notify about new point / region / point change.
const hugin_utils::FDiff2D & getPoint()
unsigned int getPointNr()
const HuginBase::ControlPoint & getControlPoint()
CPEventMode getMode()
accessor functions (they could check mode to see if a getXYZ() is allowed
void showSearchArea(bool show=true)
show/hide the search area rectangle
ImageRotation
image rotation.
void clearNewPoint()
clear new point
void setTransforms(HuginBase::PTools::Transform *firstTrans, HuginBase::PTools::Transform *firstInvTrans, HuginBase::PTools::Transform *secondInvTrans)
void clearCtrlPointList()
clear internal control point list
wxPoint MaxScrollDelta(wxPoint delta)
calculate maximum delta that is allowed when scrolling
void setSameImage(bool sameImage)
void Init(CPEditorPanel *parent)
void setImage(const std::string &filename, ImageRotation rot)
display img.
double getScale()
return scale factor, 0 for autoscale
hugin_utils::FDiff2D getNewPoint()
get the new point
void setCtrlPoint(const HuginBase::ControlPoint &cp, const bool mirrored)
add control piont to internal cp list
void deselect()
remove selection.
void setNewPoint(const hugin_utils::FDiff2D &p)
set new point to a specific point
void showTemplateArea(bool show=true)
void ShowLines(bool isShown)
void setScale(double factor)
set the scaling factor for cp display.
void setMagTransforms(HuginBase::PTools::Transform *magTrans, HuginBase::PTools::Transform *magInvTrans)
void ScrollDelta(const wxPoint &delta)
scroll the window by delta pixels
void selectPoint(unsigned int, bool scrollTo=true)
select a point for usage
Owner Drawn ComboBox for showing connected images on CP tab.
void SetRefImage(HuginBase::Panorama *pano, unsigned int newRefImg)
Set new reference image.
void CalcCPDistance(HuginBase::Panorama *pano)
Get maximum CP distance for all images pairs containing the reference image
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 ...
represents a control point
void mirror()
swap (image1Nr,x1,y1) with (image2Nr,x2,y2)
@ X
evaluate x, points are on a vertical line
@ Y
evaluate y, points are on a horizontal line
void setHFOV(double h, bool keepView=true)
set the horizontal field of view.
void setProjection(ProjectionFormat f)
set the Projection format and adjust the hfov/vfov if nessecary
void setHeight(unsigned int h)
set panorama height
void setWidth(unsigned int w, bool keepView=true)
set panorama width keep the HFOV, if keepView=true
unsigned int getWidth() const
PanoramaOptions::ProjectionFormat getProjection() const
ProjectionFormat
Projection of final panorama.
vigra::Size2D getSize() const
get size of output image
const VariableMap getImageVariables(unsigned int imgNr) const
Get the variables of an image.
const SrcPanoImage & getImage(std::size_t nr) const
get a panorama image, counting starts with 0
const PanoramaOptions & getOptions() const
returns the options for this panorama
int getNextCPTypeLineNumber() const
get the number of a control point
void addObserver(PanoramaObserver *o)
add a panorama observer.
SrcPanoImage getSrcImage(unsigned imgNr) const
get a description of a source image
const ControlPoint & getCtrlPoint(std::size_t nr) const
get a control point, counting starts with 0
std::size_t getNrOfCtrlPoints() const
number of control points
unsigned int addImage(const SrcPanoImage &img)
the the number for a specific image
const CPVector & getCtrlPoints() const
get all control point of this Panorama
bool removeObserver(PanoramaObserver *observer)
remove a panorama observer.
std::size_t getNrOfImages() const
number of images.
All variables of a source image.
int getWidth() const
Get the width of the image in pixels.
void setSize(vigra::Size2D val)
Set the image size in pixels.
int getHeight() const
Get the height of the image in pixels.
static MainFrame * Get()
hack.. kind of a pseudo singleton...
void RunCPGenerator(CPDetectorSetting &setting, const HuginBase::UIntSet &img)
run the cp generator with the given setting on selected images
struct celeste::svm_model * GetSVMModel()
general : Matrix3 is a class for handling 3x3 Matrix manipulation.
void SetRotationPT(double yaw, double pitch, double roll)
set rotation in panotools style, code adapted from Panotools-Script by Bruno Postle
void GetRotationPT(double &Yaw, double &Pitch, double &Roll)
GetRotation in panotools style.
void addCommand(PanoCommand *command, bool execute=true)
Adds a command to the history.
static GlobalCmdHist & getInstance()
remove several control points
Handle EVT_KILL_FOCUS and convert it to a EVT_TEXT_ENTER event.
functions to handle icc profiles in images
#define HUGIN_FT_TEMPLATE_SIZE
#define HUGIN_FT_ROTATION_START_ANGLE
#define HUGIN_FT_ROTATION_STEPS
#define HUGIN_FT_ROTATION_SEARCH
#define HUGIN_FT_CURV_THRESHOLD
#define HUGIN_FT_LOCAL_SEARCH_WIDTH
#define HUGIN_CELESTE_FILTER
#define HUGIN_FT_ROTATION_STOP_ANGLE
#define HUGIN_CELESTE_THRESHOLD
#define HUGIN_FT_SEARCH_AREA_PERCENT
#define HUGIN_FT_CORR_THRESHOLD
#define DEBUG_ASSERT(cond)
void ApplyICCProfile(ImageType &image, const vigra::ImageImportInfo::ICCProfile &iccProfile, const cmsUInt32Number imageFormat)
converts given image with iccProfile to sRGB/gray space, need to give pixel type in lcms2 format work...
std::vector< ControlPoint > CPVector
std::vector< std::set< std::string > > OptimizeVector
std::set< unsigned int > UIntSet
HuginBase::UIntSet getCelesteControlPoints(struct svm_model *model, vigra::UInt16RGBImage &input, HuginBase::CPointVector cps, int radius, float threshold, int resize_dimension, bool verbose)
bool str2double(const wxString &s, double &d)
TDiff2D< double > FDiff2D
int HuginMessageBox(const wxString &message, const wxString &caption, int style, wxWindow *parent)
std::unique_ptr< wxMessageDialogBase > MessageDialog
MessageDialog GetMessageDialog(const wxString &message, const wxString &caption, int style, wxWindow *parent)
void copyImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor src_acc, DestImageIterator dest_upperleft, DestAccessor dest_acc)
void transformImage(SrcImageIterator src_upperleft, SrcImageIterator src_lowerright, SrcAccessor src_acc, DestImageIterator dest_upperleft, DestAccessor dest_acc, const Functor &func)
void transformImage(vigra::triple< SrcImageIterator, SrcImageIterator, SrcAccessor > src, vigra::triple< DestImageIterator, DestImageIterator, DestAccessor > dest, std::pair< AlphaImageIterator, AlphaAccessor > alpha, vigra::Diff2D destUL, TRANSFORM &transform, PixelTransform &pixelTransform, bool warparound, Interpolator interpol, AppBase::ProgressDisplay *progress, bool singleThreaded=false)
Transform an image into the panorama.
CorrelationResult PointFineTuneRotSearch(const IMAGET &templImg, vigra::Diff2D templPos, int templSize, const IMAGES &searchImg, vigra::Diff2D searchPos, int sWidth, double startAngle, double stopAngle, int angleSteps)
fine tune a point with normalized cross correlation, searches x,y and phi (rotation around z)
CorrelationResult PointFineTune(const IMAGET &templImg, ACCESSORT access_t, vigra::Diff2D templPos, int templSize, const IMAGES &searchImg, ACCESSORS access_s, vigra::Diff2D searchPos, int sWidth)
fine tune a point with normalized cross correlation
include file for the hugin project
include file for the hugin project
bool set_contains(const _Container &c, const typename _Container::key_type &key)
const Map::mapped_type & const_map_get(const Map &m, const typename Map::key_type &key)
vigra::Diff2D toDiff2D() const
Maximum of correlation, position and value.
hugin_utils::FDiff2D corrPos
hugin_utils::FDiff2D curv
hugin_utils::FDiff2D maxpos
std::vector< deghosting::BImagePtr > threshold(const std::vector< deghosting::FImagePtr > &inputImages, const double threshold, const uint16_t flags)
Threshold function used for creating alpha masks for images.
wxwindows specific panorama commands