Export Added RoiRatios parameter to texturing (#171)

This commit is contained in:
matlabbe
2017-04-20 11:51:23 -04:00
parent c068c3c33a
commit a274f3cf01
10 changed files with 279 additions and 198 deletions

View File

@@ -2735,6 +2735,7 @@ bool RTABMapApp::exportMesh(
cameraModels, cameraModels,
optimizedMaxTextureDistance, optimizedMaxTextureDistance,
optimizedMinTextureClusterSize, optimizedMinTextureClusterSize,
std::vector<float>(),
&progressionStatus_, &progressionStatus_,
&vertexToPixels); &vertexToPixels);
LOGI("Texturing... done! %fs", timer.ticks()); LOGI("Texturing... done! %fs", timer.ticks());

View File

@@ -139,6 +139,7 @@ pcl::TextureMesh::Ptr RTABMAP_EXP createTextureMesh(
const std::map<int, CameraModel> & cameraModels, const std::map<int, CameraModel> & cameraModels,
float maxDistance = 0.0f, // max camera distance to polygon to apply texture float maxDistance = 0.0f, // max camera distance to polygon to apply texture
int minClusterSize = 50, // minimum size of polygons clusters textured int minClusterSize = 50, // minimum size of polygons clusters textured
const std::vector<float> & roiRatios = std::vector<float>(), // [left, right, top, bottom] region of interest (in ratios) of the image projected.
const ProgressState * state = 0, const ProgressState * state = 0,
std::vector<std::map<int, pcl::PointXY> > * vertexToPixels = 0); std::vector<std::map<int, pcl::PointXY> > * vertexToPixels = 0);

View File

@@ -1416,7 +1416,24 @@ pcl::TextureMapping<PointInT>::getPointUVCoordinates(const PointInT &pt, const C
// project point on camera's image plane // project point on camera's image plane
UV_coordinates.x = static_cast<float> ((focal_x * (pt.x / pt.z) + cx) / sizeX); //horizontal UV_coordinates.x = static_cast<float> ((focal_x * (pt.x / pt.z) + cx) / sizeX); //horizontal
UV_coordinates.y = 1.0f - static_cast<float> ((focal_y * (pt.y / pt.z) + cy) / sizeY); //vertical UV_coordinates.y = static_cast<float> ((focal_y * (pt.y / pt.z) + cy) / sizeY); //vertical
if(cam.roi.size() == 4)
{
if( UV_coordinates.x < cam.roi[0]/sizeX ||
UV_coordinates.y < cam.roi[1]/sizeY ||
UV_coordinates.x > (cam.roi[0]+cam.roi[2])/sizeX ||
UV_coordinates.y > (cam.roi[1]+cam.roi[3])/sizeY)
{
// point is NOT in region of interest of the camera
UV_coordinates.x = -1.0f;
UV_coordinates.y = -1.0f;
return false;
}
}
// original code of PCL inverted y
UV_coordinates.y = 1.0f - UV_coordinates.y;
// point is visible! // point is visible!
if (UV_coordinates.x >= 0.0 && UV_coordinates.x <= 1.0 && UV_coordinates.y >= 0.0 && UV_coordinates.y <= 1.0) if (UV_coordinates.x >= 0.0 && UV_coordinates.x <= 1.0 && UV_coordinates.y >= 0.0 && UV_coordinates.y <= 1.0)

View File

@@ -77,6 +77,7 @@ namespace pcl
double height; double height;
double width; double width;
std::string texture_file; std::string texture_file;
std::vector<double> roi; // [x, y, width, height]
EIGEN_MAKE_ALIGNED_OPERATOR_NEW EIGEN_MAKE_ALIGNED_OPERATOR_NEW
}; };

View File

