Added image size to all camera calibration inputs. Memory::computeTransform() more fine tuning to know if data should be loaded from database.

This commit is contained in:
matlabbe
2016-03-10 09:07:44 -05:00
parent 609cc3dc59
commit cee9c65b06
10 changed files with 312 additions and 261 deletions
+1 -1
View File
@@ -111,7 +111,7 @@ public:
int maxGraphDepth) const; int maxGraphDepth) const;
void deleteLocation(int locationId, std::list<int> * deletedWords = 0); void deleteLocation(int locationId, std::list<int> * deletedWords = 0);
void removeLink(int idA, int idB); void removeLink(int idA, int idB);
void removeRawData(int id); void removeRawData(int id, bool image = true, bool scan = true, bool userData = true);
//getters //getters
const std::map<int, double> & getWorkingMem() const {return _workingMem;} const std::map<int, double> & getWorkingMem() const {return _workingMem;}
@@ -90,6 +90,9 @@ public:
void setName(const std::string & name); void setName(const std::string & name);
const std::string & name() const {return name_;} const std::string & name() const {return name_;}
// backward compatibility
void setImageSize(const cv::Size & size) {left_.setImageSize(size); right_.setImageSize(size);}
bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true); bool load(const std::string & directory, const std::string & cameraName, bool ignoreStereoTransform = true);
bool save(const std::string & directory, bool ignoreStereoTransform = true) const; bool save(const std::string & directory, bool ignoreStereoTransform = true) const;
+10
View File
@@ -672,6 +672,11 @@ SensorData CameraImages::captureImage()
UWARN("Directory is not set, camera must be initialized."); UWARN("Directory is not set, camera must be initialized.");
} }
if(_model.imageHeight() == 0 || _model.imageWidth() == 0)
{
_model.setImageSize(img.size());
}
SensorData data(scan, scan.empty()?0:_scanMaxPts, 0, _isDepth?cv::Mat():img, _isDepth?img:depthFromScan, _model, this->getNextSeqID(), stamp); SensorData data(scan, scan.empty()?0:_scanMaxPts, 0, _isDepth?cv::Mat():img, _isDepth?img:depthFromScan, _model, this->getNextSeqID(), stamp);
data.setGroundTruth(groundTruthPose); data.setGroundTruth(groundTruthPose);
return data; return data;
@@ -792,6 +797,11 @@ SensorData CameraVideo::captureImage()
{ {
if(_capture.read(img)) if(_capture.read(img))
{ {
if(_model.imageHeight() == 0 || _model.imageWidth() == 0)
{
_model.setImageSize(img.size());
}
if(_model.isValidForRectification() && (_src != kVideoFile || _rectifyImages)) if(_model.isValidForRectification() && (_src != kVideoFile || _rectifyImages))
{ {
img = _model.rectifyImage(img); img = _model.rectifyImage(img);
+15 -5
View File
@@ -223,7 +223,9 @@ SensorData CameraOpenni::captureImage()
1.0f/depthConstant_, //fy 1.0f/depthConstant_, //fy
float(rgb_.cols/2) - 0.5f, //cx float(rgb_.cols/2) - 0.5f, //cx
float(rgb_.rows/2) - 0.5f, //cy float(rgb_.rows/2) - 0.5f, //cy
this->getLocalTransform()); this->getLocalTransform(),
0,
rgb_.size());
data = SensorData(rgb_, depth_, model, this->getNextSeqID(), UTimer::now()); data = SensorData(rgb_, depth_, model, this->getNextSeqID(), UTimer::now());
} }
@@ -336,7 +338,9 @@ SensorData CameraOpenNICV::captureImage()
_depthFocal, //fy _depthFocal, //fy
float(rgb.cols/2) - 0.5f, //cx float(rgb.cols/2) - 0.5f, //cx
float(rgb.rows/2) - 0.5f, //cy float(rgb.rows/2) - 0.5f, //cy
this->getLocalTransform()); this->getLocalTransform(),
0,
rgb.size());
data = SensorData(rgb, depth, model, this->getNextSeqID(), UTimer::now()); data = SensorData(rgb, depth, model, this->getNextSeqID(), UTimer::now());
} }
} }
@@ -710,7 +714,9 @@ SensorData CameraOpenNI2::captureImage()
_depthFy, //fy _depthFy, //fy
float(rgb.cols/2) - 0.5f, //cx float(rgb.cols/2) - 0.5f, //cx
float(rgb.rows/2) - 0.5f, //cy float(rgb.rows/2) - 0.5f, //cy
this->getLocalTransform()); this->getLocalTransform(),
0,
rgb.size());
if(_openNI2StampsAndIDsUsed) if(_openNI2StampsAndIDsUsed)
{ {
data = SensorData(rgb, depth, model, depthFrame.getFrameIndex(), double(depthFrame.getTimestamp()) / 1000000.0); data = SensorData(rgb, depth, model, depthFrame.getFrameIndex(), double(depthFrame.getTimestamp()) / 1000000.0);
@@ -1047,7 +1053,9 @@ SensorData CameraFreenect::captureImage()
freenectDevice_->getDepthFocal(), //fy freenectDevice_->getDepthFocal(), //fy
float(rgb.cols/2) - 0.5f, //cx float(rgb.cols/2) - 0.5f, //cx
float(rgb.rows/2) - 0.5f, //cy float(rgb.rows/2) - 0.5f, //cy
this->getLocalTransform()); this->getLocalTransform(),
0,
rgb.size());
data = SensorData(rgb, depth, model, this->getNextSeqID(), UTimer::now()); data = SensorData(rgb, depth, model, this->getNextSeqID(), UTimer::now());
} }
} }
@@ -1643,7 +1651,9 @@ SensorData CameraFreenect2::captureImage()
fy, //fy fy, //fy
cx, //cx cx, //cx
cy, // cy cy, // cy
this->getLocalTransform()); this->getLocalTransform(),
0,
rgb.size());
} }
data = SensorData(rgb, depth, model, this->getNextSeqID(), stamp); data = SensorData(rgb, depth, model, this->getNextSeqID(), stamp);
+15 -2
View File
@@ -440,7 +440,8 @@ SensorData CameraStereoDC1394::captureImage()
stereoModel_.left().cx(), //cx stereoModel_.left().cx(), //cx
stereoModel_.left().cy(), //cy stereoModel_.left().cy(), //cy
stereoModel_.baseline(), stereoModel_.baseline(),
this->getLocalTransform()); this->getLocalTransform(),
left.size());
} }
data = SensorData(left, right, model, this->getNextSeqID(), UTimer::now()); data = SensorData(left, right, model, this->getNextSeqID(), UTimer::now());
} }
@@ -715,7 +716,8 @@ SensorData CameraStereoFlyCapture2::captureImage()
cx, cx,
cy, cy,
baseline, baseline,
this->getLocalTransform()); this->getLocalTransform(),
left.size());
data = SensorData(left, right, model, this->getNextSeqID(), UTimer::now()); data = SensorData(left, right, model, this->getNextSeqID(), UTimer::now());
} }
} }
@@ -892,6 +894,11 @@ SensorData CameraStereoImages::captureImage()
rightImage = stereoModel_.right().rectifyImage(rightImage); rightImage = stereoModel_.right().rectifyImage(rightImage);
} }
if(stereoModel_.left().imageHeight() == 0 || stereoModel_.left().imageWidth() == 0)
{
stereoModel_.setImageSize(leftImage.size());
}
data = SensorData(left.laserScanRaw(), left.laserScanMaxPts(), 0, leftImage, rightImage, stereoModel_, left.id()/(camera2_?1:2), left.stamp()); data = SensorData(left.laserScanRaw(), left.laserScanMaxPts(), 0, leftImage, rightImage, stereoModel_, left.id()/(camera2_?1:2), left.stamp());
data.setGroundTruth(left.groundTruth()); data.setGroundTruth(left.groundTruth());
} }
@@ -1013,6 +1020,12 @@ SensorData CameraStereoVideo::captureImage()
rightImage = rightImage.clone(); rightImage = rightImage.clone();
} }
} }
if(stereoModel_.left().imageHeight() == 0 || stereoModel_.left().imageWidth() == 0)
{
stereoModel_.setImageSize(leftImage.size());
}
data = SensorData(leftImage, rightImage, stereoModel_, this->getNextSeqID(), UTimer::now()); data = SensorData(leftImage, rightImage, stereoModel_, this->getNextSeqID(), UTimer::now());
} }
} }
+46 -16
View File
@@ -2031,15 +2031,24 @@ void Memory::removeLink(int oldId, int newId)
} }
} }
void Memory::removeRawData(int id) void Memory::removeRawData(int id, bool image, bool scan, bool userData)
{ {
Signature * s = this->_getSignature(id); Signature * s = this->_getSignature(id);
if(s) if(s)
{ {
s->sensorData().setImageRaw(cv::Mat()); if(image && (!_reextractLoopClosureFeatures || !_registrationPipeline->isImageRequired()))
s->sensorData().setDepthOrRightRaw(cv::Mat()); {
s->sensorData().setLaserScanRaw(cv::Mat(), s->sensorData().laserScanMaxPts(), s->sensorData().laserScanMaxRange()); s->sensorData().setImageRaw(cv::Mat());
s->sensorData().setUserDataRaw(cv::Mat()); s->sensorData().setDepthOrRightRaw(cv::Mat());
}
if(scan && !_registrationPipeline->isScanRequired())
{
s->sensorData().setLaserScanRaw(cv::Mat(), s->sensorData().laserScanMaxPts(), s->sensorData().laserScanMaxRange());
}
if(userData && !_registrationPipeline->isUserDataRequired())
{
s->sensorData().setUserDataRaw(cv::Mat());
}
} }
} }
@@ -2050,21 +2059,40 @@ Transform Memory::computeTransform(
Transform guess, Transform guess,
RegistrationInfo * info) RegistrationInfo * info)
{ {
const Signature * fromS = this->getSignature(fromId); Signature * fromS = this->_getSignature(fromId);
const Signature * toS = this->getSignature(toId); Signature * toS = this->_getSignature(toId);
Transform transform; Transform transform;
if(fromS && toS) if(fromS && toS)
{ {
// make sure we have all data needed // make sure we have all data needed
if((_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired()) || // load binary data from database if not in RAM (if image is already here, scan and userData should be or they are null)
(_registrationPipeline->isScanRequired()) || if((_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired() && fromS->sensorData().imageCompressed().empty()) ||
_registrationPipeline->isUserDataRequired()) (_registrationPipeline->isScanRequired() && fromS->sensorData().imageCompressed().empty() && fromS->sensorData().laserScanCompressed().empty()) ||
(_registrationPipeline->isUserDataRequired() && fromS->sensorData().imageCompressed().empty() && fromS->sensorData().userDataCompressed().empty()))
{ {
getNodeData(fromS->id(), true); getNodeData(fromS->id());
getNodeData(toS->id(), true);
} }
if((_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired() && toS->sensorData().imageCompressed().empty()) ||
(_registrationPipeline->isScanRequired() && toS->sensorData().imageCompressed().empty() && toS->sensorData().laserScanCompressed().empty()) ||
(_registrationPipeline->isUserDataRequired() && toS->sensorData().imageCompressed().empty() && toS->sensorData().userDataCompressed().empty()))
{
getNodeData(toS->id());
}
// uncompress only what we need
cv::Mat imgBuf, depthBuf, laserBuf, userBuf;
fromS->sensorData().uncompressData(
(_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired())?&imgBuf:0,
(_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired())?&depthBuf:0,
_registrationPipeline->isScanRequired()?&laserBuf:0,
_registrationPipeline->isUserDataRequired()?&userBuf:0);
toS->sensorData().uncompressData(
(_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired())?&imgBuf:0,
(_reextractLoopClosureFeatures && _registrationPipeline->isImageRequired())?&depthBuf:0,
_registrationPipeline->isScanRequired()?&laserBuf:0,
_registrationPipeline->isUserDataRequired()?&userBuf:0);
// compute transform fromId -> toId // compute transform fromId -> toId
std::vector<int> inliersV; std::vector<int> inliersV;
@@ -2171,13 +2199,13 @@ Transform Memory::computeIcpTransform(
if(fromS && toS && _dbDriver) if(fromS && toS && _dbDriver)
{ {
std::list<Signature*> depthsToLoad; std::list<Signature*> depthsToLoad;
//Depth required, if not in RAM, load it from LTM //if image is already here, scan should be or it is null
if(fromS->sensorData().depthOrRightCompressed().empty() && if(fromS->sensorData().imageCompressed().empty() &&
fromS->sensorData().laserScanCompressed().empty()) fromS->sensorData().laserScanCompressed().empty())
{ {
depthsToLoad.push_back(fromS); depthsToLoad.push_back(fromS);
} }
if(toS->sensorData().depthOrRightCompressed().empty() && if(toS->sensorData().imageCompressed().empty() &&
toS->sensorData().laserScanCompressed().empty()) toS->sensorData().laserScanCompressed().empty())
{ {
depthsToLoad.push_back(toS); depthsToLoad.push_back(toS);
@@ -2231,7 +2259,9 @@ Transform Memory::computeIcpTransformMulti(
{ {
Signature * s = _getSignature(iter->first); Signature * s = _getSignature(iter->first);
UASSERT(s != 0); UASSERT(s != 0);
if(s->sensorData().laserScanCompressed().empty()) //if image is already here, scan should be or it is null
if(s->sensorData().imageCompressed().empty() &&
s->sensorData().laserScanCompressed().empty())
{ {
depthToLoad.push_back(s); depthToLoad.push_back(s);
} }
+1 -1
View File
@@ -2315,7 +2315,7 @@ bool Rtabmap::process(
} }
if(!_rawDataKept) if(!_rawDataKept)
{ {
_memory->removeRawData(signature->id()); _memory->removeRawData(signature->id(), true, !_neighborLinkRefining && !_proximityBySpace, true);
} }
// remove last signature if the memory is not incremental or is a bad signature (if bad signatures are ignored) // remove last signature if the memory is not incremental or is a bad signature (if bad signatures are ignored)
+6 -2
View File
@@ -170,7 +170,10 @@ void CreateSimpleCalibrationDialog::saveCalibration()
ui_->doubleSpinBox_fx->value(), ui_->doubleSpinBox_fx->value(),
ui_->doubleSpinBox_fy->value(), ui_->doubleSpinBox_fy->value(),
ui_->doubleSpinBox_cx->value(), ui_->doubleSpinBox_cx->value(),
ui_->doubleSpinBox_cy->value()); ui_->doubleSpinBox_cy->value(),
Transform::getIdentity(),
0,
cv::Size(width, height));
UASSERT(modelLeft.isValidForProjection()); UASSERT(modelLeft.isValidForProjection());
} }
else else
@@ -215,7 +218,8 @@ void CreateSimpleCalibrationDialog::saveCalibration()
ui_->doubleSpinBox_cx->value(), ui_->doubleSpinBox_cx->value(),
ui_->doubleSpinBox_cy->value(), ui_->doubleSpinBox_cy->value(),
Transform::getIdentity(), Transform::getIdentity(),
ui_->doubleSpinBox_baseline->value()*-ui_->doubleSpinBox_fx->value()); ui_->doubleSpinBox_baseline->value()*-ui_->doubleSpinBox_fx->value(),
cv::Size(width, height));
UASSERT(modelRight.isValidForProjection()); UASSERT(modelRight.isValidForProjection());
stereoModel = StereoCameraModel(name.toStdString(), modelLeft, modelRight, Transform()); stereoModel = StereoCameraModel(name.toStdString(), modelLeft, modelRight, Transform());
UASSERT(stereoModel.isValidForProjection()); UASSERT(stereoModel.isValidForProjection());
+1 -1
View File
@@ -1133,7 +1133,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
_3dRenderingDecimation[i]->setValue(8); _3dRenderingDecimation[i]->setValue(8);
_3dRenderingMaxDepth[i]->setValue(0.0); _3dRenderingMaxDepth[i]->setValue(0.0);
_3dRenderingShowScans[i]->setChecked(true); _3dRenderingShowScans[i]->setChecked(true);
_3dRenderingShowFeatures[i]->setChecked(false); _3dRenderingShowFeatures[i]->setChecked(i==0?false:true);
_3dRenderingDownsamplingScan[i]->setValue(1); _3dRenderingDownsamplingScan[i]->setValue(1);
_3dRenderingVoxelSizeScan[i]->setValue(0.0); _3dRenderingVoxelSizeScan[i]->setValue(0.0);
+214 -233
View File
@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>546</width> <width>563</width>
<height>568</height> <height>597</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -42,7 +42,7 @@
<item> <item>
<widget class="QStackedWidget" name="stackedWidget"> <widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex"> <property name="currentIndex">
<number>1</number> <number>0</number>
</property> </property>
<widget class="QWidget" name="page_2"> <widget class="QWidget" name="page_2">
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@@ -146,19 +146,6 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="page"> <widget class="QWidget" name="page">
@@ -168,237 +155,231 @@
<property name="title"> <property name="title">
<string>Camera Intrinsics</string> <string>Camera Intrinsics</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0,1">
<item> <item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0,1"> <widget class="QLabel" name="label_left">
<item row="0" column="0">
<widget class="QLabel" name="label_left">
<property name="text">
<string>Left</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_right">
<property name="text">
<string>Right</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLabel" name="label_10">
<property name="text">
<string>fx</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>fy</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_11">
<property name="text">
<string>cx</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>cy</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLineEdit" name="lineEdit_D_l"/>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="lineEdit_D_r"/>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_12">
<property name="toolTip">
<string>k1, k2, p1, p2[, k3[, k4, k5, k6 ]]</string>
</property>
<property name="text">
<string>Distorsion coefficients (4, 5 or 8 values)</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_4" columnstretch="0,1">
<item row="0" column="0">
<widget class="QSpinBox" name="spinBox_width">
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Image width</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="spinBox_height">
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Image height</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_stereo_extrinsics">
<property name="title">
<string>Stereo Camera Extrinsics</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" rowspan="2" colspan="2">
<widget class="QLineEdit" name="lineEdit_RT">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Format (3 values): x y z&lt;br/&gt;Format (6 values): x y z roll pitch yaw&lt;br/&gt;Format (7 values): x y z qx qy qz qw&lt;br/&gt;Format (9 values, 3x3 rotation): r11 r12 r13 r21 r22 r23 r31 r32 r33&lt;br/&gt;Format (12 values, 3x4 transform): r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz&lt;/p&gt;&lt;p&gt;KITTI: /base_link to /gray_camera = 0 0 1 -1 0 0 0 -1 0&lt;br/&gt;KITTI: /base_link to /color_camera = 0 0 1 0 -1 0 0 -0.06 0 -1 0 0&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>Transform between the cameras</string> <string>Left</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_right">
<property name="text">
<string>Right</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QLabel" name="label_10">
<property name="text">
<string>fx</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_r">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_l">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>99999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_9">
<property name="text">
<string>fy</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="lineEdit_D_r"/>
</item>
<item row="5" column="2">
<widget class="QLabel" name="label_8">
<property name="text">
<string>cy</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLineEdit" name="lineEdit_D_l"/>
</item>
<item row="6" column="2">
<widget class="QLabel" name="label_12">
<property name="toolTip">
<string>k1, k2, p1, p2[, k3[, k4, k5, k6 ]]</string>
</property>
<property name="text">
<string>Distorsion coefficients (4, 5 or 8 values)</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="2">
<widget class="QLabel" name="label_11">
<property name="text">
<string>cx</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
</widget> </widget>
</item> </item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Image Size</string>
</property>
<layout class="QGridLayout" name="gridLayout_4" columnstretch="0,1">
<item row="0" column="0">
<widget class="QSpinBox" name="spinBox_width">
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Image width</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="spinBox_height">
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_13">
<property name="text">
<string>Image height</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_stereo_extrinsics">
<property name="title">
<string>Stereo Camera Extrinsics</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0" rowspan="2" colspan="2">
<widget class="QLineEdit" name="lineEdit_RT">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Format (3 values): x y z&lt;br/&gt;Format (6 values): x y z roll pitch yaw&lt;br/&gt;Format (7 values): x y z qx qy qz qw&lt;br/&gt;Format (9 values, 3x3 rotation): r11 r12 r13 r21 r22 r23 r31 r32 r33&lt;br/&gt;Format (12 values, 3x4 transform): r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz&lt;/p&gt;&lt;p&gt;KITTI: /base_link to /gray_camera = 0 0 1 -1 0 0 0 -1 0&lt;br/&gt;KITTI: /base_link to /color_camera = 0 0 1 0 -1 0 0 -0.06 0 -1 0 0&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Transform between the cameras</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item> <item>
<widget class="QDialogButtonBox" name="buttonBox"> <widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation"> <property name="orientation">