mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 17:40:23 +08:00
Added parameter KpMaxDepth to limit the features extracted under a specified maximum depth.
git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1288 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
44
.cproject
44
.cproject
@@ -1,21 +1,23 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
<?fileVersion 4.0.0?>
|
||||||
|
|
||||||
|
<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||||
<cconfiguration id="0.1790260204">
|
<cconfiguration id="0.1790260204">
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204" moduleId="org.eclipse.cdt.core.settings" name="Unix">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204" moduleId="org.eclipse.cdt.core.settings" name="Unix">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
@@ -160,17 +162,17 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362" moduleId="org.eclipse.cdt.core.settings" name="MinGW">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362" moduleId="org.eclipse.cdt.core.settings" name="MinGW">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
@@ -217,17 +219,17 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362.1064002412" moduleId="org.eclipse.cdt.core.settings" name="NMake">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362.1064002412" moduleId="org.eclipse.cdt.core.settings" name="NMake">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
@@ -289,17 +291,17 @@
|
|||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362.1064002412.862027363" moduleId="org.eclipse.cdt.core.settings" name="NMake JOM">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1790260204.1906025362.1064002412.862027363" moduleId="org.eclipse.cdt.core.settings" name="NMake JOM">
|
||||||
<externalSettings/>
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
|
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.SOM" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.MachO64" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
|
|||||||
@@ -30,6 +30,17 @@
|
|||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
|
void RTABMAP_EXP filterKeypointsByDepth(
|
||||||
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
|
float maxDepth);
|
||||||
|
void RTABMAP_EXP filterKeypointsByDepth(
|
||||||
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
|
cv::Mat & descriptors,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
|
float maxDepth);
|
||||||
|
|
||||||
void RTABMAP_EXP limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints);
|
void RTABMAP_EXP limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints);
|
||||||
void RTABMAP_EXP limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors, int maxKeypoints);
|
void RTABMAP_EXP limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors, int maxKeypoints);
|
||||||
|
|||||||
@@ -139,6 +139,8 @@ public:
|
|||||||
std::multimap<int, cv::KeyPoint> getWords(int signatureId) const;
|
std::multimap<int, cv::KeyPoint> getWords(int signatureId) const;
|
||||||
void extractKeypointsAndDescriptors(
|
void extractKeypointsAndDescriptors(
|
||||||
const cv::Mat & image,
|
const cv::Mat & image,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
std::vector<cv::KeyPoint> & keypoints,
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
cv::Mat & descriptors);
|
cv::Mat & descriptors);
|
||||||
|
|
||||||
@@ -218,6 +220,7 @@ private:
|
|||||||
float _badSignRatio;;
|
float _badSignRatio;;
|
||||||
bool _tfIdfLikelihoodUsed;
|
bool _tfIdfLikelihoodUsed;
|
||||||
bool _parallelized;
|
bool _parallelized;
|
||||||
|
float _wordsMaxDepth; // 0=inf
|
||||||
int _wordsPerImageTarget; // <0=none, 0=inf
|
int _wordsPerImageTarget; // <0=none, 0=inf
|
||||||
std::vector<float> _roiRatios; // size 4
|
std::vector<float> _roiRatios; // size 4
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(Kp, PublishKeypoints, bool, true, "Publishing keypoints.");
|
RTABMAP_PARAM(Kp, PublishKeypoints, bool, true, "Publishing keypoints.");
|
||||||
RTABMAP_PARAM(Kp, NNStrategy, int, 1, "Naive 0, kdForest 1.");
|
RTABMAP_PARAM(Kp, NNStrategy, int, 1, "Naive 0, kdForest 1.");
|
||||||
RTABMAP_PARAM(Kp, IncrementalDictionary, bool, true, "");
|
RTABMAP_PARAM(Kp, IncrementalDictionary, bool, true, "");
|
||||||
|
RTABMAP_PARAM(Kp, MaxDepth, float, 0.0, "Filter extracted keypoints by depth (0=inf)");
|
||||||
RTABMAP_PARAM(Kp, WordsPerImage, int, 400, "");
|
RTABMAP_PARAM(Kp, WordsPerImage, int, 400, "");
|
||||||
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.2, "Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).");
|
RTABMAP_PARAM(Kp, BadSignRatio, float, 0.2, "Bad signature ratio (less than Ratio x AverageWordsPerImage = bad).");
|
||||||
RTABMAP_PARAM(Kp, MinDistUsed, bool, false, "The nearest neighbor must have a distance < minDist.");
|
RTABMAP_PARAM(Kp, MinDistUsed, bool, false, "The nearest neighbor must have a distance < minDist.");
|
||||||
|
|||||||
@@ -90,6 +90,11 @@ std::multimap<int, cv::KeyPoint> RTABMAP_EXP aggregate(
|
|||||||
const std::list<int> & wordIds,
|
const std::list<int> & wordIds,
|
||||||
const std::vector<cv::KeyPoint> & keypoints);
|
const std::vector<cv::KeyPoint> & keypoints);
|
||||||
|
|
||||||
|
pcl::PointXYZ RTABMAP_EXP getDepth(
|
||||||
|
const cv::Mat & depthImage,
|
||||||
|
int x, int y,
|
||||||
|
float depthConstant);
|
||||||
|
|
||||||
pcl::PointXYZ RTABMAP_EXP getDepth(const cv::Mat & depthImage,
|
pcl::PointXYZ RTABMAP_EXP getDepth(const cv::Mat & depthImage,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
float cx, float cy,
|
float cx, float cy,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "rtabmap/core/Features2d.h"
|
#include "rtabmap/core/Features2d.h"
|
||||||
|
#include "rtabmap/core/util3d.h"
|
||||||
#include "rtabmap/utilite/UStl.h"
|
#include "rtabmap/utilite/UStl.h"
|
||||||
#include "rtabmap/utilite/UConversion.h"
|
#include "rtabmap/utilite/UConversion.h"
|
||||||
#include "rtabmap/utilite/ULogger.h"
|
#include "rtabmap/utilite/ULogger.h"
|
||||||
@@ -36,6 +37,63 @@
|
|||||||
|
|
||||||
namespace rtabmap {
|
namespace rtabmap {
|
||||||
|
|
||||||
|
void filterKeypointsByDepth(
|
||||||
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
|
float maxDepth)
|
||||||
|
{
|
||||||
|
cv::Mat descriptors;
|
||||||
|
filterKeypointsByDepth(keypoints, descriptors, depth, depthConstant, maxDepth);
|
||||||
|
}
|
||||||
|
|
||||||
|
void filterKeypointsByDepth(
|
||||||
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
|
cv::Mat & descriptors,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
|
float maxDepth)
|
||||||
|
{
|
||||||
|
if(!depth.empty() && depthConstant > 0.0f && maxDepth > 0.0f && (descriptors.empty() || descriptors.rows == keypoints.size()))
|
||||||
|
{
|
||||||
|
std::vector<cv::KeyPoint> output(keypoints.size());
|
||||||
|
std::vector<int> indexes(keypoints.size(), 0);
|
||||||
|
int oi=0;
|
||||||
|
for(unsigned int i=0; i<keypoints.size(); ++i)
|
||||||
|
{
|
||||||
|
pcl::PointXYZ pt = util3d::getDepth(depth, keypoints[i].pt.x, keypoints[i].pt.y, depthConstant);
|
||||||
|
if(uIsFinite(pt.z) && pt.z < maxDepth)
|
||||||
|
{
|
||||||
|
output[oi++] = keypoints[i];
|
||||||
|
indexes[i] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output.resize(oi);
|
||||||
|
keypoints = output;
|
||||||
|
|
||||||
|
if(!descriptors.empty() && keypoints.size() != descriptors.rows)
|
||||||
|
{
|
||||||
|
if(keypoints.size() == 0)
|
||||||
|
{
|
||||||
|
descriptors = cv::Mat();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cv::Mat newDescriptors(keypoints.size(), descriptors.cols, descriptors.type());
|
||||||
|
int di = 0;
|
||||||
|
for(unsigned int i=0; i<indexes.size(); ++i)
|
||||||
|
{
|
||||||
|
if(indexes[i] == 1)
|
||||||
|
{
|
||||||
|
memcpy(newDescriptors.ptr<float>(di++), descriptors.ptr<float>(i), descriptors.cols*sizeof(float));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
descriptors = newDescriptors;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints)
|
void limitKeypoints(std::vector<cv::KeyPoint> & keypoints, int maxKeypoints)
|
||||||
{
|
{
|
||||||
cv::Mat descriptors;
|
cv::Mat descriptors;
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ Memory::Memory(const ParametersMap & parameters) :
|
|||||||
_badSignRatio(Parameters::defaultKpBadSignRatio()),
|
_badSignRatio(Parameters::defaultKpBadSignRatio()),
|
||||||
_tfIdfLikelihoodUsed(Parameters::defaultKpTfIdfLikelihoodUsed()),
|
_tfIdfLikelihoodUsed(Parameters::defaultKpTfIdfLikelihoodUsed()),
|
||||||
_parallelized(Parameters::defaultKpParallelized()),
|
_parallelized(Parameters::defaultKpParallelized()),
|
||||||
|
_wordsMaxDepth(Parameters::defaultKpMaxDepth()),
|
||||||
_wordsPerImageTarget(Parameters::defaultKpWordsPerImage()),
|
_wordsPerImageTarget(Parameters::defaultKpWordsPerImage()),
|
||||||
_roiRatios(std::vector<float>(4, 0.0f)),
|
_roiRatios(std::vector<float>(4, 0.0f)),
|
||||||
|
|
||||||
@@ -358,6 +359,7 @@ void Memory::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(parameters, Parameters::kKpTfIdfLikelihoodUsed(), _tfIdfLikelihoodUsed);
|
Parameters::parse(parameters, Parameters::kKpTfIdfLikelihoodUsed(), _tfIdfLikelihoodUsed);
|
||||||
Parameters::parse(parameters, Parameters::kKpParallelized(), _parallelized);
|
Parameters::parse(parameters, Parameters::kKpParallelized(), _parallelized);
|
||||||
Parameters::parse(parameters, Parameters::kKpBadSignRatio(), _badSignRatio);
|
Parameters::parse(parameters, Parameters::kKpBadSignRatio(), _badSignRatio);
|
||||||
|
Parameters::parse(parameters, Parameters::kKpMaxDepth(), _wordsMaxDepth);
|
||||||
Parameters::parse(parameters, Parameters::kKpWordsPerImage(), _wordsPerImageTarget);
|
Parameters::parse(parameters, Parameters::kKpWordsPerImage(), _wordsPerImageTarget);
|
||||||
|
|
||||||
if((iter=parameters.find(Parameters::kKpRoiRatios())) != parameters.end())
|
if((iter=parameters.find(Parameters::kKpRoiRatios())) != parameters.end())
|
||||||
@@ -2771,6 +2773,8 @@ void Memory::copyData(const Signature * from, Signature * to)
|
|||||||
|
|
||||||
void Memory::extractKeypointsAndDescriptors(
|
void Memory::extractKeypointsAndDescriptors(
|
||||||
const cv::Mat & image,
|
const cv::Mat & image,
|
||||||
|
const cv::Mat & depth,
|
||||||
|
float depthConstant,
|
||||||
std::vector<cv::KeyPoint> & keypoints,
|
std::vector<cv::KeyPoint> & keypoints,
|
||||||
cv::Mat & descriptors)
|
cv::Mat & descriptors)
|
||||||
{
|
{
|
||||||
@@ -2780,8 +2784,11 @@ void Memory::extractKeypointsAndDescriptors(
|
|||||||
if(_keypointDetector)
|
if(_keypointDetector)
|
||||||
{
|
{
|
||||||
cv::Rect roi = KeypointDetector::computeRoi(image, _roiRatios);
|
cv::Rect roi = KeypointDetector::computeRoi(image, _roiRatios);
|
||||||
keypoints = _keypointDetector->generateKeypoints(image, _wordsPerImageTarget, roi);
|
keypoints = _keypointDetector->generateKeypoints(image, 0, roi);
|
||||||
UDEBUG("time keypoints (%d) = %fs", (int)keypoints.size(), timer.ticks());
|
UDEBUG("time keypoints (%d) = %fs", (int)keypoints.size(), timer.ticks());
|
||||||
|
|
||||||
|
filterKeypointsByDepth(keypoints, depth, depthConstant, _wordsMaxDepth);
|
||||||
|
limitKeypoints(keypoints, _wordsPerImageTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(keypoints.size())
|
if(keypoints.size())
|
||||||
@@ -2876,12 +2883,13 @@ Signature * Memory::createSignature(const Image & image, bool keepRawData)
|
|||||||
descriptors = image.descriptors();
|
descriptors = image.descriptors();
|
||||||
keypoints = image.keypoints();
|
keypoints = image.keypoints();
|
||||||
}
|
}
|
||||||
|
filterKeypointsByDepth(keypoints, descriptors, image.depth(), image.depthConstant(), _wordsMaxDepth);
|
||||||
limitKeypoints(keypoints, descriptors, _wordsPerImageTarget);
|
limitKeypoints(keypoints, descriptors, _wordsPerImageTarget);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// IMAGE RAW
|
// IMAGE RAW
|
||||||
this->extractKeypointsAndDescriptors(image.image(), keypoints, descriptors);
|
this->extractKeypointsAndDescriptors(image.image(), image.depth(), image.depthConstant(), keypoints, descriptors);
|
||||||
|
|
||||||
UDEBUG("ratio=%f, meanWordsPerLocation=%d", _badSignRatio, meanWordsPerLocation);
|
UDEBUG("ratio=%f, meanWordsPerLocation=%d", _badSignRatio, meanWordsPerLocation);
|
||||||
if(descriptors.rows && descriptors.rows < _badSignRatio * float(meanWordsPerLocation))
|
if(descriptors.rows && descriptors.rows < _badSignRatio * float(meanWordsPerLocation))
|
||||||
|
|||||||
@@ -187,7 +187,7 @@ Transform OdometryBinary::computeTransform(Image & image)
|
|||||||
|
|
||||||
if(_lastKeypoints.size())
|
if(_lastKeypoints.size())
|
||||||
{
|
{
|
||||||
if(newDescriptors.rows && newDescriptors.rows > _lastKeypoints.size()/2) // at least 50% keypoints
|
if(newDescriptors.rows && newDescriptors.rows > (int)_lastKeypoints.size()/2) // at least 50% keypoints
|
||||||
{
|
{
|
||||||
cv::Mat results;
|
cv::Mat results;
|
||||||
cv::Mat dists;
|
cv::Mat dists;
|
||||||
@@ -379,6 +379,7 @@ OdometryBOW::OdometryBOW(
|
|||||||
{
|
{
|
||||||
ParametersMap customParameters;
|
ParametersMap customParameters;
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), uNumber2Str(maxWords)));
|
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), uNumber2Str(maxWords)));
|
||||||
|
customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(maxDepth)));
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpDetectorStrategy(), uNumber2Str(detectorType)));
|
customParameters.insert(ParametersPair(Parameters::kKpDetectorStrategy(), uNumber2Str(detectorType)));
|
||||||
customParameters.insert(ParametersPair(Parameters::kSURFHessianThreshold(), uNumber2Str(surfHessianThreshold)));
|
customParameters.insert(ParametersPair(Parameters::kSURFHessianThreshold(), uNumber2Str(surfHessianThreshold)));
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpNndrRatio(), uNumber2Str(nndr)));
|
customParameters.insert(ParametersPair(Parameters::kKpNndrRatio(), uNumber2Str(nndr)));
|
||||||
@@ -396,6 +397,7 @@ OdometryBOW::OdometryBOW(const ParametersMap & parameters) :
|
|||||||
{
|
{
|
||||||
ParametersMap customParameters;
|
ParametersMap customParameters;
|
||||||
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), uNumber2Str(this->getMaxFeatures()))); // hack
|
customParameters.insert(ParametersPair(Parameters::kKpWordsPerImage(), uNumber2Str(this->getMaxFeatures()))); // hack
|
||||||
|
customParameters.insert(ParametersPair(Parameters::kKpMaxDepth(), uNumber2Str(this->getMaxDepth())));
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
customParameters.insert(ParametersPair(Parameters::kMemRehearsalSimilarity(), "1.0")); // desactivate rehearsal
|
||||||
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false"));
|
customParameters.insert(ParametersPair(Parameters::kMemImageKept(), "false"));
|
||||||
if(!_memory->init("", false, customParameters, false))
|
if(!_memory->init("", false, customParameters, false))
|
||||||
@@ -427,7 +429,7 @@ Transform OdometryBOW::computeTransform(Image & image)
|
|||||||
|
|
||||||
std::vector<cv::KeyPoint> keypoints;
|
std::vector<cv::KeyPoint> keypoints;
|
||||||
cv::Mat descriptors;
|
cv::Mat descriptors;
|
||||||
_memory->extractKeypointsAndDescriptors(image.image(), keypoints, descriptors);
|
_memory->extractKeypointsAndDescriptors(image.image(), image.depth(), image.depthConstant(), keypoints, descriptors);
|
||||||
|
|
||||||
image.setDescriptors(descriptors);
|
image.setDescriptors(descriptors);
|
||||||
image.setKeypoints(keypoints);
|
image.setKeypoints(keypoints);
|
||||||
|
|||||||
@@ -405,6 +405,18 @@ void findCorrespondences(
|
|||||||
inliers2.resize(oi);
|
inliers2.resize(oi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pcl::PointXYZ getDepth(
|
||||||
|
const cv::Mat & depthImage,
|
||||||
|
int x, int y,
|
||||||
|
float depthConstant)
|
||||||
|
{
|
||||||
|
return getDepth(depthImage, x, y,
|
||||||
|
(float)depthImage.cols/2,
|
||||||
|
(float)depthImage.rows/2,
|
||||||
|
1.0f/depthConstant,
|
||||||
|
1.0f/depthConstant);
|
||||||
|
}
|
||||||
|
|
||||||
pcl::PointXYZ getDepth(const cv::Mat & depthImage,
|
pcl::PointXYZ getDepth(const cv::Mat & depthImage,
|
||||||
int x, int y,
|
int x, int y,
|
||||||
float cx, float cy,
|
float cx, float cy,
|
||||||
|
|||||||
@@ -293,6 +293,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->checkBox_dictionary_nndrUsed->setObjectName(Parameters::kKpNndrUsed().c_str());
|
_ui->checkBox_dictionary_nndrUsed->setObjectName(Parameters::kKpNndrUsed().c_str());
|
||||||
_ui->surf_doubleSpinBox_nndrRatio->setObjectName(Parameters::kKpNndrRatio().c_str());
|
_ui->surf_doubleSpinBox_nndrRatio->setObjectName(Parameters::kKpNndrRatio().c_str());
|
||||||
_ui->surf_spinBox_maxLeafs->setObjectName(Parameters::kKpMaxLeafs().c_str());
|
_ui->surf_spinBox_maxLeafs->setObjectName(Parameters::kKpMaxLeafs().c_str());
|
||||||
|
_ui->surf_doubleSpinBox_maxDepth->setObjectName(Parameters::kKpMaxDepth().c_str());
|
||||||
_ui->surf_spinBox_wordsPerImageTarget->setObjectName(Parameters::kKpWordsPerImage().c_str());
|
_ui->surf_spinBox_wordsPerImageTarget->setObjectName(Parameters::kKpWordsPerImage().c_str());
|
||||||
_ui->surf_doubleSpinBox_ratioBadSign->setObjectName(Parameters::kKpBadSignRatio().c_str());
|
_ui->surf_doubleSpinBox_ratioBadSign->setObjectName(Parameters::kKpBadSignRatio().c_str());
|
||||||
_ui->checkBox_kp_tfIdfLikelihoodUsed->setObjectName(Parameters::kKpTfIdfLikelihoodUsed().c_str());
|
_ui->checkBox_kp_tfIdfLikelihoodUsed->setObjectName(Parameters::kKpTfIdfLikelihoodUsed().c_str());
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>15</number>
|
<number>9</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29">
|
<layout class="QVBoxLayout" name="verticalLayout_29">
|
||||||
@@ -2790,12 +2790,9 @@ see Sqlite3 doc 'PRAGMA temp_store'.</string>
|
|||||||
<property name="title">
|
<property name="title">
|
||||||
<string>Visual word</string>
|
<string>Visual word</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_39">
|
<layout class="QVBoxLayout" name="verticalLayout_38">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QFormLayout" name="formLayout_7">
|
<layout class="QFormLayout" name="formLayout_7">
|
||||||
<property name="fieldGrowthPolicy">
|
|
||||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_kp_publishKeypoints">
|
<widget class="QCheckBox" name="checkBox_kp_publishKeypoints">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -2817,6 +2814,44 @@ see Sqlite3 doc 'PRAGMA temp_store'.</string>
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="surf_doubleSpinBox_maxDepth">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</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>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_53">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>0 means that the response (hessian) threshold
|
||||||
|
used for the detector will not be adapted.
|
||||||
|
Otherwise, the threshold is modified to
|
||||||
|
generate the number of words requested.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Maximum words depth (0 means inf). Only used when a depth image is provided. Applied before "Maximum words per image".</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
<widget class="QSpinBox" name="surf_spinBox_wordsPerImageTarget">
|
<widget class="QSpinBox" name="surf_spinBox_wordsPerImageTarget">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
@@ -2829,7 +2864,7 @@ see Sqlite3 doc 'PRAGMA temp_store'.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLabel" name="label_22">
|
<widget class="QLabel" name="label_22">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>0 means that the response (hessian) threshold
|
<string>0 means that the response (hessian) threshold
|
||||||
@@ -2845,7 +2880,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="surf_doubleSpinBox_ratioBadSign">
|
<widget class="QDoubleSpinBox" name="surf_doubleSpinBox_ratioBadSign">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
@@ -2864,7 +2899,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_81">
|
<widget class="QLabel" name="label_81">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string>0 means that the response (hessian) threshold
|
<string>0 means that the response (hessian) threshold
|
||||||
@@ -2880,7 +2915,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_kp_tfIdfLikelihoodUsed">
|
<widget class="QCheckBox" name="checkBox_kp_tfIdfLikelihoodUsed">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -2890,7 +2925,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="label_82">
|
<widget class="QLabel" name="label_82">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Use the tf-idf method to compute the likelihood.</string>
|
<string>Use the tf-idf method to compute the likelihood.</string>
|
||||||
@@ -2900,7 +2935,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="5" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_kp_parallelized">
|
<widget class="QCheckBox" name="checkBox_kp_parallelized">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
@@ -2910,7 +2945,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="5" column="1">
|
||||||
<widget class="QLabel" name="label_94">
|
<widget class="QLabel" name="label_94">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>If the dictionary update and signature creation were parallelized.</string>
|
<string>If the dictionary update and signature creation were parallelized.</string>
|
||||||
@@ -2920,14 +2955,14 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="6" column="0">
|
||||||
<widget class="QLineEdit" name="lineEdit_kp_roi">
|
<widget class="QLineEdit" name="lineEdit_kp_roi">
|
||||||
<property name="readOnly">
|
<property name="readOnly">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="6" column="1">
|
||||||
<widget class="QLabel" name="label_101">
|
<widget class="QLabel" name="label_101">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>ROI ratios [left, right, top, bottom].</string>
|
<string>ROI ratios [left, right, top, bottom].</string>
|
||||||
@@ -2937,7 +2972,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="0">
|
<item row="7" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi0">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi0">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> %</string>
|
<string> %</string>
|
||||||
@@ -2947,7 +2982,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="6" column="1">
|
<item row="7" column="1">
|
||||||
<widget class="QLabel" name="label_97">
|
<widget class="QLabel" name="label_97">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Left ROI ratio (0 = no change).</string>
|
<string>Left ROI ratio (0 = no change).</string>
|
||||||
@@ -2957,7 +2992,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="0">
|
<item row="8" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi1">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi1">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> %</string>
|
<string> %</string>
|
||||||
@@ -2967,7 +3002,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="7" column="1">
|
<item row="8" column="1">
|
||||||
<widget class="QLabel" name="label_98">
|
<widget class="QLabel" name="label_98">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Right ROI ratio (0 = no change).</string>
|
<string>Right ROI ratio (0 = no change).</string>
|
||||||
@@ -2977,7 +3012,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="0">
|
<item row="9" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi2">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi2">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> %</string>
|
<string> %</string>
|
||||||
@@ -2987,7 +3022,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="8" column="1">
|
<item row="9" column="1">
|
||||||
<widget class="QLabel" name="label_99">
|
<widget class="QLabel" name="label_99">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Top ROI ratio (0 = no change).</string>
|
<string>Top ROI ratio (0 = no change).</string>
|
||||||
@@ -2997,7 +3032,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="0">
|
<item row="10" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi3">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_kp_roi3">
|
||||||
<property name="suffix">
|
<property name="suffix">
|
||||||
<string> %</string>
|
<string> %</string>
|
||||||
@@ -3007,7 +3042,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="9" column="1">
|
<item row="10" column="1">
|
||||||
<widget class="QLabel" name="label_100">
|
<widget class="QLabel" name="label_100">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Bottom ROI ratio (0 = no change).</string>
|
<string>Bottom ROI ratio (0 = no change).</string>
|
||||||
@@ -3017,17 +3052,7 @@ generate the number of words requested.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="10" column="1">
|
<item row="11" column="0">
|
||||||
<widget class="QLabel" name="label_117">
|
|
||||||
<property name="text">
|
|
||||||
<string>Visual word type.</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="10" column="0">
|
|
||||||
<widget class="QComboBox" name="comboBox_detector_strategy">
|
<widget class="QComboBox" name="comboBox_detector_strategy">
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -3041,6 +3066,16 @@ generate the number of words requested.</string>
|
|||||||
</item>
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="11" column="1">
|
||||||
|
<widget class="QLabel" name="label_117">
|
||||||
|
<property name="text">
|
||||||
|
<string>Visual word type.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -4144,7 +4179,10 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
|
|||||||
<item row="3" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QLabel" name="label_146">
|
<widget class="QLabel" name="label_146">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Max feature depth.</string>
|
<string>Max feature depth. Note that parameter "Visual Word"->"Max words depth" is applied before this.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user