void ccPointPairRegistrationDlg::updateAlignInfo() { //reset title resetTitle(); CCLib::PointProjectionTools::Transformation trans; double rms; if ( m_alignedPoints.size() == m_refPoints.size() && m_refPoints.size() >= MIN_PAIRS_COUNT && callHornRegistration(trans,rms,true) ) { QString rmsString = QString("Achievable RMS: %1").arg(rms); m_associatedWin->displayNewMessage(rmsString,ccGLWindow::UPPER_CENTER_MESSAGE,true,60*60); resetToolButton->setEnabled(true); validToolButton->setEnabled(true); } else { resetToolButton->setEnabled(false); validToolButton->setEnabled(false); } m_associatedWin->redraw(); }
PreProcessingPage::PreProcessingPage(Manager* const mngr, KAssistantDialog* const dlg) : KPWizardPage(dlg, i18n("<b>Pre-Processing Images</b>")), d(new PreProcessingPagePriv) { d->mngr = mngr; d->progressTimer = new QTimer(this); KVBox* vbox = new KVBox(this); d->title = new QLabel(vbox); d->title->setWordWrap(true); d->title->setOpenExternalLinks(true); KConfig config("kipirc"); KConfigGroup group = config.group(QString("Panorama Settings")); d->celesteCheckBox = new QCheckBox(i18n("Detect moving skies"), vbox); d->celesteCheckBox->setChecked(group.readEntry("Celeste", false)); d->celesteCheckBox->setToolTip(i18n("Automatic detection of clouds to prevent wrong keypoints matching " "between images due to moving clouds.")); d->celesteCheckBox->setWhatsThis(i18n("<b>Detect moving skies</b>: During the control points selection and matching, " "this option discards any points that are associated to a possible cloud. This " "is useful to prevent moving clouds from altering the control points matching " "process.")); QLabel* space1 = new QLabel(vbox); KHBox* hbox = new KHBox(vbox); d->detailsBtn = new QPushButton(hbox); d->detailsBtn->setText(i18n("Details...")); d->detailsBtn->hide(); QLabel* space2 = new QLabel(hbox); hbox->setStretchFactor(space2, 10); QLabel* space3 = new QLabel(vbox); d->progressLabel = new QLabel(vbox); d->progressLabel->setAlignment(Qt::AlignCenter); QLabel* space4 = new QLabel(vbox); vbox->setStretchFactor(space1, 2); vbox->setStretchFactor(space3, 2); vbox->setStretchFactor(space4, 10); vbox->setSpacing(KDialog::spacingHint()); vbox->setMargin(KDialog::spacingHint()); setPageWidget(vbox); resetTitle(); QPixmap leftPix = KStandardDirs::locate("data", "kipiplugin_panorama/pics/assistant-preprocessing.png"); setLeftBottomPix(leftPix.scaledToWidth(128, Qt::SmoothTransformation)); // connect(d->mngr->thread(), SIGNAL(starting(KIPIPanoramaPlugin::ActionData)), // this, SLOT(slotAction(KIPIPanoramaPlugin::ActionData))); connect(d->progressTimer, SIGNAL(timeout()), this, SLOT(slotProgressTimerDone())); connect(d->detailsBtn, SIGNAL(clicked()), this, SLOT(slotShowDetails())); }
void PreProcessingPage::cancel() { disconnect(d->mngr->thread(), SIGNAL(finished(KIPIExpoBlendingPlugin::ActionData)), this, SLOT(slotAction(KIPIExpoBlendingPlugin::ActionData))); d->mngr->thread()->cancel(); d->progressTimer->stop(); d->progressLabel->clear(); resetTitle(); }
PreProcessingPage::PreProcessingPage(Manager* const mngr, KAssistantDialog* const dlg) : KPWizardPage(dlg, i18n("<b>Pre-Processing Bracketed Images</b>")), d(new PreProcessingPagePriv) { d->mngr = mngr; d->progressTimer = new QTimer(this); KVBox *vbox = new KVBox(this); d->title = new QLabel(vbox); d->title->setWordWrap(true); d->title->setOpenExternalLinks(true); d->alignCheckBox = new QCheckBox(i18n("Align bracketed images"), vbox); KConfig config("kipirc"); KConfigGroup group = config.group(QString("ExpoBlending Settings")); d->alignCheckBox->setChecked(group.readEntry("Auto Alignment", true)); QLabel* space1 = new QLabel(vbox); KHBox* hbox = new KHBox(vbox); d->detailsBtn = new QPushButton(hbox); d->detailsBtn->setText(i18n("Details...")); d->detailsBtn->hide(); QLabel* space2 = new QLabel(hbox); hbox->setStretchFactor(space2, 10); QLabel* space3 = new QLabel(vbox); d->progressLabel = new QLabel(vbox); d->progressLabel->setAlignment(Qt::AlignCenter); QLabel* space4 = new QLabel(vbox); vbox->setStretchFactor(space1, 2); vbox->setStretchFactor(space3, 2); vbox->setStretchFactor(space4, 10); vbox->setSpacing(KDialog::spacingHint()); vbox->setMargin(KDialog::spacingHint()); setPageWidget(vbox); resetTitle(); QPixmap leftPix = KStandardDirs::locate("data", "kipiplugin_expoblending/pics/assistant-preprocessing.png"); setLeftBottomPix(leftPix.scaledToWidth(128, Qt::SmoothTransformation)); connect(d->mngr->thread(), SIGNAL(starting(KIPIExpoBlendingPlugin::ActionData)), this, SLOT(slotAction(KIPIExpoBlendingPlugin::ActionData))); connect(d->progressTimer, SIGNAL(timeout()), this, SLOT(slotProgressTimerDone())); connect(d->detailsBtn, SIGNAL(clicked()), this, SLOT(slotShowDetails())); }
bool OptimizePage::cancel() { d->canceled = true; disconnect(d->mngr->thread(), SIGNAL(finished(KIPIPanoramaPlugin::ActionData)), this, SLOT(slotAction(KIPIPanoramaPlugin::ActionData))); d->mngr->thread()->cancel(); QMutexLocker lock(&d->progressMutex); if (d->progressTimer->isActive()) { d->progressTimer->stop(); d->progressLabel->clear(); resetTitle(); return false; } return true; }
bool ccPointPairRegistrationDlg::init( ccGLWindow* win, ccHObject* aligned, ccHObject* reference/*=0*/) { assert(win); assert(aligned); clear(); if (!aligned) { ccLog::Error("[PointPairRegistration] Need an aligned entity at least!"); return false; } //create dedicated 3D view if (!m_associatedWin) { //import GL filter so as to get the same rendering aspect! { ccGenericGLDisplay* sourceDisplay = aligned->getDisplay(); if (!sourceDisplay && reference) sourceDisplay = reference->getDisplay(); if (sourceDisplay) { ccGlFilter* filter = static_cast<ccGLWindow*>(sourceDisplay)->getGlFilter(); if (filter) win->setGlFilter(filter->clone()); } } linkWith(win); assert(m_associatedWin); } m_aligned = EntityContext(aligned); m_reference = EntityContext(reference); //add aligned entity to display ccViewportParameters originViewportParams; bool hasOriginViewportParams = false; if (aligned) { if (aligned->getDisplay()) { hasOriginViewportParams = true; originViewportParams = aligned->getDisplay()->getViewportParameters(); } //DGM: it's already in the global DB! //m_associatedWin->addToOwnDB(aligned); aligned->setDisplay(m_associatedWin); aligned->setVisible(true); aligned->setSelected(false); SetEnabled_recursive(aligned); //SetVisible_recursive(aligned); } //add reference entity (if any) to display if (reference) { if (!hasOriginViewportParams && reference->getDisplay()) { hasOriginViewportParams = true; originViewportParams = reference->getDisplay()->getViewportParameters(); } //DGM: it's already in the global DB! //m_associatedWin->addToOwnDB(reference); reference->setDisplay(m_associatedWin); reference->setVisible(true); reference->setSelected(false); SetEnabled_recursive(reference); //SetVisible_recursive(reference); } showReferenceCheckBox->setChecked(reference != 0); showReferenceCheckBox->setEnabled(reference != 0); showAlignedCheckBox->setChecked(true); m_associatedWin->showMaximized(); resetTitle(); if (hasOriginViewportParams) { m_associatedWin->setViewportParameters(originViewportParams); m_associatedWin->redraw(); } else { m_associatedWin->zoomGlobal(); m_associatedWin->redraw(); //already called by zoomGlobal } onPointCountChanged(); return true; }
void ccPointPairRegistrationDlg::align() { CCLib::PointProjectionTools::Transformation trans; double rms; //reset title resetTitle(); m_associatedWin->refresh(true); if (callHornRegistration(trans,rms,true)) { if (rms >= 0) { QString rmsString = QString("Current RMS: %1").arg(rms); ccLog::Print(QString("[PointPairRegistration] ")+rmsString); m_associatedWin->displayNewMessage(rmsString,ccGLWindow::UPPER_CENTER_MESSAGE,true,60*60); } else { ccLog::Warning("[PointPairRegistration] Internal error (negative RMS?!)"); return; } //apply (scaled) transformation (if not fixed) bool adjustScale = adjustScaleCheckBox->isChecked(); if (adjustScale) { if (trans.R.isValid()) trans.R.scale(trans.s); QString scaleString = QString("Scale: %1").arg(trans.s); ccLog::Print(QString("[PointPairRegistration] ")+scaleString); } else { ccLog::Print(QString("[PointPairRegistration] Scale: fixed (1.0)")); } ccGLMatrix transMat = FromCCLibMatrix<PointCoordinateType,float>(trans.R,trans.T); //...virtually m_aligned.entity->setGLTransformation(transMat); m_alignedPoints.setGLTransformation(transMat); //DGM: we have to 'counter-scale' the markers (otherwise they might appear very big or very small!) for (unsigned i=0; i<m_alignedPoints.getChildrenNumber(); ++i) { ccHObject* child = m_alignedPoints.getChild(i); if (child->isA(CC_TYPES::LABEL_2D)) { static_cast<cc2DLabel*>(child)->setRelativeMarkerScale(1.0f/static_cast<float>(trans.s)); } } //force clouds visibility { //we don't want the window zoom to change or the window to be be redrawn ccGLWindow* associatedWin = 0; std::swap(m_associatedWin,associatedWin); if (!showAlignedCheckBox->isChecked()) showAlignedCheckBox->setChecked(true); if (!showReferenceCheckBox->isChecked()) showReferenceCheckBox->setChecked(true); //restore window ref std::swap(m_associatedWin,associatedWin); } if (m_associatedWin) { if (autoZoomCheckBox->isChecked()) m_associatedWin->zoomGlobal(); m_associatedWin->redraw(); } resetToolButton->setEnabled(true); validToolButton->setEnabled(true); } }
OptimizePage::OptimizePage(Manager* const mngr, KAssistantDialog* const dlg) : KPWizardPage(dlg, i18n("<b>Optimization</b>")), d(new OptimizePagePriv) { d->mngr = mngr; KVBox* vbox = new KVBox(this); d->progressTimer = new QTimer(this); d->title = new QLabel(vbox); d->title->setOpenExternalLinks(true); d->title->setWordWrap(true); KConfig config("kipirc"); KConfigGroup group = config.group(QString("Panorama Settings")); d->horizonCheckbox = new QCheckBox(i18n("Level horizon"), vbox); d->horizonCheckbox->setChecked(group.readEntry("Horizon", true)); d->horizonCheckbox->setToolTip(i18n("Detect the horizon and adapt the project to make it horizontal.")); d->horizonCheckbox->setWhatsThis(i18n("<b>Level horizon</b>: Detect the horizon and adapt the projection so that " "the detected horizon is an horizontal line in the final panorama")); d->projectionAndSizeCheckbox = new QCheckBox(i18n("Automatic projection and crop"), vbox); d->projectionAndSizeCheckbox->setChecked(group.readEntry("Output Projection And Size", true)); d->projectionAndSizeCheckbox->setToolTip(i18n("Adapt the projection of the panorama and the cropping on the resulting " "projection so that every photo fits in the resulting panorama.")); d->projectionAndSizeCheckbox->setWhatsThis(i18n("<b>Automatic projection and crop</b>: Automatically adapt the projection " "and the crop of the panorama to get every photos into the panorama.")); d->preprocessResults = new QLabel(vbox); QLabel* space1 = new QLabel(vbox); vbox->setStretchFactor(space1, 2); KHBox* hbox = new KHBox(vbox); d->detailsBtn = new QPushButton(hbox); d->detailsBtn->setText(i18n("Details...")); d->detailsBtn->hide(); QLabel* space2 = new QLabel(hbox); hbox->setStretchFactor(space2, 10); QLabel* space3 = new QLabel(vbox); vbox->setStretchFactor(space3, 2); d->progressLabel = new QLabel(vbox); d->progressLabel->setAlignment(Qt::AlignCenter); QLabel* space4 = new QLabel(vbox); vbox->setStretchFactor(space4, 10); vbox->setSpacing(KDialog::spacingHint()); vbox->setMargin(KDialog::spacingHint()); setPageWidget(vbox); resetTitle(); QPixmap leftPix = KStandardDirs::locate("data", "kipiplugin_panorama/pics/assistant-hugin.png"); setLeftBottomPix(leftPix.scaledToWidth(128, Qt::SmoothTransformation)); // connect(d->mngr->thread(), SIGNAL(starting(KIPIPanoramaPlugin::ActionData)), // this, SLOT(slotAction(KIPIPanoramaPlugin::ActionData))); connect(d->progressTimer, SIGNAL(timeout()), this, SLOT(slotProgressTimerDone())); connect(d->detailsBtn, SIGNAL(clicked()), this, SLOT(slotShowDetails())); }
void OptimizePage::resetPage() { d->canceled = false; resetTitle(); }
void PreProcessingPage::resetPage() { d->canceled = false; resetTitle(); }