@@ -1147,28 +1147,30 @@ cv::Rect computeRoi(const cv::Size & imageSize, const std::vector<float> & roiRa
UDEBUG("roi = %d, %d, %d, %d", roi.x, roi.y, roi.width, roi.height); UDEBUG("roi = %d, %d, %d, %d", roi.x, roi.y, roi.width, roi.height);
//left roi //left roi
if(roiRatios[0] > 0 && roiRatios[0] < 1 - roiRatios[1]) if(roiRatios[0] > 0 && roiRatios[0] < 1.0f - roiRatios[1])
{ {
roi.x = width * roiRatios[0]; roi.x = width * roiRatios[0];
} }
//right roi //right roi
if(roiRatios[1] > 0 && roiRatios[1] < 1 - roiRatios[0]) if(roiRatios[1] > 0 && roiRatios[1] < 1.0f - roiRatios[0])
{ {
roi.width -= width * roiRatios[1] + width * roiRatios[0]; roi.width -= width * roiRatios[1];
} }
roi.width -= roi.x;
//top roi //top roi
if(roiRatios[2] > 0 && roiRatios[2] < 1 - roiRatios[3]) if(roiRatios[2] > 0 && roiRatios[2] < 1.0f - roiRatios[3])
{ {
roi.y = height * roiRatios[2]; roi.y = height * roiRatios[2];
} }
//bottom roi //bottom roi
if(roiRatios[3] > 0 && roiRatios[3] < 1 - roiRatios[2]) if(roiRatios[3] > 0 && roiRatios[3] < 1.0f - roiRatios[2])
{ {
roi.height -= height * roiRatios[3] + height * roiRatios[2]; roi.height -= height * roiRatios[3];
} }
roi.height -= roi.y;
UDEBUG("roi = %d, %d, %d, %d", roi.x, roi.y, roi.width, roi.height); UDEBUG("roi = %d, %d, %d, %d", roi.x, roi.y, roi.width, roi.height);
return roi; return roi;

View File

@@ -992,10 +992,10 @@ pcl::PointCloud<pcl::PointXYZRGB>::Ptr RTABMAP_EXP cloudRGBFromSensorData(
cv::Mat depth(sensorData.depthRaw(), cv::Rect(subDepthWidth*i, 0, subDepthWidth, sensorData.depthRaw().rows)); cv::Mat depth(sensorData.depthRaw(), cv::Rect(subDepthWidth*i, 0, subDepthWidth, sensorData.depthRaw().rows));
CameraModel model = sensorData.cameraModels()[i]; CameraModel model = sensorData.cameraModels()[i];
if( roiRatios.size() == 4 && if( roiRatios.size() == 4 &&
(roiRatios[0] > 0.0f || ((roiRatios[0] > 0.0f && roiRatios[0] <= 1.0f) ||
roiRatios[1] > 0.0f || (roiRatios[1] > 0.0f && roiRatios[1] <= 1.0f) ||
roiRatios[2] > 0.0f || (roiRatios[2] > 0.0f && roiRatios[2] <= 1.0f) ||
roiRatios[3] > 0.0f)) (roiRatios[3] > 0.0f && roiRatios[3] <= 1.0f)))
{ {
cv::Rect roiDepth = util2d::computeRoi(depth, roiRatios); cv::Rect roiDepth = util2d::computeRoi(depth, roiRatios);
cv::Rect roiRgb = util2d::computeRoi(rgb, roiRatios); cv::Rect roiRgb = util2d::computeRoi(rgb, roiRatios);

View File

@@ -573,9 +573,11 @@ pcl::PolygonMesh::Ptr createMesh(
pcl::texture_mapping::CameraVector createTextureCameras( pcl::texture_mapping::CameraVector createTextureCameras(
const std::map<int, Transform> & poses, const std::map<int, Transform> & poses,
const std::map<int, CameraModel> & cameraModels) const std::map<int, CameraModel> & cameraModels,
const std::vector<float> & roiRatios)
{ {
UASSERT(poses.size() == cameraModels.size()); UASSERT(poses.size() == cameraModels.size());
UASSERT(roiRatios.empty() || roiRatios.size() == 4);
pcl::texture_mapping::CameraVector cameras(poses.size()); pcl::texture_mapping::CameraVector cameras(poses.size());
std::map<int, Transform>::const_iterator poseIter=poses.begin(); std::map<int, Transform>::const_iterator poseIter=poses.begin();
std::map<int, CameraModel>::const_iterator modelIter=cameraModels.begin(); std::map<int, CameraModel>::const_iterator modelIter=cameraModels.begin();
@@ -602,6 +604,14 @@ pcl::texture_mapping::CameraVector createTextureCameras(
cam.height=modelIter->second.imageHeight(); cam.height=modelIter->second.imageHeight();
cam.width=modelIter->second.imageWidth(); cam.width=modelIter->second.imageWidth();
cam.texture_file = uFormat("%d", poseIter->first); cam.texture_file = uFormat("%d", poseIter->first);
if(!roiRatios.empty())
{
cam.roi.resize(4);
cam.roi[0] = cam.width * roiRatios[0]; // left -> x
cam.roi[1] = cam.height * roiRatios[2]; // top -> y
cam.roi[2] = cam.width * (1.0 - roiRatios[1]) - cam.roi[0]; // right -> width
cam.roi[3] = cam.height * (1.0 - roiRatios[3]) - cam.roi[1]; // bottom -> height
}
cameras[oi++] = cam; cameras[oi++] = cam;
} }
return cameras; return cameras;
@@ -613,6 +623,7 @@ pcl::TextureMesh::Ptr createTextureMesh(
const std::map<int, CameraModel> & cameraModels, const std::map<int, CameraModel> & cameraModels,
float maxDistance, float maxDistance,
int minClusterSize, int minClusterSize,
const std::vector<float> & roiRatios,
const ProgressState * state, const ProgressState * state,
std::vector<std::map<int, pcl::PointXY> > * vertexToPixels) std::vector<std::map<int, pcl::PointXY> > * vertexToPixels)
{ {
@@ -629,7 +640,8 @@ pcl::TextureMesh::Ptr createTextureMesh(
// create cameras // create cameras
pcl::texture_mapping::CameraVector cameras = createTextureCameras( pcl::texture_mapping::CameraVector cameras = createTextureCameras(
poses, poses,
cameraModels); cameraModels,
roiRatios);
// Create materials for each texture (and one extra for occluded faces) // Create materials for each texture (and one extra for occluded faces)
textureMesh->tex_materials.resize (cameras.size () + 1); textureMesh->tex_materials.resize (cameras.size () + 1);

View File

@@ -159,6 +159,7 @@ ExportCloudsDialog::ExportCloudsDialog(QWidget *parent) :
connect(_ui->comboBox_meshingTextureSize, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged())); connect(_ui->comboBox_meshingTextureSize, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged()));
connect(_ui->doubleSpinBox_meshingTextureMaxDistance, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged())); connect(_ui->doubleSpinBox_meshingTextureMaxDistance, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
connect(_ui->spinBox_mesh_minTextureClusterSize, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged())); connect(_ui->spinBox_mesh_minTextureClusterSize, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
connect(_ui->lineEdit_meshingTextureRoiRatios, SIGNAL(textChanged(const QString &)), this, SIGNAL(configChanged()));
connect(_ui->checkBox_cameraFilter, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged())); connect(_ui->checkBox_cameraFilter, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
connect(_ui->checkBox_cameraFilter, SIGNAL(stateChanged(int)), this, SLOT(updateReconstructionFlavor())); connect(_ui->checkBox_cameraFilter, SIGNAL(stateChanged(int)), this, SLOT(updateReconstructionFlavor()));
connect(_ui->doubleSpinBox_cameraFilterRadius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged())); connect(_ui->doubleSpinBox_cameraFilterRadius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
@@ -286,6 +287,7 @@ void ExportCloudsDialog::saveSettings(QSettings & settings, const QString & grou
settings.setValue("mesh_textureSize", _ui->comboBox_meshingTextureSize->currentIndex()); settings.setValue("mesh_textureSize", _ui->comboBox_meshingTextureSize->currentIndex());
settings.setValue("mesh_textureMaxDistance", _ui->doubleSpinBox_meshingTextureMaxDistance->value()); settings.setValue("mesh_textureMaxDistance", _ui->doubleSpinBox_meshingTextureMaxDistance->value());
settings.setValue("mesh_textureMinCluster", _ui->spinBox_mesh_minTextureClusterSize->value()); settings.setValue("mesh_textureMinCluster", _ui->spinBox_mesh_minTextureClusterSize->value());
settings.setValue("mesh_textureRoiRatios", _ui->lineEdit_meshingTextureRoiRatios->text());
settings.setValue("mesh_textureCameraFiltering", _ui->checkBox_cameraFilter->isChecked()); settings.setValue("mesh_textureCameraFiltering", _ui->checkBox_cameraFilter->isChecked());
settings.setValue("mesh_textureCameraFilteringRadius", _ui->doubleSpinBox_cameraFilterRadius->value()); settings.setValue("mesh_textureCameraFilteringRadius", _ui->doubleSpinBox_cameraFilterRadius->value());
settings.setValue("mesh_textureCameraFilteringAngle", _ui->doubleSpinBox_cameraFilterAngle->value()); settings.setValue("mesh_textureCameraFilteringAngle", _ui->doubleSpinBox_cameraFilterAngle->value());
@@ -384,6 +386,7 @@ void ExportCloudsDialog::loadSettings(QSettings & settings, const QString & grou
_ui->comboBox_meshingTextureSize->setCurrentIndex(settings.value("mesh_textureSize", _ui->comboBox_meshingTextureSize->currentIndex()).toInt()); _ui->comboBox_meshingTextureSize->setCurrentIndex(settings.value("mesh_textureSize", _ui->comboBox_meshingTextureSize->currentIndex()).toInt());
_ui->doubleSpinBox_meshingTextureMaxDistance->setValue(settings.value("mesh_textureMaxDistance", _ui->doubleSpinBox_meshingTextureMaxDistance->value()).toDouble()); _ui->doubleSpinBox_meshingTextureMaxDistance->setValue(settings.value("mesh_textureMaxDistance", _ui->doubleSpinBox_meshingTextureMaxDistance->value()).toDouble());
_ui->spinBox_mesh_minTextureClusterSize->setValue(settings.value("mesh_textureMinCluster", _ui->spinBox_mesh_minTextureClusterSize->value()).toDouble()); _ui->spinBox_mesh_minTextureClusterSize->setValue(settings.value("mesh_textureMinCluster", _ui->spinBox_mesh_minTextureClusterSize->value()).toDouble());
_ui->lineEdit_meshingTextureRoiRatios->setText(settings.value("mesh_textureRoiRatios", _ui->lineEdit_meshingTextureRoiRatios->text()).toString());
_ui->checkBox_cameraFilter->setChecked(settings.value("mesh_textureCameraFiltering", _ui->checkBox_cameraFilter->isChecked()).toBool()); _ui->checkBox_cameraFilter->setChecked(settings.value("mesh_textureCameraFiltering", _ui->checkBox_cameraFilter->isChecked()).toBool());
_ui->doubleSpinBox_cameraFilterRadius->setValue(settings.value("mesh_textureCameraFilteringRadius", _ui->doubleSpinBox_cameraFilterRadius->value()).toDouble()); _ui->doubleSpinBox_cameraFilterRadius->setValue(settings.value("mesh_textureCameraFilteringRadius", _ui->doubleSpinBox_cameraFilterRadius->value()).toDouble());
_ui->doubleSpinBox_cameraFilterAngle->setValue(settings.value("mesh_textureCameraFilteringAngle", _ui->doubleSpinBox_cameraFilterAngle->value()).toDouble()); _ui->doubleSpinBox_cameraFilterAngle->setValue(settings.value("mesh_textureCameraFilteringAngle", _ui->doubleSpinBox_cameraFilterAngle->value()).toDouble());
@@ -482,6 +485,7 @@ void ExportCloudsDialog::restoreDefaults()
_ui->comboBox_meshingTextureSize->setCurrentIndex(5); // 4096 _ui->comboBox_meshingTextureSize->setCurrentIndex(5); // 4096
_ui->doubleSpinBox_meshingTextureMaxDistance->setValue(3.0); _ui->doubleSpinBox_meshingTextureMaxDistance->setValue(3.0);
_ui->spinBox_mesh_minTextureClusterSize->setValue(50); _ui->spinBox_mesh_minTextureClusterSize->setValue(50);
_ui->lineEdit_meshingTextureRoiRatios->setText("");
_ui->checkBox_cameraFilter->setChecked(false); _ui->checkBox_cameraFilter->setChecked(false);
_ui->doubleSpinBox_cameraFilterRadius->setValue(0.1); _ui->doubleSpinBox_cameraFilterRadius->setValue(0.1);
_ui->doubleSpinBox_cameraFilterAngle->setValue(30); _ui->doubleSpinBox_cameraFilterAngle->setValue(30);
@@ -1940,12 +1944,42 @@ bool ExportCloudsDialog::getExportedClouds(
TexturingState texturingState(_progressDialog); TexturingState texturingState(_progressDialog);
_progressDialog->setMaximumSteps(_progressDialog->maximumSteps()+iter->second->polygons.size()/10000+1); _progressDialog->setMaximumSteps(_progressDialog->maximumSteps()+iter->second->polygons.size()/10000+1);
std::vector<float> roiRatios;
QStringList strings = _ui->lineEdit_meshingTextureRoiRatios->text().split(' ');
if(!_ui->lineEdit_meshingTextureRoiRatios->text().isEmpty())
{
if(strings.size()==4)
{
roiRatios.resize(4);
roiRatios[0]=strings[0].toDouble();
roiRatios[1]=strings[1].toDouble();
roiRatios[2]=strings[2].toDouble();
roiRatios[3]=strings[3].toDouble();
if(!(roiRatios[0]>=0.0f && roiRatios[0]<=1.0f &&
roiRatios[1]>=0.0f && roiRatios[1]<=1.0f &&
roiRatios[2]>=0.0f && roiRatios[2]<=1.0f &&
roiRatios[3]>=0.0f && roiRatios[3]<=1.0f))
{
roiRatios.clear();
}
}
if(roiRatios.empty())
{
QString msg = tr("Wrong ROI format. Region of Interest (ROI) must have 4 values [left right top bottom] between 0 and 1 separated by space (%1), ignoring it for texturing...").arg(_ui->lineEdit_meshingTextureRoiRatios->text());
UWARN(msg.toStdString().c_str());
_progressDialog->appendText(msg, Qt::darkYellow);
_progressDialog->setAutoClose(false);
}
}
textureMesh = util3d::createTextureMesh( textureMesh = util3d::createTextureMesh(
iter->second, iter->second,
cameraPoses, cameraPoses,
cameraModels, cameraModels,
_ui->doubleSpinBox_meshingTextureMaxDistance->value(), _ui->doubleSpinBox_meshingTextureMaxDistance->value(),
_ui->spinBox_mesh_minTextureClusterSize->value(), _ui->spinBox_mesh_minTextureClusterSize->value(),
roiRatios,
&texturingState, &texturingState,
cameraPoses.size()>1?&textureVertexToPixels:0); // only get vertexToPixels if merged clouds with multi textures cameraPoses.size()>1?&textureVertexToPixels:0); // only get vertexToPixels if merged clouds with multi textures

View File

@@ -23,9 +23,9 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>-1967</y> <y>-1802</y>
<width>773</width> <width>778</width>
<height>3396</height> <height>3385</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_13"> <layout class="QVBoxLayout" name="verticalLayout_13">
@@ -1373,40 +1373,61 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
<layout class="QVBoxLayout" name="verticalLayout_16"> <layout class="QVBoxLayout" name="verticalLayout_16">
<item> <item>
<layout class="QGridLayout" name="gridLayout_15" columnstretch="0,1"> <layout class="QGridLayout" name="gridLayout_15" columnstretch="0,1">
<item row="0" column="1"> <item row="7" column="0">
<widget class="QLabel" name="label_meshingTextureFormat"> <widget class="QComboBox" name="comboBox_blendingDecimation">
<item>
<property name="text"> <property name="text">
<string>Texture format.</string> <string>Auto</string>
</property>
</item>
<item>
<property name="text">
<string>1</string>
</property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>16</string>
</property>
</item>
<item>
<property name="text">
<string>32</string>
</property>
</item>
<item>
<property name="text">
<string>64</string>
</property>
</item>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="label_exposureFusion_2">
<property name="text">
<string>Blending. Only used with dense reconstruction flavor and if clouds are assembled.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0"> <item row="3" column="1">
<widget class="QSpinBox" name="spinBox_textureBrightnessContrastRatioHigh">
<property name="suffix">
<string> %</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>49</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QSpinBox" name="spinBox_mesh_minTextureClusterSize">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>99999</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_meshingTextureSize_2"> <widget class="QLabel" name="label_meshingTextureSize_2">
<property name="text"> <property name="text">
<string>Maximum distance from the camera for polygons to be textured by this camera (0 means infinite). Only used with dense reconstruction flavor.</string> <string>Maximum distance from the camera for polygons to be textured by this camera (0 means infinite). Only used with dense reconstruction flavor.</string>
@@ -1416,20 +1437,42 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="10" column="1"> <item row="3" column="0">
<widget class="QLabel" name="label_exposureFusion"> <widget class="QDoubleSpinBox" name="doubleSpinBox_meshingTextureMaxDistance">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>99.000000000000000</double>
</property>
<property name="singleStep">
<double>1.000000000000000</double>
</property>
<property name="value">
<double>3.000000000000000</double>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="label_meshingTextureSize_5">
<property name="text"> <property name="text">
<string>Exposure fusion. Only used when textures are merged and brightness/contrast balance ratios are used (merging original texture + 1 for each ratios).</string> <string>Brightness and contrast balance low ratio. Only used when textures are merged.</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="1"> <item row="0" column="1">
<widget class="QLabel" name="label_meshingTextureSize_3"> <widget class="QLabel" name="label_meshingTextureFormat">
<property name="text"> <property name="text">
<string>Camera filtering. By comparing poses in the same area, only one camera in a fixed radius and angle is used for texturing.</string> <string>Texture format.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -1460,13 +1503,43 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="0"> <item row="9" column="0">
<widget class="QSpinBox" name="spinBox_textureBrightnessContrastRatioHigh">
<property name="suffix">
<string> %</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>49</number>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="checkBox_blending">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checkBox_cameraFilter"> <widget class="QCheckBox" name="checkBox_cameraFilter">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="1">
<widget class="QLabel" name="label_meshingTextureSize_6">
<property name="text">
<string>Brightness and contrast balance high ratio. Only used when textures are merged.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QComboBox" name="comboBox_meshingTextureSize"> <widget class="QComboBox" name="comboBox_meshingTextureSize">
<item> <item>
@@ -1516,27 +1589,7 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</item> </item>
</widget> </widget>
</item> </item>
<item row="7" column="1"> <item row="8" column="0">
<widget class="QLabel" name="label_meshingTextureSize_5">
<property name="text">
<string>Brightness and contrast balance low ratio. Only used when textures are merged.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_meshingTextureSize_4">
<property name="text">
<string>Minimum polygon cluster size for texturing. This removes textures applied on sparse polygons. Only used with dense reconstruction flavor.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QSpinBox" name="spinBox_textureBrightnessContrastRatioLow"> <widget class="QSpinBox" name="spinBox_textureBrightnessContrastRatioLow">
<property name="suffix"> <property name="suffix">
<string> %</string> <string> %</string>
@@ -1549,63 +1602,24 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="0"> <item row="11" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_meshingTextureMaxDistance">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>99.000000000000000</double>
</property>
<property name="singleStep">
<double>1.000000000000000</double>
</property>
<property name="value">
<double>3.000000000000000</double>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="label_meshingTextureSize_6">
<property name="text">
<string>Brightness and contrast balance high ratio. Only used when textures are merged.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="checkBox_exposureFusion"> <widget class="QCheckBox" name="checkBox_exposureFusion">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0"> <item row="4" column="0">
<widget class="QCheckBox" name="checkBox_blending"> <widget class="QSpinBox" name="spinBox_mesh_minTextureClusterSize">
<property name="text"> <property name="minimum">
<string/> <number>0</number>
</property>
<property name="maximum">
<number>99999</number>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="7" column="1">
<widget class="QLabel" name="label_exposureFusion_2">
<property name="text">
<string>Blending. Only used with dense reconstruction flavor and if clouds are assembled.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="label_exposureFusion_3"> <widget class="QLabel" name="label_exposureFusion_3">
<property name="text"> <property name="text">
<string>Blending decimation. </string> <string>Blending decimation. </string>
@@ -1615,50 +1629,49 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="4" column="1">
<widget class="QComboBox" name="comboBox_blendingDecimation"> <widget class="QLabel" name="label_meshingTextureSize_4">
<item>
<property name="text"> <property name="text">
<string>Auto</string> <string>Minimum polygon cluster size for texturing. This removes textures applied on sparse polygons. Only used with dense reconstruction flavor.</string>
</property> </property>
</item> <property name="wordWrap">
<item> <bool>true</bool>
<property name="text">
<string>1</string>
</property> </property>
</item>
<item>
<property name="text">
<string>2</string>
</property>
</item>
<item>
<property name="text">
<string>4</string>
</property>
</item>
<item>
<property name="text">
<string>8</string>
</property>
</item>
<item>
<property name="text">
<string>16</string>
</property>
</item>
<item>
<property name="text">
<string>32</string>
</property>
</item>
<item>
<property name="text">
<string>64</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item row="5" column="1">
<widget class="QLabel" name="label_meshingTextureSize_3">
<property name="text">
<string>Camera filtering. By comparing poses in the same area, only one camera in a fixed radius and angle is used for texturing.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="11" column="1">
<widget class="QLabel" name="label_exposureFusion">
<property name="text">
<string>Exposure fusion. Only used when textures are merged and brightness/contrast balance ratios are used (merging original texture + 1 for each ratios).</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_meshingTextureSize_7">
<property name="text">
<string>ROI ratios [left right top bottom] between 0 and 1. This can be used to ignore black borders of RGB images caused by calibration. </string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLineEdit" name="lineEdit_meshingTextureRoiRatios"/>
</item>
</layout> </layout>
</item> </item>
<item> <item>

View File

@@ -63,7 +63,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>-433</y> <y>-641</y>
<width>678</width> <width>678</width>
<height>2701</height> <height>2701</height>
</rect> </rect>
@@ -86,7 +86,7 @@
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<property name="currentIndex"> <property name="currentIndex">
<number>5</number> <number>20</number>
</property> </property>
<widget class="QWidget" name="page_22"> <widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1"> <layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
@@ -775,7 +775,7 @@ Show a yellow background when the number of odometry inliers goes under this thr
<item row="5" column="2"> <item row="5" column="2">
<widget class="QLabel" name="label_353"> <widget class="QLabel" name="label_353">
<property name="text"> <property name="text">
<string>ROI ratios [left, right, top, bottom] between 0 and 1.</string> <string>ROI ratios [left right top bottom] between 0 and 1.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>
@@ -11484,7 +11484,7 @@ Lower the ratio -&gt; higher the precision. 0 means disabled, matching the neare
<item row="5" column="1"> <item row="5" column="1">
<widget class="QLabel" name="label_261"> <widget class="QLabel" name="label_261">
<property name="text"> <property name="text">
<string>ROI ratios [left, right, top, bottom] between 0 and 1.</string> <string>ROI ratios [left right top bottom] between 0 and 1.</string>
</property> </property>
<property name="wordWrap"> <property name="wordWrap">
<bool>true</bool> <bool>true</bool>