ccCamSensorProjectionDlg.cpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //##########################################################################
  2. //# #
  3. //# CLOUDCOMPARE #
  4. //# #
  5. //# This program is free software; you can redistribute it and/or modify #
  6. //# it under the terms of the GNU General Public License as published by #
  7. //# the Free Software Foundation; version 2 or later of the License. #
  8. //# #
  9. //# This program is distributed in the hope that it will be useful, #
  10. //# but WITHOUT ANY WARRANTY; without even the implied warranty of #
  11. //# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
  12. //# GNU General Public License for more details. #
  13. //# #
  14. //# COPYRIGHT: EDF R&D / TELECOM ParisTech (ENST-TSI) #
  15. //# #
  16. //##########################################################################
  17. #include "ccCamSensorProjectionDlg.h"
  18. //local
  19. #include "ccCustomDoubleValidator.h"
  20. //qCC_db
  21. #include <ccCameraSensor.h>
  22. //persistent parameters
  23. static bool s_inCameraCS = true;
  24. ccCamSensorProjectionDlg::ccCamSensorProjectionDlg(QWidget* parent)
  25. : QDialog(parent)
  26. , Ui::CamSensorProjectDialog()
  27. {
  28. setupUi(this);
  29. posXEdit->setValidator(new ccCustomDoubleValidator(this));
  30. posYEdit->setValidator(new ccCustomDoubleValidator(this));
  31. posZEdit->setValidator(new ccCustomDoubleValidator(this));
  32. x1rot->setValidator(new ccCustomDoubleValidator(this));
  33. x2rot->setValidator(new ccCustomDoubleValidator(this));
  34. x3rot->setValidator(new ccCustomDoubleValidator(this));
  35. y1rot->setValidator(new ccCustomDoubleValidator(this));
  36. y2rot->setValidator(new ccCustomDoubleValidator(this));
  37. y3rot->setValidator(new ccCustomDoubleValidator(this));
  38. z1rot->setValidator(new ccCustomDoubleValidator(this));
  39. z2rot->setValidator(new ccCustomDoubleValidator(this));
  40. z3rot->setValidator(new ccCustomDoubleValidator(this));
  41. inWorldCSCheckBox->setChecked(s_inCameraCS);
  42. }
  43. void ccCamSensorProjectionDlg::initWithCamSensor(const ccCameraSensor* sensor)
  44. {
  45. if( !sensor)
  46. return;
  47. const int precision = sizeof(PointCoordinateType) == 8 ? 12 : 8;
  48. /*** Position + Orientation ***/
  49. {
  50. //center
  51. const ccGLMatrix& mat = sensor->getRigidTransformation();
  52. CCVector3d C = mat.getTranslationAsVec3D();
  53. if (inWorldCSCheckBox->isChecked())
  54. {
  55. mat.applyRotation(C);
  56. }
  57. posXEdit->setText(QString::number(C.x, 'f', precision));
  58. posYEdit->setText(QString::number(C.y, 'f', precision));
  59. posZEdit->setText(QString::number(C.z, 'f', precision));
  60. //rotation matrix
  61. const ccGLMatrix& rot = sensor->getRigidTransformation();
  62. {
  63. const float* mat = rot.data();
  64. x1rot->setText(QString::number(mat[0], 'f', precision));
  65. y1rot->setText(QString::number(mat[1], 'f', precision));
  66. z1rot->setText(QString::number(mat[2], 'f', precision));
  67. x2rot->setText(QString::number(mat[4], 'f', precision));
  68. y2rot->setText(QString::number(mat[5], 'f', precision));
  69. z2rot->setText(QString::number(mat[6], 'f', precision));
  70. x3rot->setText(QString::number(mat[8], 'f', precision));
  71. y3rot->setText(QString::number(mat[9], 'f', precision));
  72. z3rot->setText(QString::number(mat[10], 'f', precision));
  73. }
  74. }
  75. /*** Intrinsic parameters ***/
  76. {
  77. const ccCameraSensor::IntrinsicParameters& iParams = sensor->getIntrinsicParameters();
  78. focalDoubleSpinBox->setValue(iParams.vertFocal_pix);
  79. fovDoubleSpinBox->setValue(CCCoreLib::RadiansToDegrees(iParams.vFOV_rad));
  80. arrayWSpinBox->setValue(iParams.arrayWidth);
  81. arrayHSpinBox->setValue(iParams.arrayHeight);
  82. pixWDoubleSpinBox->setValue(iParams.pixelSize_mm[0]);
  83. pixHDoubleSpinBox->setValue(iParams.pixelSize_mm[1]);
  84. zNearDoubleSpinBox->setValue(iParams.zNear_mm);
  85. zFarDoubleSpinBox->setValue(iParams.zFar_mm);
  86. skewDoubleSpinBox->setValue(iParams.skew);
  87. cxDoubleSpinBox->setValue(iParams.principal_point[0]);
  88. cyDoubleSpinBox->setValue(iParams.principal_point[1]);
  89. }
  90. /*** Distortion / uncertainty ***/
  91. {
  92. QString distInfo;
  93. const ccCameraSensor::LensDistortionParameters::Shared& distParams = sensor->getDistortionParameters();
  94. if (!distParams)
  95. {
  96. distInfo = "No associated distortion /uncertainty model.";
  97. }
  98. else if (distParams->getModel() == ccCameraSensor::SIMPLE_RADIAL_DISTORTION)
  99. {
  100. const ccCameraSensor::RadialDistortionParameters* rdParams = static_cast<ccCameraSensor::RadialDistortionParameters*>(distParams.data());
  101. distInfo = "Radial distortion model:\n";
  102. distInfo += QString("k1 = %1\n").arg(rdParams->k1);
  103. distInfo += QString("k2 = %1\n").arg(rdParams->k2);
  104. }
  105. else if (distParams->getModel() == ccCameraSensor::BROWN_DISTORTION)
  106. {
  107. const ccCameraSensor::BrownDistortionParameters* bParams = static_cast<ccCameraSensor::BrownDistortionParameters*>(distParams.data());
  108. distInfo = "Brown distortion / uncertainty model:\n";
  109. distInfo += "* Radial distortion:\n";
  110. distInfo += QString("\tK1 = %1\n").arg(bParams->K_BrownParams[0]);
  111. distInfo += QString("\tK2 = %1\n").arg(bParams->K_BrownParams[1]);
  112. distInfo += QString("\tK3 = %1\n").arg(bParams->K_BrownParams[2]);
  113. distInfo += "* Tangential distortion:\n";
  114. distInfo += QString("\tP1 = %1\n").arg(bParams->P_BrownParams[0]);
  115. distInfo += QString("\tP2 = %1\n").arg(bParams->P_BrownParams[1]);
  116. distInfo += "* Linear disparity:\n";
  117. distInfo += QString("\tA = %1\n").arg(bParams->linearDisparityParams[0]);
  118. distInfo += QString("\tB = %1\n").arg(bParams->linearDisparityParams[1]);
  119. distInfo += "* Principal point offset:\n";
  120. distInfo += QString("\tX = %1\n").arg(bParams->principalPointOffset[0]);
  121. distInfo += QString("\tY = %1\n").arg(bParams->principalPointOffset[1]);
  122. }
  123. else
  124. {
  125. assert(false);
  126. distInfo = "Unhandled distortion /uncertainty model!";
  127. }
  128. distInfoTextEdit->setText(distInfo);
  129. }
  130. }
  131. void ccCamSensorProjectionDlg::updateCamSensor(ccCameraSensor* sensor)
  132. {
  133. if (!sensor)
  134. return;
  135. /*** Position + Orientation ***/
  136. {
  137. //orientation matrix
  138. ccGLMatrixd rot;
  139. {
  140. double* mat = rot.data();
  141. mat[0] = x1rot->text().toDouble();
  142. mat[1] = y1rot->text().toDouble();
  143. mat[2] = z1rot->text().toDouble();
  144. mat[4] = x2rot->text().toDouble();
  145. mat[5] = y2rot->text().toDouble();
  146. mat[6] = z2rot->text().toDouble();
  147. mat[8] = x3rot->text().toDouble();
  148. mat[9] = y3rot->text().toDouble();
  149. mat[10] = z3rot->text().toDouble();
  150. }
  151. //center
  152. CCVector3d C(static_cast<PointCoordinateType>(posXEdit->text().toDouble()),
  153. static_cast<PointCoordinateType>(posYEdit->text().toDouble()),
  154. static_cast<PointCoordinateType>(posZEdit->text().toDouble()));
  155. if (inWorldCSCheckBox->isChecked())
  156. {
  157. rot.inverse().apply(C);
  158. }
  159. rot.setTranslation(C);
  160. sensor->setRigidTransformation(ccGLMatrix(rot.data()));
  161. }
  162. /*** Intrinsic parameters ***/
  163. {
  164. ccCameraSensor::IntrinsicParameters iParams;
  165. iParams.vertFocal_pix = static_cast<float>(focalDoubleSpinBox->value());
  166. iParams.vFOV_rad = static_cast<float>( CCCoreLib::DegreesToRadians( fovDoubleSpinBox->value() ) );
  167. iParams.arrayWidth = arrayWSpinBox->value();
  168. iParams.arrayHeight = arrayHSpinBox->value();
  169. iParams.pixelSize_mm[0] = static_cast<float>(pixWDoubleSpinBox->value());
  170. iParams.pixelSize_mm[1] = static_cast<float>(pixHDoubleSpinBox->value());
  171. iParams.zNear_mm = static_cast<float>(zNearDoubleSpinBox->value());
  172. iParams.zFar_mm = static_cast<float>(zFarDoubleSpinBox->value());
  173. iParams.skew = static_cast<float>(skewDoubleSpinBox->value());
  174. iParams.principal_point[0] = static_cast<float>(cxDoubleSpinBox->value());
  175. iParams.principal_point[1] = static_cast<float>(cyDoubleSpinBox->value());
  176. sensor->setIntrinsicParameters(iParams);
  177. }
  178. /*** Distortion / uncertainty ***/
  179. //read only for now
  180. //it's a good time to save the persistent parameter(s)
  181. s_inCameraCS = inWorldCSCheckBox->isChecked();
  182. }