11 #include "ui_alignDlg.h"
31 : QDialog(parent, Qt::Tool), m_ui(new
Ui::AlignDialog) {
34 m_ui->samplingMethod->addItem(
"None");
35 m_ui->samplingMethod->addItem(
"Random");
36 m_ui->samplingMethod->addItem(
"Space");
37 m_ui->samplingMethod->addItem(
"Octree");
38 m_ui->samplingMethod->setCurrentIndex(
NONE);
50 connect(
m_ui->swapButton, &QPushButton::clicked,
this,
52 connect(
m_ui->modelSample, &QSlider::sliderReleased,
this,
54 connect(
m_ui->dataSample, &QSlider::sliderReleased,
this,
56 connect(
m_ui->deltaEstimation, &QPushButton::clicked,
this,
58 connect(
m_ui->isNbCandLimited, &QCheckBox::toggled,
this,
60 connect(
m_ui->samplingMethod,
61 static_cast<void (QComboBox::*)(
int)
>(
62 &QComboBox::currentIndexChanged),
64 connect(
m_ui->dataSamplingRate,
65 static_cast<void (QDoubleSpinBox::*)(
double)
>(
66 &QDoubleSpinBox::valueChanged),
68 connect(
m_ui->modelSamplingRate,
69 static_cast<void (QDoubleSpinBox::*)(
double)
>(
70 &QDoubleSpinBox::valueChanged),
94 return m_ui->isNbCandLimited->isChecked();
98 return m_ui->nbMaxCandidates->value();
112 m_ui->modelSamplingRate->value()),
120 static_cast<unsigned char>(
121 m_ui->modelSamplingRate->value()),
123 NEAREST_POINT_TO_CELL_CENTER,
127 "[ccAlignDlg::getSampledModel] Failed to get/compute "
135 static_cast<unsigned>(
136 m_ui->modelSamplingRate->value()));
142 sampledCloud =
nullptr;
144 "[ccAlignDlg::getSampledModel] Not enough memory!");
163 m_ui->dataSamplingRate->value()),
171 static_cast<unsigned char>(
172 m_ui->dataSamplingRate->value()),
174 NEAREST_POINT_TO_CELL_CENTER,
178 "[ccAlignDlg::getSampledData] Failed to get/compute "
186 (
unsigned)(
m_ui->dataSamplingRate->value()));
192 sampledCloud =
nullptr;
193 CVLog::Error(
"[ccAlignDlg::getSampledData] Not enough memory!");
223 double rate =
static_cast<double>(
m_ui->modelSample->sliderPosition()) /
224 m_ui->modelSample->maximum();
226 rate *=
m_ui->modelSamplingRate->maximum();
227 m_ui->modelSamplingRate->setValue(rate);
232 double rate =
static_cast<double>(
m_ui->dataSample->sliderPosition()) /
233 m_ui->dataSample->maximum();
235 rate *=
m_ui->dataSamplingRate->maximum();
236 m_ui->dataSamplingRate->setValue(rate);
241 QString message(
"An error occurred");
244 float rate =
static_cast<float>(
m_ui->modelSamplingRate->value()) /
245 m_ui->modelSamplingRate->maximum();
246 if (method ==
SPACE) rate = 1.0f - rate;
247 m_ui->modelSample->setSliderPosition(
248 static_cast<int>(rate *
m_ui->modelSample->maximum()));
257 message = QString(
"distance units (%1 remaining points)")
258 .arg(tmpCloud->
size());
263 message = QString(
"remaining points (%1%)")
264 .arg(rate * 100.0f, 0,
'f', 1);
272 message = QString(
"%1 remaining points").arg(tmpCloud->
size());
279 message = QString(
"%1 remaining points").arg(remaining);
283 m_ui->modelRemaining->setText(message);
287 QString message(
"An error occurred");
290 double rate =
static_cast<float>(
m_ui->dataSamplingRate->value() /
291 m_ui->dataSamplingRate->maximum());
292 if (method ==
SPACE) rate = 1.0 - rate;
293 m_ui->dataSample->setSliderPosition(
294 static_cast<int>(rate *
m_ui->dataSample->maximum()));
303 message = QString(
"distance units (%1 remaining points)")
304 .arg(tmpCloud->
size());
309 message = QString(
"remaining points (%1%)")
310 .arg(rate * 100.0, 0,
'f', 1);
318 message = QString(
"%1 remaining points").arg(tmpCloud->
size());
325 message = QString(
"%1 remaining points").arg(remaining);
329 m_ui->dataRemaining->setText(message);
342 for (
unsigned i = 0; i < sampledData->
size(); i++)
354 double meanDensity = 0;
355 double meanSqrDensity = 0;
356 for (
unsigned i = 0; i < cloud.
size(); i++) {
358 if (value == value) {
359 meanDensity += value;
360 meanSqrDensity +=
static_cast<double>(value) * value;
366 meanDensity /=
count;
367 meanSqrDensity /=
count;
369 double dev = meanSqrDensity - (meanDensity * meanDensity);
371 m_ui->delta->setValue(meanDensity + dev);
381 m_ui->modelSamplingRate->setDecimals(4);
382 int oldSliderPos =
m_ui->modelSample->sliderPosition();
386 double dist = (bbMin - bbMax).norm();
387 m_ui->modelSamplingRate->setMaximum(
dist);
388 m_ui->modelSample->setSliderPosition(oldSliderPos);
389 m_ui->modelSamplingRate->setSingleStep(0.01);
390 m_ui->modelSamplingRate->setMinimum(0.);
394 m_ui->dataSamplingRate->setDecimals(4);
395 int oldSliderPos =
m_ui->dataSample->sliderPosition();
399 double dist = (bbMin - bbMax).norm();
400 m_ui->dataSamplingRate->setMaximum(
dist);
401 m_ui->dataSample->setSliderPosition(oldSliderPos);
402 m_ui->dataSamplingRate->setSingleStep(0.01);
403 m_ui->dataSamplingRate->setMinimum(0.);
409 m_ui->modelSamplingRate->setDecimals(0);
410 m_ui->modelSamplingRate->setMaximum(
412 m_ui->modelSamplingRate->setSingleStep(1.);
413 m_ui->modelSamplingRate->setMinimum(0.);
417 m_ui->dataSamplingRate->setDecimals(0);
418 m_ui->dataSamplingRate->setMaximum(
420 m_ui->dataSamplingRate->setSingleStep(1.);
421 m_ui->dataSamplingRate->setMinimum(0.);
428 m_ui->modelSamplingRate->setDecimals(0);
429 m_ui->modelSamplingRate->setMaximum(
static_cast<double>(
431 m_ui->modelSamplingRate->setMinimum(1.);
432 m_ui->modelSamplingRate->setSingleStep(1.);
437 m_ui->dataSamplingRate->setDecimals(0);
438 m_ui->dataSamplingRate->setMaximum(
static_cast<double>(
440 m_ui->dataSamplingRate->setMinimum(1.);
441 m_ui->dataSamplingRate->setSingleStep(1.);
447 m_ui->modelSamplingRate->setDecimals(2);
448 m_ui->modelSamplingRate->setMaximum(100.);
449 m_ui->modelSamplingRate->setSingleStep(0.01);
450 m_ui->modelSamplingRate->setMinimum(0.);
454 m_ui->dataSamplingRate->setDecimals(2);
455 m_ui->dataSamplingRate->setMaximum(100.);
456 m_ui->dataSamplingRate->setSingleStep(0.01);
457 m_ui->dataSamplingRate->setMinimum(0.);
464 m_ui->modelSample->setSliderPosition(
m_ui->modelSample->maximum());
465 m_ui->modelSample->setEnabled(
false);
466 m_ui->modelSamplingRate->setEnabled(
false);
468 m_ui->dataSample->setSliderPosition(
m_ui->dataSample->maximum());
469 m_ui->dataSample->setEnabled(
false);
470 m_ui->dataSamplingRate->setEnabled(
false);
473 m_ui->modelSample->setEnabled(
true);
474 m_ui->modelSamplingRate->setEnabled(
true);
476 m_ui->dataSample->setEnabled(
true);
477 m_ui->dataSamplingRate->setEnabled(
true);
485 m_ui->nbMaxCandidates->setEnabled(activ);
float PointCoordinateType
Type of the coordinates of a (N-D) point.
static bool Error(const char *format,...)
Display an error dialog with formatted message.
void setColorsAndLabels()
ccGenericPointCloud * dataObject
'Data' cloud (static)
void dataSliderReleased()
ccGenericPointCloud * getDataObject()
unsigned getMaxNumberOfCandidates()
cloudViewer::ReferenceCloud * getSampledModel()
CC_SAMPLING_METHOD getSamplingMethod()
ccGenericPointCloud * modelObject
'Model' cloud (static)
void modelSamplingRateChanged(double value)
void toggleNbMaxCandidates(bool activ)
cloudViewer::ReferenceCloud * getSampledData()
ccGenericPointCloud * getModelObject()
ccAlignDlg(ccGenericPointCloud *data, ccGenericPointCloud *model, QWidget *parent=nullptr)
void modelSliderReleased()
void dataSamplingRateChanged(double value)
bool isNumberOfCandidatesLimited()
void changeSamplingMethod(int index)
virtual void setTempColor(const ecvColor::Rgb &col, bool autoActivate=true)
Sets current temporary (unique)
virtual void setVisible(bool state)
Sets entity visibility.
virtual void enableTempColor(bool state)
Set temporary color activation state.
A 3D cloud interface with associated features (color, normals, octree, etc.)
virtual ccOctree::Shared computeOctree(cloudViewer::GenericProgressCallback *progressCb=nullptr, bool autoAddChild=true)
Computes the cloud octree.
virtual ccOctree::Shared getOctree() const
Returns the associated octree (if any)
virtual QString getName() const
Returns object name.
static void SetButtonColor(QAbstractButton *button, const QColor &col)
Sets a button background color.
static const int MAX_OCTREE_LEVEL
Max octree subdivision level.
virtual void getBoundingBox(CCVector3 &bbMin, CCVector3 &bbMax)=0
Returns the cloud bounding box.
virtual unsigned size() const =0
Returns the number of points.
virtual bool reserve(unsigned newCapacity)
Reserves memory for the point database.
void addPoint(const CCVector3 &P)
Adds a 3D point to the database.
unsigned size() const override
ScalarType getPointScalarValue(unsigned pointIndex) const override
bool enableScalarField() override
A very simple point cloud (no point duplication)
virtual bool addPointIndex(unsigned globalIndex)
Point global index insertion mechanism.
unsigned size() const override
Returns the number of points.
const CCVector3 * getPoint(unsigned index) const override
Returns the ith point.
Graphical progress indicator (thread-safe)
static double dist(double x1, double y1, double x2, double y2)
constexpr Rgb red(MAX, 0, 0)
constexpr Rgb yellow(MAX, MAX, 0)
void swap(cloudViewer::core::SmallVectorImpl< T > &LHS, cloudViewer::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.