36 #include <QPushButton>
37 #include <QTextStream>
38 #include <QFileDialog>
39 #include <QMessageBox>
58 BaseWidget(parent,
"LapFrameToolCalibrationWidget",
"LapFrame Calibrate"),
60 mCalibrateButton(new QPushButton(
"Calibrate")),
61 mReferencePointLabel(new QLabel(
"Ref. point:")),
62 mTestButton(new QPushButton(
"Test calibration")),
63 mCalibrationLabel(new QLabel(
"Calibration: \n")),
64 mDeltaLabel(new QLabel(
"Delta:"))
66 QVBoxLayout* toplayout =
new QVBoxLayout(
this);
69 "Additional tilt of calibration around tool y-axis,\nfor use with cameras tilted relative to tool direction",
71 mCameraAngleAdapter->setInternal2Display(180.0/
M_PI);
74 mCalibRefTool->setValueName(
"Calibration Frame");
75 mCalibRefTool->setHelp(
"Select Calibration Reference Frame");
78 mCalibratingTool->setValueName(
"Tool");
79 mCalibratingTool->setHelp(
"Select which Tool to calibrate");
81 this->setToolTip(
"Calibrate tool matrix using a custom frame");
85 toplayout->addWidget(mReferencePointLabel);
89 toplayout->addWidget(mCalibrateButton);
90 toplayout->addWidget(mCalibrationLabel);
92 toplayout->addWidget(mTestButton);
93 toplayout->addWidget(mDeltaLabel);
94 toplayout->addStretch();
96 mReferencePointLabel->setText(
"<i> Use only with the special Laparascopic <br>"
97 "calibration frame as reference. </i>");
99 connect(mCalibrateButton, SIGNAL(clicked()),
this, SLOT(calibrateSlot()));
100 connect(mTestButton, SIGNAL(clicked()),
this, SLOT(testCalibrationSlot()));
102 connect(mCalibRefTool.get(), SIGNAL(changed()),
this, SLOT(toolSelectedSlot()));
105 this->toolSelectedSlot();
113 void LapFrameToolCalibrationWidget::calibrateSlot()
115 ToolPtr refTool = mCalibRefTool->getTool();
116 ToolPtr tool = mCalibratingTool->getTool();
117 double cameraAngle = mCameraAngleAdapter->getValue();
118 if(!refTool || !tool)
120 reportError(QString(
"Calibration prerequisited not met: calref:%1, tool:%2").arg(refTool!=0).arg(tool!=0) );
123 if(!refTool->getVisible() || !tool->getVisible() || !refTool->hasReferencePointWithId(1))
125 reportError(QString(
"Calibration prerequisited not met: calref vis:%1, tool vis :%2, refpoint:%3").arg(refTool->getVisible()).arg(tool->getVisible()).arg(refTool->hasReferencePointWithId(1)) );
129 LapFrameToolCalibrationCalculator calc(tool, refTool, cameraAngle);
130 Transform3D calibration = calc.get_calibration_sMt();
133 msgBox.setText(
"Do you want to overwrite "+tool->getName()+
"'s calibration file?");
134 msgBox.setInformativeText(
"This cannot be undone.");
135 msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
136 msgBox.setDefaultButton(QMessageBox::Ok);
137 int ret = msgBox.exec();
139 if(ret == QMessageBox::Ok)
141 tool->setCalibration_sMt(calibration);
144 mCalibrationLabel->setText(QString(
"Calibration matrix for %1:\n%2").arg(tool->getName(),
qstring_cast(calibration)));
148 void LapFrameToolCalibrationWidget::testCalibrationSlot()
150 ToolPtr refTool = mCalibRefTool->getTool();
151 ToolPtr tool = mCalibratingTool->getTool();
152 double cameraAngle = mCameraAngleAdapter->getValue();
154 if(!refTool || !tool || !refTool->hasReferencePointWithId(1))
157 LapFrameToolCalibrationCalculator calc(tool, refTool, cameraAngle);
158 Vector3D delta_selectedTool = calc.get_delta_ref();
160 QString delta = QString(
"%1 mm").arg(delta_selectedTool.length(), 6,
'g', 1);
161 mDeltaLabel->setText(
"<b>Delta "+tool->getName()+
":</b> "+
qstring_cast(delta_selectedTool)+
" <br> <b>Accuracy:</b> " + delta);
163 report(
"Delta "+tool->getName()+
": "+
qstring_cast(delta_selectedTool)+
" Length: "+ delta);
168 void LapFrameToolCalibrationWidget::toolSelectedSlot()
171 mCalibrateButton->setEnabled(
false);
172 mTestButton->setEnabled(
false);
174 if (mCalibRefTool->getTool())
179 mCalibrateButton->setEnabled(
true);
180 mTestButton->setEnabled(
true);
187 void LapFrameToolCalibrationWidget::trackingStartedSlot()
189 ToolPtr ref = mServices->tracking()->getTool(
"calibration_tool");
191 mCalibRefTool->setValue(ref->getUid());
202 mTool(tool), mCalibrationRef(calRef), mCameraAngle(cameraAngle)
204 m_sMpr = mTool->getCalibration_sMt() * mTool->get_prMt().inv();
211 m_qMcr = Transform3D::Identity();
212 m_qMpr = m_qMcr * mCalibrationRef->get_prMt().inv();
218 Transform3D qMpr = m_qMcr * mCalibrationRef->get_prMt().inv();
220 Vector3D calibPoint_pr = qMpr.inv().coord(p);
221 Vector3D toolPoint_pr = mTool->get_prMt().coord(p);
222 return calibPoint_pr - toolPoint_pr;
QString qstring_cast(const T &val)
Transform3D createTransformRotateY(const double angle)
void reportError(QString msg)
boost::shared_ptr< class VisServices > VisServicesPtr
Transform3D Transform3D
Transform3D is a representation of an affine 3D transform.
Utility class for describing a bounded numeric range.
Eigen::Vector3d Vector3D
Vector3D is a representation of a point or vector in 3D.
static DoublePropertyPtr initialize(const QString &uid, QString name, QString help, double value, DoubleRange range, int decimals, QDomNode root=QDomNode())
boost::shared_ptr< class Tool > ToolPtr