ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvCamSensorProjectionDlg.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 // local
12 
13 // CV_DB_LIB
14 #include <ecvCameraSensor.h>
15 
17  : QDialog(parent), Ui::CamSensorProjectDialog() {
18  setupUi(this);
19 
20  posXEdit->setValidator(new ccCustomDoubleValidator(this));
21  posYEdit->setValidator(new ccCustomDoubleValidator(this));
22  posZEdit->setValidator(new ccCustomDoubleValidator(this));
23 
24  x1rot->setValidator(new ccCustomDoubleValidator(this));
25  x2rot->setValidator(new ccCustomDoubleValidator(this));
26  x3rot->setValidator(new ccCustomDoubleValidator(this));
27  y1rot->setValidator(new ccCustomDoubleValidator(this));
28  y2rot->setValidator(new ccCustomDoubleValidator(this));
29  y3rot->setValidator(new ccCustomDoubleValidator(this));
30  z1rot->setValidator(new ccCustomDoubleValidator(this));
31  z2rot->setValidator(new ccCustomDoubleValidator(this));
32  z3rot->setValidator(new ccCustomDoubleValidator(this));
33 }
34 
36  if (!sensor) return;
37 
38  const int precision = sizeof(PointCoordinateType) == 8 ? 12 : 8;
39 
40  /*** Position + Orientation ***/
41  {
42  // center
43  const float* C = sensor->getRigidTransformation().getTranslation();
44  posXEdit->setText(QString::number(C[0], 'f', precision));
45  posYEdit->setText(QString::number(C[1], 'f', precision));
46  posZEdit->setText(QString::number(C[2], 'f', precision));
47 
48  // rotation matrix
49  const ccGLMatrix& rot = sensor->getRigidTransformation();
50  {
51  const float* mat = rot.data();
52  x1rot->setText(QString::number(mat[0], 'f', precision));
53  y1rot->setText(QString::number(mat[1], 'f', precision));
54  z1rot->setText(QString::number(mat[2], 'f', precision));
55 
56  x2rot->setText(QString::number(mat[4], 'f', precision));
57  y2rot->setText(QString::number(mat[5], 'f', precision));
58  z2rot->setText(QString::number(mat[6], 'f', precision));
59 
60  x3rot->setText(QString::number(mat[8], 'f', precision));
61  y3rot->setText(QString::number(mat[9], 'f', precision));
62  z3rot->setText(QString::number(mat[10], 'f', precision));
63  }
64  }
65 
66  /*** Intrinsic parameters ***/
67  {
69  sensor->getIntrinsicParameters();
70 
71  focalDoubleSpinBox->setValue(iParams.vertFocal_pix);
72  fovDoubleSpinBox->setValue(
74  arrayWSpinBox->setValue(iParams.arrayWidth);
75  arrayHSpinBox->setValue(iParams.arrayHeight);
76  pixWDoubleSpinBox->setValue(iParams.pixelSize_mm[0]);
77  pixHDoubleSpinBox->setValue(iParams.pixelSize_mm[1]);
78  zNearDoubleSpinBox->setValue(iParams.zNear_mm);
79  zFarDoubleSpinBox->setValue(iParams.zFar_mm);
80  skewDoubleSpinBox->setValue(iParams.skew);
81  cxDoubleSpinBox->setValue(iParams.principal_point[0]);
82  cyDoubleSpinBox->setValue(iParams.principal_point[1]);
83  }
84 
85  /*** Distortion / uncertainty ***/
86  {
87  QString distInfo;
89  sensor->getDistortionParameters();
90 
91  if (!distParams) {
92  distInfo = "No associated distortion /uncertainty model.";
93  } else if (distParams->getModel() ==
97  distParams.data());
98  distInfo = "Radial distortion model:\n";
99  distInfo += QString("k1 = %1\n").arg(rdParams->k1);
100  distInfo += QString("k2 = %1\n").arg(rdParams->k2);
101  } else if (distParams->getModel() == ccCameraSensor::BROWN_DISTORTION) {
104  distParams.data());
105  distInfo = "Brown distortion / uncertainty model:\n";
106  distInfo += "* Radial distortion:\n";
107  distInfo += QString("\tK1 = %1\n").arg(bParams->K_BrownParams[0]);
108  distInfo += QString("\tK2 = %1\n").arg(bParams->K_BrownParams[1]);
109  distInfo += QString("\tK3 = %1\n").arg(bParams->K_BrownParams[2]);
110  distInfo += "* Tangential distortion:\n";
111  distInfo += QString("\tP1 = %1\n").arg(bParams->P_BrownParams[0]);
112  distInfo += QString("\tP2 = %1\n").arg(bParams->P_BrownParams[1]);
113  distInfo += "* Linear disparity:\n";
114  distInfo += QString("\tA = %1\n")
115  .arg(bParams->linearDisparityParams[0]);
116  distInfo += QString("\tB = %1\n")
117  .arg(bParams->linearDisparityParams[1]);
118  distInfo += "* Principal point offset:\n";
119  distInfo +=
120  QString("\tX = %1\n").arg(bParams->principalPointOffset[0]);
121  distInfo +=
122  QString("\tY = %1\n").arg(bParams->principalPointOffset[1]);
123  } else {
124  assert(false);
125  distInfo = "Unhandled distortion /uncertainty model!";
126  }
127 
128  distInfoTextEdit->setText(distInfo);
129  }
130 }
131 
133  if (!sensor) return;
134 
135  /*** Position + Orientation ***/
136  {
137  // orientation matrix
138  ccGLMatrix rot;
139  {
140  float* mat = rot.data();
141  mat[0] = x1rot->text().toFloat();
142  mat[1] = y1rot->text().toFloat();
143  mat[2] = z1rot->text().toFloat();
144 
145  mat[4] = x2rot->text().toFloat();
146  mat[5] = y2rot->text().toFloat();
147  mat[6] = z2rot->text().toFloat();
148 
149  mat[8] = x3rot->text().toFloat();
150  mat[9] = y3rot->text().toFloat();
151  mat[10] = z3rot->text().toFloat();
152  }
153 
154  // center
155  CCVector3 C(
156  static_cast<PointCoordinateType>(posXEdit->text().toDouble()),
157  static_cast<PointCoordinateType>(posYEdit->text().toDouble()),
158  static_cast<PointCoordinateType>(posZEdit->text().toDouble()));
159  rot.setTranslation(C);
160 
161  sensor->setRigidTransformation(rot);
162  }
163 
164  /*** Intrinsic parameters ***/
165  {
167 
168  iParams.vertFocal_pix = static_cast<float>(focalDoubleSpinBox->value());
169  iParams.vFOV_rad = static_cast<float>(
170  cloudViewer::DegreesToRadians(fovDoubleSpinBox->value()));
171  iParams.arrayWidth = arrayWSpinBox->value();
172  iParams.arrayHeight = arrayHSpinBox->value();
173  iParams.pixelSize_mm[0] =
174  static_cast<float>(pixWDoubleSpinBox->value());
175  iParams.pixelSize_mm[1] =
176  static_cast<float>(pixHDoubleSpinBox->value());
177  iParams.zNear_mm = static_cast<float>(zNearDoubleSpinBox->value());
178  iParams.zFar_mm = static_cast<float>(zFarDoubleSpinBox->value());
179  iParams.skew = static_cast<float>(skewDoubleSpinBox->value());
180  iParams.principal_point[0] =
181  static_cast<float>(cxDoubleSpinBox->value());
182  iParams.principal_point[1] =
183  static_cast<float>(cyDoubleSpinBox->value());
184 
185  sensor->setIntrinsicParameters(iParams);
186  }
187 
188  /*** Distortion / uncertainty ***/
189 
190  // read only for now
191 }
float PointCoordinateType
Type of the coordinates of a (N-D) point.
Definition: CVTypes.h:16
ccCamSensorProjectionDlg(QWidget *parent=0)
Default constructor.
void updateCamSensor(ccCameraSensor *sensor)
void initWithCamSensor(const ccCameraSensor *sensor)
Camera (projective) sensor.
void setIntrinsicParameters(const IntrinsicParameters &params)
Sets intrinsic parameters.
const IntrinsicParameters & getIntrinsicParameters() const
Returns intrinsic parameters.
const LensDistortionParameters::Shared & getDistortionParameters() const
Returns uncertainty parameters.
T * getTranslation()
Retruns a pointer to internal translation.
T * data()
Returns a pointer to internal data.
void setTranslation(const Vector3Tpl< float > &Tr)
Sets translation (float version)
Float version of ccGLMatrixTpl.
Definition: ecvGLMatrix.h:19
virtual ccGLMatrix & getRigidTransformation()
Definition: ecvSensor.h:105
virtual void setRigidTransformation(const ccGLMatrix &mat)
Definition: ecvSensor.h:99
float RadiansToDegrees(int radians)
Convert radians to degrees.
Definition: CVMath.h:71
float DegreesToRadians(int degrees)
Convert degrees to radians.
Definition: CVMath.h:98
Brown's distortion model + Linear Disparity.
Intrinsic parameters of the camera sensor.
QSharedPointer< LensDistortionParameters > Shared
Shared pointer type.
Simple radial distortion model.
float k2
2nd radial distortion coefficient
float k1
1st radial distortion coefficient