39 #include <opencv2/imgproc/imgproc_c.h>
40 #include <opencv2/core/version.hpp>
41 #include <opencv2/opencv_modules.hpp>
43 #ifdef RTABMAP_ORB_OCTREE
55 #if CV_MAJOR_VERSION < 3
57 #ifdef HAVE_OPENCV_GPU
58 #include <opencv2/gpu/gpu.hpp>
61 #include <opencv2/core/cuda.hpp>
64 #ifdef HAVE_OPENCV_NONFREE
65 #if CV_MAJOR_VERSION == 2 && CV_MINOR_VERSION >=4
66 #include <opencv2/nonfree/gpu.hpp>
67 #include <opencv2/nonfree/features2d.hpp>
70 #ifdef HAVE_OPENCV_XFEATURES2D
71 #include <opencv2/xfeatures2d.hpp>
72 #include <opencv2/xfeatures2d/nonfree.hpp>
73 #include <opencv2/xfeatures2d/cuda.hpp>
75 #ifdef HAVE_OPENCV_CUDAFEATURES2D
76 #include <opencv2/cudafeatures2d.hpp>
78 #ifdef HAVE_OPENCV_CUDAIMGPROC
79 #include <opencv2/cudaimgproc.hpp>
86 #ifdef RTABMAP_CUDASIFT
87 #include <cudasift/cudaImage.h>
88 #include <cudasift/cudaSift.h>
93 std::vector<cv::KeyPoint> & keypoints,
94 const cv::Mat & depth,
103 std::vector<cv::KeyPoint> & keypoints,
104 cv::Mat & descriptors,
105 const cv::Mat & depth,
110 UASSERT(maxDepth <= 0.0f || maxDepth > minDepth);
111 if(!depth.empty() && (descriptors.empty() || descriptors.rows == (
int)keypoints.size()))
113 std::vector<cv::KeyPoint> output(keypoints.size());
114 std::vector<int> indexes(keypoints.size(), 0);
116 bool isInMM = depth.type() == CV_16UC1;
117 for(
unsigned int i=0;
i<keypoints.size(); ++
i)
119 int u =
int(keypoints[
i].pt.x+0.5f);
120 int v =
int(keypoints[
i].pt.y+0.5f);
121 if(u >=0 && u<depth.cols && v >=0 &&
v<depth.rows)
123 float d = isInMM?(
float)depth.at<
uint16_t>(
v,u)*0.001f:depth.at<
float>(
v,u);
124 if(
uIsFinite(
d) &&
d>minDepth && (maxDepth <= 0.0f ||
d < maxDepth))
126 output[oi++] = keypoints[
i];
134 if(!descriptors.empty() && (
int)keypoints.size() != descriptors.rows)
136 if(keypoints.size() == 0)
138 descriptors = cv::Mat();
142 cv::Mat newDescriptors((
int)keypoints.size(), descriptors.cols, descriptors.type());
144 for(
unsigned int i=0;
i<indexes.size(); ++
i)
148 if(descriptors.type() == CV_32FC1)
150 memcpy(newDescriptors.ptr<
float>(di++), descriptors.ptr<
float>(
i), descriptors.cols*
sizeof(
float));
154 memcpy(newDescriptors.ptr<
char>(di++), descriptors.ptr<
char>(
i), descriptors.cols*
sizeof(
char));
158 descriptors = newDescriptors;
165 std::vector<cv::KeyPoint> & keypoints,
166 cv::Mat & descriptors,
167 std::vector<cv::Point3f> & keypoints3D,
173 UASSERT(((
int)keypoints.size() == descriptors.rows || descriptors.empty()) &&
174 keypoints3D.size() == keypoints.size());
175 std::vector<cv::KeyPoint> validKeypoints(keypoints.size());
176 std::vector<cv::Point3f> validKeypoints3D(keypoints.size());
177 cv::Mat validDescriptors(descriptors.size(), descriptors.type());
180 float minDepthSqr = minDepth * minDepth;
181 float maxDepthSqr = maxDepth * maxDepth;
182 for(
unsigned int i=0;
i<keypoints3D.size(); ++
i)
184 cv::Point3f & pt = keypoints3D[
i];
187 float distSqr = pt.x*pt.x+pt.y*pt.y+pt.z*pt.z;
188 if(distSqr >= minDepthSqr && (maxDepthSqr==0.0
f || distSqr <= maxDepthSqr))
190 validKeypoints[oi] = keypoints[
i];
191 validKeypoints3D[oi] = pt;
192 if(!descriptors.empty())
194 descriptors.row(
i).copyTo(validDescriptors.row(oi));
200 UDEBUG(
"Removed %d invalid 3D points", (
int)keypoints3D.size()-oi);
201 validKeypoints.resize(oi);
202 validKeypoints3D.resize(oi);
203 keypoints = validKeypoints;
204 keypoints3D = validKeypoints3D;
205 if(!descriptors.empty())
207 descriptors = validDescriptors.rowRange(0, oi).clone();
212 std::vector<cv::KeyPoint> & keypoints,
213 const cv::Mat & disparity,
221 std::vector<cv::KeyPoint> & keypoints,
222 cv::Mat & descriptors,
223 const cv::Mat & disparity,
226 if(!disparity.empty() && minDisparity > 0.0f && (descriptors.empty() || descriptors.rows == (
int)keypoints.size()))
228 std::vector<cv::KeyPoint> output(keypoints.size());
229 std::vector<int> indexes(keypoints.size(), 0);
231 for(
unsigned int i=0;
i<keypoints.size(); ++
i)
233 int u =
int(keypoints[
i].pt.x+0.5f);
234 int v =
int(keypoints[
i].pt.y+0.5f);
235 if(u >=0 && u<disparity.cols && v >=0 &&
v<disparity.rows)
237 float d = disparity.type() == CV_16SC1?
float(disparity.at<
short>(
v,u))/16.0f:disparity.at<
float>(
v,u);
240 output[oi++] = keypoints[
i];
248 if(!descriptors.empty() && (
int)keypoints.size() != descriptors.rows)
250 if(keypoints.size() == 0)
252 descriptors = cv::Mat();
256 cv::Mat newDescriptors((
int)keypoints.size(), descriptors.cols, descriptors.type());
258 for(
unsigned int i=0;
i<indexes.size(); ++
i)
262 if(descriptors.type() == CV_32FC1)
264 memcpy(newDescriptors.ptr<
float>(di++), descriptors.ptr<
float>(
i), descriptors.cols*
sizeof(
float));
268 memcpy(newDescriptors.ptr<
char>(di++), descriptors.ptr<
char>(
i), descriptors.cols*
sizeof(
char));
272 descriptors = newDescriptors;
281 limitKeypoints(keypoints, descriptors, maxKeypoints, imageSize, ssc);
284 void Feature2D::limitKeypoints(std::vector<cv::KeyPoint> & keypoints, cv::Mat & descriptors,
int maxKeypoints,
const cv::Size & imageSize,
bool ssc)
286 std::vector<cv::Point3f> keypoints3D;
287 limitKeypoints(keypoints, keypoints3D, descriptors, maxKeypoints, imageSize, ssc);
290 void Feature2D::limitKeypoints(std::vector<cv::KeyPoint> & keypoints, std::vector<cv::Point3f> & keypoints3D, cv::Mat & descriptors,
int maxKeypoints,
const cv::Size & imageSize,
bool ssc)
292 UASSERT_MSG((
int)keypoints.size() == descriptors.rows || descriptors.rows == 0,
uFormat(
"keypoints=%d descriptors=%d", (
int)keypoints.size(), descriptors.rows).c_str());
293 UASSERT_MSG(keypoints.size() == keypoints3D.size() || keypoints3D.size() == 0,
uFormat(
"keypoints=%d keypoints3D=%d", (
int)keypoints.size(), (
int)keypoints3D.size()).c_str());
294 if(maxKeypoints > 0 && (
int)keypoints.size() > maxKeypoints)
298 std::vector<cv::KeyPoint> kptsTmp;
299 std::vector<cv::Point3f> kpts3DTmp;
300 cv::Mat descriptorsTmp;
303 ULOGGER_DEBUG(
"too much words (%d), removing words with SSC", keypoints.size());
306 std::vector<float> responseVector;
307 for (
unsigned int i = 0;
i < keypoints.size();
i++)
309 responseVector.push_back(keypoints[
i].response);
311 std::vector<int> indx(responseVector.size());
312 std::iota(std::begin(indx), std::end(indx), 0);
314 #if CV_MAJOR_VERSION >= 4
315 cv::sortIdx(responseVector, indx, cv::SORT_DESCENDING);
317 cv::sortIdx(responseVector, indx, CV_SORT_DESCENDING);
320 static constexpr
float tolerance = 0.1;
321 auto ResultVec =
util2d::SSC(keypoints, maxKeypoints, tolerance, imageSize.width, imageSize.height, indx);
322 removed = keypoints.size()-ResultVec.size();
324 kptsTmp.resize(ResultVec.size());
325 if(!keypoints3D.empty())
327 kpts3DTmp.resize(ResultVec.size());
331 descriptorsTmp = cv::Mat(ResultVec.size(), descriptors.cols, descriptors.type());
333 for(
unsigned int k=0; k<ResultVec.size(); ++k)
335 kptsTmp[k] = keypoints[ResultVec[k]];
336 if(keypoints3D.size())
338 kpts3DTmp[k] = keypoints3D[ResultVec[k]];
342 if(descriptors.type() == CV_32FC1)
344 memcpy(descriptorsTmp.ptr<
float>(k), descriptors.ptr<
float>(ResultVec[k]), descriptors.cols*
sizeof(
float));
348 memcpy(descriptorsTmp.ptr<
char>(k), descriptors.ptr<
char>(ResultVec[k]), descriptors.cols*
sizeof(
char));
355 ULOGGER_DEBUG(
"too many words (%d), removing words with the hessian threshold", keypoints.size());
359 std::multimap<float, int> hessianMap;
360 for(
unsigned int i = 0;
i <keypoints.size(); ++
i)
363 hessianMap.insert(std::pair<float, int>(
fabs(keypoints[
i].response),
i));
367 removed = (
int)hessianMap.size()-maxKeypoints;
368 std::multimap<float, int>::reverse_iterator
iter = hessianMap.rbegin();
369 kptsTmp.resize(maxKeypoints);
370 if(!keypoints3D.empty())
372 kpts3DTmp.resize(maxKeypoints);
376 descriptorsTmp = cv::Mat(maxKeypoints, descriptors.cols, descriptors.type());
378 for(
unsigned int k=0; k<kptsTmp.size() &&
iter!=hessianMap.rend(); ++k, ++
iter)
380 kptsTmp[k] = keypoints[
iter->second];
381 if(keypoints3D.size())
383 kpts3DTmp[k] = keypoints3D[
iter->second];
387 if(descriptors.type() == CV_32FC1)
389 memcpy(descriptorsTmp.ptr<
float>(k), descriptors.ptr<
float>(
iter->second), descriptors.cols*
sizeof(
float));
393 memcpy(descriptorsTmp.ptr<
char>(k), descriptors.ptr<
char>(
iter->second), descriptors.cols*
sizeof(
char));
398 ULOGGER_DEBUG(
"%d keypoints removed, (kept %d), minimum response=%f", removed, (
int)kptsTmp.size(), !ssc&&kptsTmp.size()?kptsTmp.back().response:0.0f);
401 keypoints3D = kpts3DTmp;
404 descriptors = descriptorsTmp;
409 void Feature2D::limitKeypoints(
const std::vector<cv::KeyPoint> & keypoints, std::vector<bool> & inliers,
int maxKeypoints,
const cv::Size & imageSize,
bool ssc)
411 if(maxKeypoints > 0 && (
int)keypoints.size() > maxKeypoints)
414 float minimumHessian = 0.0f;
416 inliers.resize(keypoints.size(),
false);
419 ULOGGER_DEBUG(
"too much words (%d), removing words with SSC", keypoints.size());
422 std::vector<float> responseVector;
423 for (
unsigned int i = 0;
i < keypoints.size();
i++)
425 responseVector.push_back(keypoints[
i].response);
427 std::vector<int> indx(responseVector.size());
428 std::iota(std::begin(indx), std::end(indx), 0);
430 #if CV_MAJOR_VERSION >= 4
431 cv::sortIdx(responseVector, indx, cv::SORT_DESCENDING);
433 cv::sortIdx(responseVector, indx, CV_SORT_DESCENDING);
436 static constexpr
float tolerance = 0.1;
437 auto ResultVec =
util2d::SSC(keypoints, maxKeypoints, tolerance, imageSize.width, imageSize.height, indx);
438 removed = keypoints.size()-ResultVec.size();
439 for(
unsigned int k=0; k<ResultVec.size(); ++k)
441 inliers[ResultVec[k]] =
true;
446 ULOGGER_DEBUG(
"too much words (%d), removing words with the hessian threshold", keypoints.size());
450 std::multimap<float, int> hessianMap;
451 for(
unsigned int i = 0;
i<keypoints.size(); ++
i)
454 hessianMap.insert(std::pair<float, int>(
fabs(keypoints[
i].response),
i));
458 removed = (
int)hessianMap.size()-maxKeypoints;
459 std::multimap<float, int>::reverse_iterator
iter = hessianMap.rbegin();
460 for(
int k=0; k<maxKeypoints &&
iter!=hessianMap.rend(); ++k, ++
iter)
462 inliers[
iter->second] =
true;
463 minimumHessian =
iter->first;
466 ULOGGER_DEBUG(
"%d keypoints removed, (kept %d), minimum response=%f", removed, maxKeypoints, minimumHessian);
471 ULOGGER_DEBUG(
"keeping all %d keypoints", (
int)keypoints.size());
472 inliers.resize(keypoints.size(),
true);
476 void Feature2D::limitKeypoints(
const std::vector<cv::KeyPoint> & keypoints, std::vector<bool> & inliers,
int maxKeypoints,
const cv::Size & imageSize,
int gridRows,
int gridCols,
bool ssc)
478 if(maxKeypoints <= 0 || (
int)keypoints.size() <= maxKeypoints)
480 inliers.resize(keypoints.size(),
true);
483 UASSERT(gridCols>=1 && gridRows >=1);
484 UASSERT(imageSize.height>gridRows && imageSize.width>gridCols);
485 int rowSize = imageSize.height / gridRows;
486 int colSize = imageSize.width / gridCols;
487 int maxKeypointsPerCell = maxKeypoints / (gridRows * gridCols);
488 std::vector<std::vector<cv::KeyPoint> > keypointsPerCell(gridRows * gridCols);
489 std::vector<std::vector<int> > indexesPerCell(gridRows * gridCols);
490 for(
size_t i=0;
i<keypoints.size(); ++
i)
492 int cellRow =
int(keypoints[
i].pt.y)/rowSize;
493 int cellCol =
int(keypoints[
i].pt.x)/colSize;
494 UASSERT(cellRow >=0 && cellRow < gridRows);
495 UASSERT(cellCol >=0 && cellCol < gridCols);
497 keypointsPerCell[cellRow*gridCols + cellCol].push_back(keypoints[
i]);
498 indexesPerCell[cellRow*gridCols + cellCol].push_back(
i);
500 inliers.resize(keypoints.size(),
false);
501 for(
size_t i=0;
i<keypointsPerCell.size(); ++
i)
503 std::vector<bool> inliersCell;
504 limitKeypoints(keypointsPerCell[
i], inliersCell, maxKeypointsPerCell, cv::Size(colSize, rowSize), ssc);
505 for(
size_t j=0;
j<inliersCell.size(); ++
j)
509 inliers.at(indexesPerCell[
i][
j]) =
true;
529 maxFeatures_(
Parameters::defaultKpMaxFeatures()),
534 _subPixWinSize(
Parameters::defaultKpSubPixWinSize()),
535 _subPixIterations(
Parameters::defaultKpSubPixIterations()),
564 ParametersMap::const_iterator
iter;
565 if((
iter=parameters.find(Parameters::kKpRoiRatios())) != parameters.end())
567 std::list<std::string> strValues =
uSplit(
iter->second,
' ');
568 if(strValues.size() != 4)
570 ULOGGER_ERROR(
"The number of values must be 4 (roi=\"%s\")",
iter->second.c_str());
574 std::vector<float> tmpValues(4);
576 for(std::list<std::string>::iterator jter = strValues.begin(); jter!=strValues.end(); ++jter)
582 if(tmpValues[0] >= 0 && tmpValues[0] < 1 && tmpValues[0] < 1.0
f-tmpValues[1] &&
583 tmpValues[1] >= 0 && tmpValues[1] < 1 && tmpValues[1] < 1.0
f-tmpValues[0] &&
584 tmpValues[2] >= 0 && tmpValues[2] < 1 && tmpValues[2] < 1.0
f-tmpValues[3] &&
585 tmpValues[3] >= 0 && tmpValues[3] < 1 && tmpValues[3] < 1.0
f-tmpValues[2])
591 ULOGGER_ERROR(
"The roi ratios are not valid (roi=\"%s\")",
iter->second.c_str());
598 if((
iter=parameters.find(Parameters::kStereoOpticalFlow())) != parameters.end())
610 int type = Parameters::defaultKpDetectorStrategy();
618 #if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
620 #ifndef RTABMAP_NONFREE
623 #if CV_MAJOR_VERSION < 3
624 UWARN(
"SURF and SIFT features cannot be used because OpenCV was not built with nonfree module. GFTT/ORB is used instead.");
626 UWARN(
"SURF and SIFT features cannot be used because OpenCV was not built with xfeatures2d module. GFTT/ORB is used instead.");
632 #else // >= 4.4.0 >= 3.4.11
634 #ifndef RTABMAP_NONFREE
637 UWARN(
"SURF features cannot be used because OpenCV was not built with nonfree module. SIFT is used instead.");
642 UWARN(
"SURF detector cannot be used because OpenCV was not built with nonfree module. GFTT/ORB is used instead.");
647 #endif // >= 4.4.0 >= 3.4.11
649 #if !defined(HAVE_OPENCV_XFEATURES2D) && CV_MAJOR_VERSION >= 3
658 UWARN(
"BRIEF, FREAK and DAISY features cannot be used because OpenCV was not built with xfeatures2d module. GFTT/ORB is used instead.");
661 #elif CV_MAJOR_VERSION < 3
664 #ifdef RTABMAP_NONFREE
665 UWARN(
"KAZE detector/descriptor can be used only with OpenCV3. SURF is used instead.");
668 UWARN(
"KAZE detector/descriptor can be used only with OpenCV3. GFTT/ORB is used instead.");
674 UWARN(
"DAISY detector/descriptor can be used only with OpenCV3. GFTT/BRIEF is used instead.");
680 #ifndef RTABMAP_ORB_OCTREE
683 UWARN(
"ORB OcTree feature cannot be used as RTAB-Map is not built with the option enabled. GFTT/ORB is used instead.");
688 #ifndef RTABMAP_TORCH
691 UWARN(
"SupertPoint Torch feature cannot be used as RTAB-Map is not built with the option enabled. GFTT/ORB is used instead.");
700 feature2D =
new SURF(parameters);
703 feature2D =
new SIFT(parameters);
706 feature2D =
new ORB(parameters);
721 feature2D =
new GFTT_ORB(parameters);
724 feature2D =
new BRISK(parameters);
727 feature2D =
new KAZE(parameters);
746 #ifdef RTABMAP_PYTHON
751 #ifdef RTABMAP_NONFREE
753 feature2D =
new SURF(parameters);
758 feature2D =
new ORB(parameters);
770 UASSERT(image.type() == CV_8UC1);
775 if(maskIn.type()==CV_16UC1 || maskIn.type() == CV_32FC1)
777 mask = cv::Mat::zeros(maskIn.rows, maskIn.cols, CV_8UC1);
781 if(maskIn.type()==CV_16UC1)
783 if(((
unsigned short*)maskIn.data)[
i] > 0 &&
786 value =
float(((
unsigned short*)maskIn.data)[
i])*0.001f;
791 value = ((
float*)maskIn.data)[
i];
798 ((
unsigned char*)
mask.data)[
i] = 255;
802 else if(maskIn.type()==CV_8UC1)
809 UERROR(
"Wrong mask type (%d)! Should be 8UC1, 16UC1 or 32FC1.", maskIn.type());
815 std::vector<cv::KeyPoint> keypoints;
818 if(!(globalRoi.width && globalRoi.height))
820 globalRoi = cv::Rect(0,0,image.cols, image.rows);
824 int rowSize = globalRoi.height /
gridRows_;
825 int colSize = globalRoi.width /
gridCols_;
831 cv::Rect roi(globalRoi.x +
j*colSize, globalRoi.y +
i*rowSize, colSize, rowSize);
832 std::vector<cv::KeyPoint> subKeypoints;
834 if (this->
getType() != Feature2D::Type::kFeaturePyDetector)
841 for(std::vector<cv::KeyPoint>::iterator
iter=subKeypoints.begin();
iter!=subKeypoints.end(); ++
iter)
847 keypoints.insert( keypoints.end(), subKeypoints.begin(), subKeypoints.end() );
850 UDEBUG(
"Keypoints extraction time = %f s, keypoints extracted = %d (grid=%dx%d, mask empty=%d)",
855 std::vector<cv::Point2f>
corners;
856 cv::KeyPoint::convert(keypoints,
corners);
857 cv::cornerSubPix( image,
corners,
873 const cv::Mat & image,
874 std::vector<cv::KeyPoint> & keypoints)
const
880 UASSERT(image.type() == CV_8UC1);
882 UASSERT_MSG(descriptors.rows == (
int)keypoints.size(),
uFormat(
"descriptors=%d, keypoints=%d", descriptors.rows, (
int)keypoints.size()).c_str());
883 UDEBUG(
"Descriptors extracted = %d, remaining kpts=%d", descriptors.rows, (
int)keypoints.size());
890 const std::vector<cv::KeyPoint> & keypoints)
const
892 std::vector<cv::Point3f> keypoints3D;
895 if(!
data.rightRaw().empty() && !
data.imageRaw().empty() &&
896 !
data.stereoCameraModels().empty() &&
897 data.stereoCameraModels()[0].isValidForProjection())
900 cv::Mat imageLeft =
data.imageRaw();
901 cv::Mat imageRight =
data.rightRaw();
902 #ifdef HAVE_OPENCV_CUDEV
903 cv::cuda::GpuMat d_imageLeft;
904 cv::cuda::GpuMat d_imageRight;
907 d_imageLeft =
data.imageRawGpu();
908 if(d_imageLeft.empty()) {
909 d_imageLeft = cv::cuda::GpuMat(imageLeft);
912 if(d_imageLeft.channels() > 1) {
913 cv::cuda::GpuMat tmp;
914 cv::cuda::cvtColor(d_imageLeft, tmp, cv::COLOR_BGR2GRAY);
918 d_imageRight =
data.depthOrRightRawGpu();
919 if(d_imageRight.empty()) {
920 d_imageRight = cv::cuda::GpuMat(imageRight);
923 if(d_imageRight.channels() > 1) {
924 cv::cuda::GpuMat tmp;
925 cv::cuda::cvtColor(d_imageRight, tmp, cv::COLOR_BGR2GRAY);
933 if(imageLeft.channels() > 1)
935 cv::cvtColor(
data.imageRaw(), imageLeft, cv::COLOR_BGR2GRAY);
937 if(imageRight.channels() > 1)
939 cv::cvtColor(
data.rightRaw(), imageRight, cv::COLOR_BGR2GRAY);
943 std::vector<cv::Point2f> leftCorners;
944 cv::KeyPoint::convert(keypoints, leftCorners);
946 std::vector<cv::Point2f> rightCorners;
948 if(
data.stereoCameraModels().size() == 1)
950 std::vector<unsigned char> status;
951 #ifdef HAVE_OPENCV_CUDEV
973 for(
size_t i=0;
i<status.size(); ++
i)
980 if(rejected > (
int)status.size()/2)
982 UWARN(
"A large number (%d/%d) of stereo correspondences are rejected! "
983 "Optical flow may have failed because images are not calibrated, "
984 "the background is too far (no disparity between the images), "
985 "maximum disparity may be too small (%f) or that exposure between "
986 "left and right images is too different.",
996 data.stereoCameraModels()[0],
1003 int subImageWith = imageLeft.cols /
data.stereoCameraModels().size();
1004 UASSERT(imageLeft.cols % subImageWith == 0);
1005 std::vector<std::vector<cv::Point2f> > subLeftCorners(
data.stereoCameraModels().size());
1006 std::vector<std::vector<int> > subIndex(
data.stereoCameraModels().size());
1008 for(
size_t i=0;
i<leftCorners.size(); ++
i)
1010 int cameraIndex =
int(leftCorners[
i].
x / subImageWith);
1011 leftCorners[
i].x -= cameraIndex*subImageWith;
1012 subLeftCorners[cameraIndex].push_back(leftCorners[
i]);
1013 subIndex[cameraIndex].push_back(
i);
1016 keypoints3D.resize(keypoints.size());
1019 for(
size_t i=0;
i<
data.stereoCameraModels().
size(); ++
i)
1021 if(!subLeftCorners[
i].
empty())
1023 std::vector<unsigned char> status;
1024 #ifdef HAVE_OPENCV_CUDEV
1028 d_imageLeft.colRange(cv::Range(subImageWith*
i, subImageWith*(
i+1))),
1029 d_imageRight.colRange(cv::Range(subImageWith*
i, subImageWith*(
i+1))),
1037 imageLeft.colRange(cv::Range(subImageWith*
i, subImageWith*(
i+1))),
1038 imageRight.colRange(cv::Range(subImageWith*
i, subImageWith*(
i+1))),
1046 data.stereoCameraModels()[
i],
1053 for(
size_t i=0;
i<status.size(); ++
i)
1060 total+=status.size();
1064 for(
size_t j=0;
j<subKeypoints3D.size(); ++
j)
1066 keypoints3D[subIndex[
i][
j]] = subKeypoints3D[
j];
1073 if(rejected > total/2)
1075 UWARN(
"A large number (%d/%d) of stereo correspondences are rejected! "
1076 "Optical flow may have failed because images are not calibrated, "
1077 "the background is too far (no disparity between the images), "
1078 "maximum disparity may be too small (%f) or that exposure between "
1079 "left and right images is too different.",
1087 else if(!
data.depthRaw().empty() &&
data.cameraModels().size())
1091 data.depthOrRightRaw(),
1092 data.cameraModels(),
1105 hessianThreshold_(
Parameters::defaultSURFHessianThreshold()),
1107 nOctaveLayers_(
Parameters::defaultSURFOctaveLayers()),
1108 extended_(
Parameters::defaultSURFExtended()),
1110 gpuKeypointsRatio_(
Parameters::defaultSURFGpuKeypointsRatio()),
1111 gpuVersion_(
Parameters::defaultSURFGpuVersion())
1132 #ifdef RTABMAP_NONFREE
1133 #if CV_MAJOR_VERSION < 3
1134 if(
gpuVersion_ && cv::gpu::getCudaEnabledDeviceCount() == 0)
1136 UWARN(
"GPU version of SURF not available! Using CPU version instead...");
1140 if(
gpuVersion_ && cv::cuda::getCudaEnabledDeviceCount() == 0)
1142 UWARN(
"GPU version of SURF not available! Using CPU version instead...");
1152 #if CV_MAJOR_VERSION < 3
1159 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SURF cannot be used!");
1165 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1166 std::vector<cv::KeyPoint> keypoints;
1168 #ifdef RTABMAP_NONFREE
1169 cv::Mat imgRoi(image, roi);
1173 maskRoi = cv::Mat(
mask, roi);
1177 #if CV_MAJOR_VERSION < 3
1178 cv::gpu::GpuMat imgGpu(imgRoi);
1179 cv::gpu::GpuMat maskGpu(maskRoi);
1180 (*
_gpuSurf.obj)(imgGpu, maskGpu, keypoints);
1182 cv::cuda::GpuMat imgGpu(imgRoi);
1183 cv::cuda::GpuMat maskGpu(maskRoi);
1184 (*
_gpuSurf.get())(imgGpu, maskGpu, keypoints);
1189 _surf->detect(imgRoi, keypoints, maskRoi);
1192 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SURF cannot be used!");
1199 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1200 cv::Mat descriptors;
1201 #ifdef RTABMAP_NONFREE
1204 #if CV_MAJOR_VERSION < 3
1205 cv::gpu::GpuMat imgGpu(image);
1206 cv::gpu::GpuMat descriptorsGPU;
1207 (*
_gpuSurf.obj)(imgGpu, cv::gpu::GpuMat(), keypoints, descriptorsGPU,
true);
1209 cv::cuda::GpuMat imgGpu(image);
1210 cv::cuda::GpuMat descriptorsGPU;
1211 (*
_gpuSurf.get())(imgGpu, cv::cuda::GpuMat(), keypoints, descriptorsGPU,
true);
1215 if (descriptorsGPU.empty())
1216 descriptors = cv::Mat();
1219 UASSERT(descriptorsGPU.type() == CV_32F);
1220 descriptors = cv::Mat(descriptorsGPU.size(), CV_32F);
1221 descriptorsGPU.download(descriptors);
1226 _surf->compute(image, keypoints, descriptors);
1229 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SURF cannot be used!");
1239 nOctaveLayers_(
Parameters::defaultSIFTNOctaveLayers()),
1240 contrastThreshold_(
Parameters::defaultSIFTContrastThreshold()),
1241 edgeThreshold_(
Parameters::defaultSIFTEdgeThreshold()),
1243 preciseUpscale_(
Parameters::defaultSIFTPreciseUpscale()),
1244 rootSIFT_(
Parameters::defaultSIFTRootSIFT()),
1246 guaussianThreshold_(
Parameters::defaultSIFTGaussianThreshold()),
1250 cudaSiftUpscaling_(upscale_)
1257 #ifdef RTABMAP_CUDASIFT
1284 #ifdef RTABMAP_CUDASIFT
1294 UWARN(
"No cuda device(s) detected, CudaSift is not available! Using SIFT CPU version instead.");
1298 UWARN(
"RTAB-Map is not built with CudaSift so %s cannot be used!", Parameters::kSIFTGpu().
c_str());
1305 #if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
1306 #ifdef RTABMAP_NONFREE
1307 #if CV_MAJOR_VERSION < 3
1313 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SIFT cannot be used!");
1315 #elif CV_MAJOR_VERSION>4 || (CV_MAJOR_VERSION==4 && CV_MINOR_VERSION>=8)// >=4.8
1317 #else // >=4.4, >=3.4.11
1326 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1327 std::vector<cv::KeyPoint> keypoints;
1328 cv::Mat imgRoi(image, roi);
1332 maskRoi = cv::Mat(
mask, roi);
1334 #ifdef RTABMAP_CUDASIFT
1338 int w = imgRoi.cols;
1339 int h = imgRoi.rows;
1341 imgRoi.convertTo(img_h, CV_32FC1);
1343 img_d.Allocate(
w,
h, iAlignUp(
w, 128),
false,
NULL, (
float*)img_h.data);
1350 if(numOctaves < 1) {
1353 else if (numOctaves>7)
1360 float minScale = 0.0f;
1361 UDEBUG(
"numOctaves=%d initBlur=%f thresh=%f edgeLimit=%f minScale=%f upScale=%s w=%d h=%d", numOctaves, initBlur, thresh, edgeLimit, minScale,
upscale_?
"true":
"false",
w,
h);
1384 if(maxKeypoints == 0 || maxKeypoints >
cudaSiftData_->numPts)
1391 std::multimap<float, int> hessianMap;
1409 hessianMap.insert(std::pair<float, int>(
cudaSiftData_->h_data[
i].sharpness,
i));
1412 if((
int)hessianMap.size() < maxKeypoints)
1414 maxKeypoints = hessianMap.size();
1417 std::multimap<float, int>::reverse_iterator
iter = hessianMap.rbegin();
1418 keypoints.resize(maxKeypoints);
1420 for(
unsigned int k=0; k<keypoints.size() &&
iter!=hessianMap.rend(); ++k, ++
iter)
1422 int i =
iter->second;
1437 #if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
1438 #ifdef RTABMAP_NONFREE
1439 sift_->detect(imgRoi, keypoints, maskRoi);
1441 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SIFT cannot be used!");
1443 #else // >=4.4, >=3.4.11
1444 sift_->detect(imgRoi, keypoints, maskRoi);
1452 #ifdef RTABMAP_CUDASIFT
1461 UERROR(
"CudaSift: keypoints size %ld is not equal to extracted descriptors size %d", keypoints.size(),
cudaSiftDescriptors_.rows);
1467 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1468 cv::Mat descriptors;
1469 #if CV_MAJOR_VERSION < 3 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION <= 3) || (CV_MAJOR_VERSION == 3 && (CV_MINOR_VERSION < 4 || (CV_MINOR_VERSION==4 && CV_SUBMINOR_VERSION<11)))
1470 #ifdef RTABMAP_NONFREE
1471 sift_->compute(image, keypoints, descriptors);
1473 UWARN(
"RTAB-Map is not built with OpenCV nonfree module so SIFT cannot be used!");
1475 #else // >=4.4, >=3.4.11
1476 sift_->compute(image, keypoints, descriptors);
1480 UDEBUG(
"Performing RootSIFT...");
1484 for(
int i=0;
i<descriptors.rows; ++
i)
1489 descriptors.row(
i) = descriptors.row(
i) / cv::sum(descriptors.row(
i))[0];
1490 cv::sqrt(descriptors.row(
i), descriptors.row(
i));
1500 scaleFactor_(
Parameters::defaultORBScaleFactor()),
1502 edgeThreshold_(
Parameters::defaultORBEdgeThreshold()),
1503 firstLevel_(
Parameters::defaultORBFirstLevel()),
1505 scoreType_(
Parameters::defaultORBScoreType()),
1506 patchSize_(
Parameters::defaultORBPatchSize()),
1508 fastThreshold_(
Parameters::defaultFASTThreshold()),
1509 nonmaxSuppresion_(
Parameters::defaultFASTNonmaxSuppression())
1534 #if CV_MAJOR_VERSION < 3
1535 #ifdef HAVE_OPENCV_GPU
1536 if(
gpu_ && cv::gpu::getCudaEnabledDeviceCount() == 0)
1538 UWARN(
"GPU version of ORB not available! Using CPU version instead...");
1544 UWARN(
"GPU version of ORB not available (OpenCV not built with gpu/cuda module)! Using CPU version instead...");
1549 #ifndef HAVE_OPENCV_CUDAFEATURES2D
1552 UWARN(
"GPU version of ORB not available (OpenCV cudafeatures2d module)! Using CPU version instead...");
1556 if(
gpu_ && cv::cuda::getCudaEnabledDeviceCount() == 0)
1558 UWARN(
"GPU version of ORB not available (no GPU found)! Using CPU version instead...");
1564 #if CV_MAJOR_VERSION < 3
1565 #ifdef HAVE_OPENCV_GPU
1569 UFATAL(
"not supposed to be here");
1572 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1579 #if CV_MAJOR_VERSION < 3
1581 #elif CV_MAJOR_VERSION > 3
1591 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1592 std::vector<cv::KeyPoint> keypoints;
1593 cv::Mat imgRoi(image, roi);
1597 maskRoi = cv::Mat(
mask, roi);
1602 #if CV_MAJOR_VERSION < 3
1603 #ifdef HAVE_OPENCV_GPU
1604 cv::gpu::GpuMat imgGpu(imgRoi);
1605 cv::gpu::GpuMat maskGpu(maskRoi);
1606 (*
_gpuOrb.obj)(imgGpu, maskGpu, keypoints);
1608 UERROR(
"Cannot use ORBGPU because OpenCV is not built with gpu module.");
1611 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1612 cv::cuda::GpuMat d_image(imgRoi);
1613 cv::cuda::GpuMat d_mask(maskRoi);
1615 _gpuOrb->detectAndCompute(d_image, d_mask, keypoints, cv::cuda::GpuMat(),
false);
1616 }
catch (cv::Exception&
e) {
1617 const char* err_msg =
e.what();
1618 UWARN(
"OpenCV exception caught: %s", err_msg);
1625 _orb->detect(imgRoi, keypoints, maskRoi);
1633 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1634 cv::Mat descriptors;
1642 #if CV_MAJOR_VERSION < 3
1643 #ifdef HAVE_OPENCV_GPU
1644 cv::gpu::GpuMat imgGpu(image);
1645 cv::gpu::GpuMat descriptorsGPU;
1646 (*
_gpuOrb.obj)(imgGpu, cv::gpu::GpuMat(), keypoints, descriptorsGPU);
1648 if (descriptorsGPU.empty())
1649 descriptors = cv::Mat();
1652 UASSERT(descriptorsGPU.type() == CV_32F);
1653 descriptors = cv::Mat(descriptorsGPU.size(), CV_32F);
1654 descriptorsGPU.download(descriptors);
1657 UERROR(
"GPU version of ORB not available (OpenCV not built with gpu/cuda module)! Using CPU version instead...");
1660 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1661 cv::cuda::GpuMat d_image(image);
1662 cv::cuda::GpuMat d_descriptors;
1664 _gpuOrb->detectAndCompute(d_image, cv::cuda::GpuMat(), keypoints, d_descriptors,
true);
1665 }
catch (cv::Exception&
e) {
1666 const char* err_msg =
e.what();
1667 UWARN(
"OpenCV exception caught: %s", err_msg);
1670 if (d_descriptors.empty())
1671 descriptors = cv::Mat();
1674 UASSERT(d_descriptors.type() == CV_32F || d_descriptors.type() == CV_8U);
1675 d_descriptors.download(descriptors);
1682 _orb->compute(image, keypoints, descriptors);
1693 nonmaxSuppression_(
Parameters::defaultFASTNonmaxSuppression()),
1695 gpuKeypointsRatio_(
Parameters::defaultFASTGpuKeypointsRatio()),
1696 minThreshold_(
Parameters::defaultFASTMinThreshold()),
1697 maxThreshold_(
Parameters::defaultFASTMaxThreshold()),
1698 gridRows_(
Parameters::defaultFASTGridRows()),
1699 gridCols_(
Parameters::defaultFASTGridCols()),
1702 fastCVMaxFeatures_(10000),
1703 fastCVLastImageHeight_(0)
1705 #ifdef RTABMAP_FASTCV
1706 char sVersion[128] = { 0 };
1707 fcvGetVersion(sVersion, 128);
1708 UINFO(
"fastcv version = %s", sVersion);
1710 if ((ix = fcvSetOperationMode(FASTCV_OP_PERFORMANCE)))
1712 UERROR(
"fcvSetOperationMode return=%d, OpenCV FAST will be used instead!", ix);
1722 UERROR(
"could not alloc fastcv mem, using opencv fast instead!");
1746 #ifdef RTABMAP_FASTCV
1781 #if CV_MAJOR_VERSION < 3
1782 #ifdef HAVE_OPENCV_GPU
1783 if(
gpu_ && cv::gpu::getCudaEnabledDeviceCount() == 0)
1785 UWARN(
"GPU version of FAST not available! Using CPU version instead...");
1791 UWARN(
"GPU version of FAST not available (OpenCV not built with gpu/cuda module)! Using CPU version instead...");
1796 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1797 if(
gpu_ && cv::cuda::getCudaEnabledDeviceCount() == 0)
1799 UWARN(
"GPU version of FAST not available! Using CPU version instead...");
1805 UWARN(
"GPU version of FAST not available (OpenCV cudafeatures2d module)! Using CPU version instead...");
1812 #if CV_MAJOR_VERSION < 3
1813 #ifdef HAVE_OPENCV_GPU
1816 UFATAL(
"not supposed to be here!");
1819 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1820 UFATAL(
"not implemented");
1826 #if CV_MAJOR_VERSION < 3
1837 UWARN(
"Parameter \"%s\" is set (value=%d) but not \"%s\"! Grid adaptor will not be added.",
1842 UWARN(
"Parameter \"%s\" is set (value=%d) but not \"%s\"! Grid adaptor will not be added.",
1855 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1856 std::vector<cv::KeyPoint> keypoints;
1858 #ifdef RTABMAP_FASTCV
1876 UERROR(
"could not alloc fastcv mem for temp buf (%s=true)", Parameters::kFASTNonmaxSuppression().
c_str());
1888 fcvCornerFast10Scoreu8(image.data, image.cols, image.rows, 0,
threshold_, 0,
fastCVCorners_,
fastCVCornerScores_,
fastCVMaxFeatures_, &nCorners,
nonmaxSuppression_?1:0,
fastCVTempBuf_);
1892 fcvCornerFast9Scoreu8_v2(image.data, image.cols, image.rows, image.step1(),
threshold_, 0,
fastCVCorners_,
fastCVCornerScores_,
fastCVMaxFeatures_, &nCorners,
nonmaxSuppression_?1:0,
fastCVTempBuf_);
1894 UDEBUG(
"number of corners found = %d:", nCorners);
1895 keypoints.resize(nCorners);
1900 keypoints[
i].size = 3;
1914 UWARN(
"RTAB-Map is not built with FastCV support. OpenCV's FAST is used instead. "
1915 "Please set %s to 0. This message will only appear once.",
1916 Parameters::kFASTCV().
c_str());
1920 cv::Mat imgRoi(image, roi);
1924 maskRoi = cv::Mat(
mask, roi);
1928 #if CV_MAJOR_VERSION < 3
1929 #ifdef HAVE_OPENCV_GPU
1930 cv::gpu::GpuMat imgGpu(imgRoi);
1931 cv::gpu::GpuMat maskGpu(maskRoi);
1932 (*
_gpuFast.obj)(imgGpu, maskGpu, keypoints);
1934 UERROR(
"Cannot use FAST GPU because OpenCV is not built with gpu module.");
1937 #ifdef HAVE_OPENCV_CUDAFEATURES2D
1938 UFATAL(
"not implemented");
1944 _fast->detect(imgRoi, keypoints, maskRoi);
1968 #if CV_MAJOR_VERSION < 3
1971 #ifdef HAVE_OPENCV_XFEATURES2D
1974 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Brief cannot be used!");
1981 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
1982 cv::Mat descriptors;
1983 #if CV_MAJOR_VERSION < 3
1984 _brief->compute(image, keypoints, descriptors);
1986 #ifdef HAVE_OPENCV_XFEATURES2D
1987 _brief->compute(image, keypoints, descriptors);
1989 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Brief cannot be used!");
2000 orientationNormalized_(
Parameters::defaultFREAKOrientationNormalized()),
2001 scaleNormalized_(
Parameters::defaultFREAKScaleNormalized()),
2002 patternScale_(
Parameters::defaultFREAKPatternScale()),
2003 nOctaves_(
Parameters::defaultFREAKNOctaves())
2021 #if CV_MAJOR_VERSION < 3
2024 #ifdef HAVE_OPENCV_XFEATURES2D
2027 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2034 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2035 cv::Mat descriptors;
2036 #if CV_MAJOR_VERSION < 3
2037 _freak->compute(image, keypoints, descriptors);
2039 #ifdef HAVE_OPENCV_XFEATURES2D
2040 _freak->compute(image, keypoints, descriptors);
2042 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2052 _qualityLevel(
Parameters::defaultGFTTQualityLevel()),
2053 _minDistance(
Parameters::defaultGFTTMinDistance()),
2054 _blockSize(
Parameters::defaultGFTTBlockSize()),
2055 _useHarrisDetector(
Parameters::defaultGFTTUseHarrisDetector()),
2077 #if CV_MAJOR_VERSION < 3
2080 UWARN(
"GPU version of GFTT is not implemented for OpenCV<3! Using CPU version instead...");
2085 #ifdef HAVE_OPENCV_CUDAIMGPROC
2086 if(
_gpu && cv::cuda::getCudaEnabledDeviceCount() == 0)
2088 UWARN(
"GPU version of GFTT not available! Using CPU version instead...");
2094 UWARN(
"GPU version of GFTT not available (OpenCV cudaimageproc module)! Using CPU version instead...");
2100 #ifdef HAVE_OPENCV_CUDAIMGPROC
2103 UFATAL(
"not supposed to be here!");
2108 #if CV_MAJOR_VERSION < 3
2118 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2119 std::vector<cv::KeyPoint> keypoints;
2120 cv::Mat imgRoi(image, roi);
2124 maskRoi = cv::Mat(
mask, roi);
2127 #if CV_MAJOR_VERSION >= 3 && defined(HAVE_OPENCV_CUDAIMGPROC)
2130 cv::cuda::GpuMat imgGpu(imgRoi);
2131 cv::cuda::GpuMat maskGpu(maskRoi);
2132 cv::cuda::GpuMat cornersGpu;
2133 _gpuGftt->detect(imgGpu, cornersGpu, maskGpu);
2134 std::vector<cv::Point2f>
corners(cornersGpu.cols);
2135 cv::Mat cornersMat(1, cornersGpu.cols, CV_32FC2, (
void*)&
corners[0]);
2136 cornersGpu.download(cornersMat);
2142 _gftt->detect(imgRoi, keypoints, maskRoi);
2167 #if CV_MAJOR_VERSION < 3
2170 #ifdef HAVE_OPENCV_XFEATURES2D
2173 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Brief cannot be used!");
2180 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2181 cv::Mat descriptors;
2182 #if CV_MAJOR_VERSION < 3
2183 _brief->compute(image, keypoints, descriptors);
2185 #ifdef HAVE_OPENCV_XFEATURES2D
2186 _brief->compute(image, keypoints, descriptors);
2188 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Brief cannot be used!");
2199 orientationNormalized_(
Parameters::defaultFREAKOrientationNormalized()),
2200 scaleNormalized_(
Parameters::defaultFREAKScaleNormalized()),
2201 patternScale_(
Parameters::defaultFREAKPatternScale()),
2202 nOctaves_(
Parameters::defaultFREAKNOctaves())
2220 #if CV_MAJOR_VERSION < 3
2223 #ifdef HAVE_OPENCV_XFEATURES2D
2226 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2233 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2234 cv::Mat descriptors;
2235 #if CV_MAJOR_VERSION < 3
2236 _freak->compute(image, keypoints, descriptors);
2238 #ifdef HAVE_OPENCV_XFEATURES2D
2239 _freak->compute(image, keypoints, descriptors);
2241 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2252 orientationNormalized_(
Parameters::defaultFREAKOrientationNormalized()),
2253 scaleNormalized_(
Parameters::defaultFREAKScaleNormalized()),
2254 patternScale_(
Parameters::defaultFREAKPatternScale()),
2255 nOctaves_(
Parameters::defaultFREAKNOctaves())
2273 #if CV_MAJOR_VERSION < 3
2276 #ifdef HAVE_OPENCV_XFEATURES2D
2279 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2286 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2287 cv::Mat descriptors;
2288 #if CV_MAJOR_VERSION < 3
2289 _freak->compute(image, keypoints, descriptors);
2291 #ifdef HAVE_OPENCV_XFEATURES2D
2292 _freak->compute(image, keypoints, descriptors);
2294 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so Freak cannot be used!");
2322 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2332 patternScale_(
Parameters::defaultBRISKPatternScale())
2349 #if CV_MAJOR_VERSION < 3
2358 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2359 std::vector<cv::KeyPoint> keypoints;
2360 cv::Mat imgRoi(image, roi);
2364 maskRoi = cv::Mat(
mask, roi);
2366 brisk_->detect(imgRoi, keypoints, maskRoi);
2372 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2373 cv::Mat descriptors;
2374 brisk_->compute(image, keypoints, descriptors);
2382 extended_(
Parameters::defaultKAZEExtended()),
2385 nOctaves_(
Parameters::defaultKAZENOctaves()),
2386 nOctaveLayers_(
Parameters::defaultKAZENOctaveLayers()),
2387 diffusivity_(
Parameters::defaultKAZEDiffusivity())
2407 #if CV_MAJOR_VERSION > 3
2409 #elif CV_MAJOR_VERSION > 2
2412 UWARN(
"RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!");
2418 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2419 std::vector<cv::KeyPoint> keypoints;
2420 #if CV_MAJOR_VERSION > 2
2421 cv::Mat imgRoi(image, roi);
2425 maskRoi = cv::Mat(
mask, roi);
2427 kaze_->detect(imgRoi, keypoints, maskRoi);
2429 UWARN(
"RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!");
2436 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2437 cv::Mat descriptors;
2438 #if CV_MAJOR_VERSION > 2
2439 kaze_->compute(image, keypoints, descriptors);
2441 UWARN(
"RTAB-Map is not built with OpenCV3 so Kaze feature cannot be used!");
2450 scaleFactor_(
Parameters::defaultORBScaleFactor()),
2452 patchSize_(
Parameters::defaultORBPatchSize()),
2453 edgeThreshold_(
Parameters::defaultORBEdgeThreshold()),
2454 fastThreshold_(
Parameters::defaultFASTThreshold()),
2455 fastMinThreshold_(
Parameters::defaultFASTMinThreshold())
2476 #ifdef RTABMAP_ORB_OCTREE
2479 UWARN(
"RTAB-Map is not built with ORB OcTree option enabled so ORB OcTree feature cannot be used!");
2485 std::vector<cv::KeyPoint> keypoints;
2487 #ifdef RTABMAP_ORB_OCTREE
2488 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2489 cv::Mat imgRoi(image, roi);
2493 maskRoi = cv::Mat(
mask, roi);
2499 if(!keypoints.empty() && !maskRoi.empty())
2501 std::vector<cv::KeyPoint> validKeypoints;
2502 validKeypoints.reserve(keypoints.size());
2503 cv::Mat validDescriptors;
2504 for(
size_t i=0;
i<keypoints.size(); ++
i)
2506 if(maskRoi.at<
unsigned char>(keypoints[
i].pt.y+roi.y, keypoints[
i].pt.x+roi.x) != 0)
2508 validKeypoints.push_back(keypoints[
i]);
2512 keypoints = validKeypoints;
2521 UWARN(
"RTAB-Map is not built with ORB OcTree option enabled so ORB OcTree feature cannot be used!");
2528 #ifdef RTABMAP_ORB_OCTREE
2531 UWARN(
"RTAB-Map is not built with ORB OcTree option enabled so ORB OcTree feature cannot be used!");
2540 path_(
Parameters::defaultSuperPointModelPath()),
2543 minDistance_(
Parameters::defaultSuperPointNMSRadius()),
2557 std::string previousPath =
path_;
2558 #ifdef RTABMAP_TORCH
2559 bool previousCuda =
cuda_;
2567 #ifdef RTABMAP_TORCH
2579 UWARN(
"RTAB-Map is not built with Torch support so SuperPoint Torch feature cannot be used!");
2585 #ifdef RTABMAP_TORCH
2586 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2587 if(roi.x!=0 || roi.y !=0)
2589 UERROR(
"SuperPoint: Not supporting ROI (%d,%d,%d,%d). Make sure %s, %s, %s, %s, %s, %s are all set to default values.",
2590 roi.x, roi.y, roi.width, roi.height,
2591 Parameters::kKpRoiRatios().c_str(),
2592 Parameters::kVisRoiRatios().c_str(),
2593 Parameters::kVisGridRows().c_str(),
2594 Parameters::kVisGridCols().c_str(),
2595 Parameters::kKpGridRows().c_str(),
2596 Parameters::kKpGridCols().c_str());
2597 return std::vector<cv::KeyPoint>();
2601 UWARN(
"RTAB-Map is not built with Torch support so SuperPoint Torch feature cannot be used!");
2602 return std::vector<cv::KeyPoint>();
2608 #ifdef RTABMAP_TORCH
2609 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2612 UWARN(
"RTAB-Map is not built with Torch support so SuperPoint Torch feature cannot be used!");
2623 orientationNormalized_(
Parameters::defaultFREAKOrientationNormalized()),
2624 scaleNormalized_(
Parameters::defaultFREAKScaleNormalized()),
2625 patternScale_(
Parameters::defaultFREAKPatternScale()),
2626 nOctaves_(
Parameters::defaultFREAKNOctaves())
2644 #ifdef HAVE_OPENCV_XFEATURES2D
2645 _daisy = CV_DAISY::create();
2647 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so DAISY cannot be used!");
2653 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2654 cv::Mat descriptors;
2655 #ifdef HAVE_OPENCV_XFEATURES2D
2656 _daisy->compute(image, keypoints, descriptors);
2658 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so DAISY cannot be used!");
2668 orientationNormalized_(
Parameters::defaultFREAKOrientationNormalized()),
2669 scaleNormalized_(
Parameters::defaultFREAKScaleNormalized()),
2670 patternScale_(
Parameters::defaultFREAKPatternScale()),
2671 nOctaves_(
Parameters::defaultFREAKNOctaves())
2689 #ifdef HAVE_OPENCV_XFEATURES2D
2690 _daisy = CV_DAISY::create();
2692 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so DAISY cannot be used!");
2698 UASSERT(!image.empty() && image.channels() == 1 && image.depth() == CV_8U);
2699 cv::Mat descriptors;
2700 #ifdef HAVE_OPENCV_XFEATURES2D
2701 _daisy->compute(image, keypoints, descriptors);
2703 UWARN(
"RTAB-Map is not built with OpenCV xfeatures2d module so DAISY cannot be used!");