mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 08:47:45 +08:00
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:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+42
-12
@@ -2031,16 +2031,25 @@ 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)
|
||||||
|
{
|
||||||
|
if(image && (!_reextractLoopClosureFeatures || !_registrationPipeline->isImageRequired()))
|
||||||
{
|
{
|
||||||
s->sensorData().setImageRaw(cv::Mat());
|
s->sensorData().setImageRaw(cv::Mat());
|
||||||
s->sensorData().setDepthOrRightRaw(cv::Mat());
|
s->sensorData().setDepthOrRightRaw(cv::Mat());
|
||||||
|
}
|
||||||
|
if(scan && !_registrationPipeline->isScanRequired())
|
||||||
|
{
|
||||||
s->sensorData().setLaserScanRaw(cv::Mat(), s->sensorData().laserScanMaxPts(), s->sensorData().laserScanMaxRange());
|
s->sensorData().setLaserScanRaw(cv::Mat(), s->sensorData().laserScanMaxPts(), s->sensorData().laserScanMaxRange());
|
||||||
|
}
|
||||||
|
if(userData && !_registrationPipeline->isUserDataRequired())
|
||||||
|
{
|
||||||
s->sensorData().setUserDataRaw(cv::Mat());
|
s->sensorData().setUserDataRaw(cv::Mat());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// compute transform fromId -> toId
|
// compute transform fromId -> toId
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,24 +155,25 @@
|
|||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Camera Intrinsics</string>
|
<string>Camera Intrinsics</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<item>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0,1">
|
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0,1">
|
||||||
<item row="0" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_left">
|
<widget class="QLabel" name="label_left">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Left</string>
|
<string>Left</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLabel" name="label_right">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_r">
|
||||||
<property name="text">
|
<property name="decimals">
|
||||||
<string>Right</string>
|
<number>6</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>99999.000000000000000</double>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_l">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_l">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
@@ -196,50 +184,13 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_fx_r">
|
<widget class="QLabel" name="label_right">
|
||||||
<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">
|
<property name="text">
|
||||||
<string>fx</string>
|
<string>Right</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="4" 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">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_l">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
@@ -249,8 +200,15 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</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">
|
<item row="3" column="1">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_cx_r">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_r">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -259,15 +217,8 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="2">
|
<item row="3" column="0">
|
||||||
<widget class="QLabel" name="label_11">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_fy_l">
|
||||||
<property name="text">
|
|
||||||
<string>cx</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="4" column="0">
|
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_l">
|
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -277,6 +228,16 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<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">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_cy_r">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
@@ -286,20 +247,37 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="2">
|
<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">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>cy</string>
|
<string>cy</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLineEdit" name="lineEdit_D_l"/>
|
<widget class="QLineEdit" name="lineEdit_D_l"/>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="2">
|
||||||
<widget class="QLineEdit" name="lineEdit_D_r"/>
|
|
||||||
</item>
|
|
||||||
<item row="5" column="2">
|
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="label_12">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>k1, k2, p1, p2[, k3[, k4, k5, k6 ]]</string>
|
<string>k1, k2, p1, p2[, k3[, k4, k5, k6 ]]</string>
|
||||||
@@ -312,16 +290,25 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
<item row="4" column="2">
|
||||||
</item>
|
<widget class="QLabel" name="label_11">
|
||||||
<item>
|
<property name="text">
|
||||||
<widget class="Line" name="line">
|
<string>cx</string>
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</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">
|
<layout class="QGridLayout" name="gridLayout_4" columnstretch="0,1">
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_width">
|
<widget class="QSpinBox" name="spinBox_width">
|
||||||
@@ -352,8 +339,6 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -383,7 +368,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="verticalSpacer_2">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -395,10 +380,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
|
|||||||
Reference in New Issue
Block a user