17 #include <mrpt/otherlibs/do_opencv_includes.h> 33 template <
typename FEATLIST>
35 FEATLIST& featureList,
const CImage& cur_gray,
36 const float minimum_KLT_response,
const unsigned int KLT_response_half_win,
37 const unsigned int max_x,
const unsigned int max_y);
42 const float minimum_KLT_response,
const unsigned int KLT_response_half_win,
43 const unsigned int max_x,
const unsigned int max_y)
47 itFeat != itFeatEnd; ++itFeat)
53 const unsigned int x = ft->
x;
54 const unsigned int y = ft->
y;
55 if (
x > KLT_response_half_win &&
y > KLT_response_half_win &&
56 x < max_x &&
y < max_y)
58 ft->
response = cur_gray.KLT_response(
x,
y, KLT_response_half_win);
62 if (ft->
response < minimum_KLT_response)
75 template <
class FEAT_LIST>
77 FEAT_LIST& featureList,
const CImage& cur_gray,
78 const float minimum_KLT_response,
const unsigned int KLT_response_half_win,
79 const unsigned int max_x_,
const unsigned int max_y_)
81 if (featureList.empty())
return;
83 typedef typename FEAT_LIST::feature_t::pixel_coord_t pixel_coord_t;
84 const pixel_coord_t half_win =
85 static_cast<pixel_coord_t
>(KLT_response_half_win);
86 const pixel_coord_t max_x =
static_cast<pixel_coord_t
>(max_x_);
87 const pixel_coord_t max_y =
static_cast<pixel_coord_t
>(max_y_);
89 for (
int N = featureList.size() - 1; N >= 0; --N)
91 typename FEAT_LIST::feature_t& ft = featureList[N];
95 if (ft.pt.x > half_win && ft.pt.y > half_win && ft.pt.x < max_x &&
99 cur_gray.
KLT_response(ft.pt.x, ft.pt.y, KLT_response_half_win);
103 if (ft.response < minimum_KLT_response)
119 const float minimum_KLT_response,
const unsigned int KLT_response_half_win,
120 const unsigned int max_x,
const unsigned int max_y)
122 trackFeatures_checkResponses_impl_simple<TSimpleFeatureList>(
123 featureList, cur_gray, minimum_KLT_response, KLT_response_half_win,
129 const float minimum_KLT_response,
const unsigned int KLT_response_half_win,
130 const unsigned int max_x,
const unsigned int max_y)
132 trackFeatures_checkResponses_impl_simple<TSimpleFeaturefList>(
133 featureList, cur_gray, minimum_KLT_response, KLT_response_half_win,
137 template <
typename FEATLIST>
139 FEATLIST& featureList,
const CImage& cur_gray);
146 itFeat != featureList.end(); ++itFeat)
154 if (patch_width > 0 && patch_height > 0)
158 const int offset = (int)patch_width / 2;
159 cur_gray.extract_patch(
161 patch_width, patch_height);
163 catch (std::exception&)
187 template <
typename FEATLIST>
190 const std::vector<size_t>& sorted_indices,
const size_t nNewToCheck,
191 const size_t maxNumFeatures,
const float minimum_KLT_response_to_add,
192 const double threshold_sqr_dist_to_add_new,
const size_t patchSize,
198 const std::vector<size_t>& sorted_indices,
const size_t nNewToCheck,
199 const size_t maxNumFeatures,
const float minimum_KLT_response_to_add,
200 const double threshold_sqr_dist_to_add_new,
const size_t patchSize,
203 const TImageSize imgSize = cur_gray.getSize();
204 const int offset = (int)patchSize / 2 + 1;
205 const int w_off = int(imgSize.
x -
offset);
206 const int h_off = int(imgSize.
y -
offset);
208 for (
size_t i = 0; i < nNewToCheck && featureList.size() < maxNumFeatures;
213 if (feat.
response < minimum_KLT_response_to_add)
continue;
215 double min_dist_sqr =
square(10000);
217 if (!featureList.empty())
222 featureList.kdTreeClosestPoint2DsqrError(feat.
pt.x, feat.
pt.y);
227 if (min_dist_sqr > threshold_sqr_dist_to_add_new &&
234 ft->ID = ++max_feat_ID_at_input;
240 ft->patchSize = patchSize;
243 cur_gray.extract_patch(
248 featureList.push_back(ft);
253 template <
class FEAT_LIST>
256 const std::vector<size_t>& sorted_indices,
const size_t nNewToCheck,
257 const size_t maxNumFeatures,
const float minimum_KLT_response_to_add,
258 const double threshold_sqr_dist_to_add_new,
const size_t patchSize,
263 const int max_manhatan_dist = std::sqrt(2*threshold_sqr_dist_to_add_new);
265 for (
size_t i=0;i<nNewToCheck && featureList.size()<maxNumFeatures;i++)
268 if (feat.
response<minimum_KLT_response_to_add)
break;
271 int manh_dist = std::numeric_limits<int>::max();
272 for (
size_t j=0;j<featureList.size();j++)
275 const int d = std::abs(existing.
pt.x-feat.
pt.x)+std::abs(existing.
pt.y-feat.
pt.y);
279 if (manh_dist<max_manhatan_dist)
283 featureList.push_back_fast(feat.
pt.x,feat.
pt.y);
289 newFeat.
ID = ++max_feat_ID_at_input;
297 const int grid_cell_log2 =
round(
298 std::log(std::sqrt(threshold_sqr_dist_to_add_new) * 0.5) /
301 int grid_lx = 1 + (cur_gray.
getWidth() >> grid_cell_log2);
302 int grid_ly = 1 + (cur_gray.
getHeight() >> grid_cell_log2);
305 featureList.getOccupiedSectionsMatrix();
309 occupied_sections.
fillAll(
false);
311 for (
size_t i = 0; i < featureList.size(); i++)
314 const int section_idx_x = feat.
pt.x >> grid_cell_log2;
315 const int section_idx_y = feat.
pt.y >> grid_cell_log2;
317 if (!section_idx_x || !section_idx_y || section_idx_x >= grid_lx - 1 ||
318 section_idx_y >= grid_ly - 1)
324 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y - 1);
326 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y);
328 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y + 1);
329 ptr1[0] = ptr1[1] = ptr1[2] =
true;
330 ptr2[0] = ptr2[1] = ptr2[2] =
true;
331 ptr3[0] = ptr3[1] = ptr3[2] =
true;
334 for (
size_t i = 0; i < nNewToCheck && featureList.size() < maxNumFeatures;
338 if (feat.
response < minimum_KLT_response_to_add)
break;
341 const int section_idx_x = feat.
pt.x >> grid_cell_log2;
342 const int section_idx_y = feat.
pt.y >> grid_cell_log2;
344 if (!section_idx_x || !section_idx_y || section_idx_x >= grid_lx - 2 ||
345 section_idx_y >= grid_ly - 2)
349 if (occupied_sections(section_idx_x, section_idx_y))
354 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y - 1);
356 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y);
358 &occupied_sections.
get_unsafe(section_idx_x - 1, section_idx_y + 1);
360 ptr1[0] = ptr1[1] = ptr1[2] =
true;
361 ptr2[0] = ptr2[1] = ptr2[2] =
true;
362 ptr3[0] = ptr3[1] = ptr3[2] =
true;
365 featureList.push_back_fast(feat.
pt.x, feat.
pt.y);
371 newFeat.
ID = ++max_feat_ID_at_input;
382 featureList.getVector());
384 for (
size_t i = 0; i < nNewToCheck && featureList.size() < maxNumFeatures;
388 if (feat.
response < minimum_KLT_response_to_add)
break;
391 double min_dist_sqr = std::numeric_limits<double>::max();
393 if (!featureList.empty())
398 kdtree.kdTreeClosestPoint2DsqrError(feat.
pt.x, feat.
pt.y);
403 if (min_dist_sqr > threshold_sqr_dist_to_add_new)
406 featureList.push_back_fast(feat.
pt.x, feat.
pt.y);
407 kdtree.mark_as_outdated();
410 typename FEAT_LIST::feature_t& newFeat = featureList.back();
412 newFeat.ID = ++max_feat_ID_at_input;
427 const std::vector<size_t>& sorted_indices,
const size_t nNewToCheck,
428 const size_t maxNumFeatures,
const float minimum_KLT_response_to_add,
429 const double threshold_sqr_dist_to_add_new,
const size_t patchSize,
432 trackFeatures_addNewFeats_simple_list<TSimpleFeatureList>(
433 featureList, new_feats, sorted_indices, nNewToCheck, maxNumFeatures,
434 minimum_KLT_response_to_add, threshold_sqr_dist_to_add_new, patchSize,
435 cur_gray, max_feat_ID_at_input);
440 const std::vector<size_t>& sorted_indices,
const size_t nNewToCheck,
441 const size_t maxNumFeatures,
const float minimum_KLT_response_to_add,
442 const double threshold_sqr_dist_to_add_new,
const size_t patchSize,
445 trackFeatures_addNewFeats_simple_list<TSimpleFeaturefList>(
446 featureList, new_feats, sorted_indices, nNewToCheck, maxNumFeatures,
447 minimum_KLT_response_to_add, threshold_sqr_dist_to_add_new, patchSize,
448 cur_gray, max_feat_ID_at_input);
452 template <
typename FEATLIST>
454 FEATLIST& trackedFeats,
const size_t img_width,
const size_t img_height,
455 const int MIN_DIST_MARGIN_TO_STOP_TRACKING);
457 template <
typename FEATLIST>
459 FEATLIST& trackedFeats,
const size_t img_width,
const size_t img_height,
460 const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
462 if (trackedFeats.empty())
return 0;
464 std::vector<size_t> survival_idxs;
465 const size_t N = trackedFeats.size();
468 survival_idxs.reserve(N);
469 for (
size_t i = 0; i < N; i++)
471 const typename FEATLIST::feature_t& ft = trackedFeats[i];
477 const int x = ft.pt.x;
478 const int y = ft.pt.y;
479 if (
x < MIN_DIST_MARGIN_TO_STOP_TRACKING ||
480 y < MIN_DIST_MARGIN_TO_STOP_TRACKING ||
481 x > static_cast<int>(
482 img_width - MIN_DIST_MARGIN_TO_STOP_TRACKING) ||
483 y >
static_cast<int>(
484 img_height - MIN_DIST_MARGIN_TO_STOP_TRACKING))
489 if (!eras) survival_idxs.push_back(i);
493 const size_t N2 = survival_idxs.size();
494 const size_t n_removed = N - N2;
495 for (
size_t i = 0; i < N2; i++)
497 if (survival_idxs[i] != i)
498 trackedFeats[i] = trackedFeats[survival_idxs[i]];
500 trackedFeats.resize(N2);
507 const size_t img_height,
const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
509 return trackFeatures_deleteOOB_impl_simple_feat<TSimpleFeatureList>(
510 trackedFeats, img_width, img_height, MIN_DIST_MARGIN_TO_STOP_TRACKING);
515 const size_t img_height,
const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
517 return trackFeatures_deleteOOB_impl_simple_feat<TSimpleFeaturefList>(
518 trackedFeats, img_width, img_height, MIN_DIST_MARGIN_TO_STOP_TRACKING);
523 CFeatureList& trackedFeats,
const size_t img_width,
const size_t img_height,
524 const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
528 size_t n_removed = 0;
529 while (itFeat != trackedFeats.
end())
536 const float x = (*itFeat)->x;
537 const float y = (*itFeat)->y;
538 static const float MIN_DIST_MARGIN_TO_STOP_TRACKING = 10;
539 if (
x < MIN_DIST_MARGIN_TO_STOP_TRACKING ||
540 y < MIN_DIST_MARGIN_TO_STOP_TRACKING ||
541 x > (img_width - MIN_DIST_MARGIN_TO_STOP_TRACKING) ||
542 y > (img_height - MIN_DIST_MARGIN_TO_STOP_TRACKING))
549 itFeat = trackedFeats.
erase(itFeat);
585 template <
typename FEATLIST>
587 const CImage& old_img,
const CImage& new_img, FEATLIST& featureList)
590 "[CGenericFeatureTracker::trackFeatures] Complete iteration");
592 const size_t img_width = new_img.
getWidth();
593 const size_t img_height = new_img.
getHeight();
598 if (!featureList.empty()) max_feat_ID_at_input = featureList.getMaxID();
602 m_timlog.enter(
"[CGenericFeatureTracker] Convert grayscale");
607 m_timlog.leave(
"[CGenericFeatureTracker] Convert grayscale");
612 m_newly_detected_feats.clear();
614 m_timlog.enter(
"[CGenericFeatureTracker] trackFeatures_impl");
616 trackFeatures_impl(prev_gray, cur_gray, featureList);
618 m_timlog.leave(
"[CGenericFeatureTracker] trackFeatures_impl");
623 const int check_KLT_response_every =
624 extra_params.getWithDefaultVal(
"check_KLT_response_every", 0);
625 const float minimum_KLT_response =
626 extra_params.getWithDefaultVal(
"minimum_KLT_response", 5);
627 const unsigned int KLT_response_half_win =
628 extra_params.getWithDefaultVal(
"KLT_response_half_win", 4);
630 if (check_KLT_response_every > 0 &&
631 ++m_check_KLT_counter >=
size_t(check_KLT_response_every))
633 m_timlog.enter(
"[CGenericFeatureTracker] check KLT responses");
634 m_check_KLT_counter = 0;
636 const unsigned int max_x = img_width - KLT_response_half_win;
637 const unsigned int max_y = img_height - KLT_response_half_win;
640 featureList, cur_gray, minimum_KLT_response, KLT_response_half_win,
643 m_timlog.leave(
"[CGenericFeatureTracker] check KLT responses");
651 const bool remove_lost_features =
652 extra_params.getWithDefaultVal(
"remove_lost_features", 0) != 0;
654 if (remove_lost_features)
656 m_timlog.enter(
"[CGenericFeatureTracker] removal of OOB");
658 static const int MIN_DIST_MARGIN_TO_STOP_TRACKING = 10;
661 featureList, img_width, img_height,
662 MIN_DIST_MARGIN_TO_STOP_TRACKING);
664 m_timlog.leave(
"[CGenericFeatureTracker] removal of OOB");
666 last_execution_extra_info.num_deleted_feats = nRemoved;
670 last_execution_extra_info.num_deleted_feats = 0;
676 const int update_patches_every =
677 extra_params.getWithDefaultVal(
"update_patches_every", 0);
679 if (update_patches_every > 0 &&
680 ++m_update_patches_counter >=
size_t(update_patches_every))
682 m_timlog.enter(
"[CGenericFeatureTracker] update patches");
683 m_update_patches_counter = 0;
688 m_timlog.leave(
"[CGenericFeatureTracker] update patches");
694 const bool add_new_features =
695 extra_params.getWithDefaultVal(
"add_new_features", 0) != 0;
696 const double threshold_dist_to_add_new =
697 extra_params.getWithDefaultVal(
"add_new_feat_min_separation", 15);
702 if (add_new_features)
704 m_timlog.enter(
"[CGenericFeatureTracker] add new features");
708 if (m_newly_detected_feats.empty())
712 cur_gray, m_newly_detected_feats, m_detector_adaptive_thres);
715 const size_t N = m_newly_detected_feats.size();
717 last_execution_extra_info.raw_FAST_feats_detected =
721 const size_t desired_num_features = extra_params.getWithDefaultVal(
722 "desired_num_features_adapt",
723 size_t((img_width * img_height) >> 9));
724 updateAdaptiveNewFeatsThreshold(N, desired_num_features);
728 const unsigned int max_x = img_width - KLT_response_half_win;
729 const unsigned int max_y = img_height - KLT_response_half_win;
730 for (
size_t i = 0; i < N; i++)
732 const unsigned int x = m_newly_detected_feats[i].pt.x;
733 const unsigned int y = m_newly_detected_feats[i].pt.y;
734 if (
x > KLT_response_half_win &&
y > KLT_response_half_win &&
735 x < max_x &&
y < max_y)
736 m_newly_detected_feats[i].response =
739 m_newly_detected_feats[i].response = 0;
746 std::vector<size_t> sorted_indices(N);
747 for (
size_t i = 0; i < N; i++) sorted_indices[i] = i;
750 sorted_indices.begin(), sorted_indices.end(),
757 const size_t nNewToCheck =
std::min(
size_t(1500), N);
758 const double threshold_sqr_dist_to_add_new =
759 square(threshold_dist_to_add_new);
760 const size_t maxNumFeatures =
761 extra_params.getWithDefaultVal(
"add_new_feat_max_features", 100);
762 const size_t patchSize =
763 extra_params.getWithDefaultVal(
"add_new_feat_patch_size", 11);
765 const float minimum_KLT_response_to_add =
766 extra_params.getWithDefaultVal(
"minimum_KLT_response_to_add", 10);
770 featureList, m_newly_detected_feats, sorted_indices, nNewToCheck,
771 maxNumFeatures, minimum_KLT_response_to_add,
772 threshold_sqr_dist_to_add_new, patchSize, cur_gray,
773 max_feat_ID_at_input);
775 m_timlog.leave(
"[CGenericFeatureTracker] add new features");
779 "[CGenericFeatureTracker::trackFeatures] Complete iteration");
786 internal_trackFeatures<CFeatureList>(old_img, new_img, featureList);
793 internal_trackFeatures<TSimpleFeatureList>(old_img, new_img, featureList);
800 internal_trackFeatures<TSimpleFeaturefList>(old_img, new_img, featureList);
804 const size_t nNewlyDetectedFeats,
const size_t desired_num_features)
806 const size_t hysteresis_min_num_feats = desired_num_features * 0.9;
807 const size_t hysteresis_max_num_feats = desired_num_features * 1.1;
809 if (nNewlyDetectedFeats < hysteresis_min_num_feats)
810 m_detector_adaptive_thres = std::max(
812 m_detector_adaptive_thres - 1.0,
813 m_detector_adaptive_thres * 0.8));
814 else if (nNewlyDetectedFeats > hysteresis_max_num_feats)
815 m_detector_adaptive_thres = std::max(
816 m_detector_adaptive_thres + 1.0, m_detector_adaptive_thres * 1.2);
834 for (itLeft = leftList.
begin(), itRight = rightList.
begin();
835 itLeft != leftList.
end();)
837 bool delFeat =
false;
838 if ((*itLeft)->x < 0 || (*itLeft)->y < 0 ||
839 (*itRight)->x < 0 || (*itRight)->y < 0 ||
840 fabs((*itLeft)->y - (*itRight)->y) >
845 std::cout <<
"Bad tracked match:";
846 if ((*itLeft)->x < 0 || (*itLeft)->y < 0 || (*itRight)->x < 0 ||
848 std::cout <<
" Out of bounds: (" << (*itLeft)->x <<
"," 849 << (*itLeft)->y <<
" & (" << (*itRight)->x <<
"," 850 << (*itRight)->y <<
")" << std::endl;
852 if (fabs((*itLeft)->y - (*itRight)->y) > options.
epipolar_TH)
853 std::cout <<
" Bad row checking: " 854 << fabs((*itLeft)->y - (*itRight)->y) << std::endl;
862 (*itLeft)->patch, (*itRight)->patch, u,
v,
res);
866 std::cout <<
"Bad tracked match (correlation failed):" 867 <<
" CC Value: " <<
res << std::endl;
874 itLeft = leftList.
erase(itLeft);
875 itRight = rightList.
erase(itRight);
897 double v_mean, v_std;
898 unsigned int count = 0;
900 dist.setSize(feat_list.size(), 1);
905 for (itPair = feat_list.begin(); itPair != feat_list.end();
914 dist(
count, 0) = sqrt(
915 square(itPair->other_x - itPair->this_x) +
916 square(itPair->other_y - itPair->this_y) +
917 square(itPair->other_z - itPair->this_z));
920 dist.meanAndStdAll(v_mean, v_std);
923 <<
"*****************************************************" << endl;
924 cout <<
"Mean: " << v_mean <<
" - STD: " << v_std << endl;
926 <<
"*****************************************************" << endl;
929 unsigned int idx = 0;
931 for (itPair = feat_list.begin(); itPair != feat_list.end(); idx++)
934 if (fabs(dist(idx, 0) - v_mean) > v_std * numberOfSigmas)
936 cout <<
"Outlier deleted: " << dist(idx, 0) <<
" vs " 937 << v_std * numberOfSigmas << endl;
938 itPair = feat_list.erase(itPair);
void trackFeatures_addNewFeats(FEATLIST &featureList, const TSimpleFeatureList &new_feats, const std::vector< size_t > &sorted_indices, const size_t nNewToCheck, const size_t maxNumFeatures, const float minimum_KLT_response_to_add, const double threshold_sqr_dist_to_add_new, const size_t patchSize, const CImage &cur_gray, TFeatureID &max_feat_ID_at_input)
const T & get_unsafe(size_t row, size_t col) const
Fast but unsafe method to read a value from the matrix.
std::shared_ptr< CFeature > Ptr
GLuint GLuint GLsizei count
Helper class: KD-tree search class for vector<KeyPoint>: Call mark_as_outdated() to force rebuilding ...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL.
Declares a matrix of booleans (non serializable).
void trackFeatures_updatePatch< TSimpleFeaturefList >(TSimpleFeaturefList &featureList, const CImage &cur_gray)
void trackFeatures(const mrpt::utils::CImage &old_img, const mrpt::utils::CImage &new_img, TSimpleFeatureList &inout_featureList)
Perform feature tracking from "old_img" to "new_img", with a (possibly empty) list of previously trac...
A class for storing images as grayscale or RGB bitmaps.
size_t trackFeatures_deleteOOB_impl_simple_feat(FEATLIST &trackedFeats, const size_t img_width, const size_t img_height, const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
TFeatureTrackStatus track_status
featKLT, featHarris, featSURF, featBeacon
#define THROW_EXCEPTION(msg)
A pair (x,y) of pixel coordinates (integer resolution).
float epipolar_TH
Epipolar constraint (rows of pixels)
static void detectFeatures_SSE2_FASTER12(const mrpt::utils::CImage &img, TSimpleFeatureList &corners, const int threshold=20, bool append_to_list=false, uint8_t octave=0, std::vector< size_t > *out_feats_index_by_row=nullptr)
Just like detectFeatures_SSE2_FASTER9() for another version of the detector.
Feature correctly tracked.
void filterBadCorrsByDistance(mrpt::utils::TMatchingPairList &list, unsigned int numberOfSigmas)
Filter bad correspondences by distance ...
float y
Coordinates in the image.
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value...
TFeatureTrackStatus track_status
Status of the feature tracking process.
T square(const T x)
Inline function for the square of a number.
virtual void trackFeatures_impl(const mrpt::utils::CImage &old_img, const mrpt::utils::CImage &new_img, TSimpleFeaturefList &inout_featureList)
The tracking method implementation, to be implemented in children classes.
void trackFeatures_checkResponses_impl_simple(FEAT_LIST &featureList, const CImage &cur_gray, const float minimum_KLT_response, const unsigned int KLT_response_half_win, const unsigned int max_x_, const unsigned int max_y_)
FAST feature detector, OpenCV's implementation ("Faster and better: A machine learning approac...
Inactive (right after detection, and before being tried to track)
A helper struct to sort keypoints by their response: It can be used with these types: ...
This base provides a set of functions for maths stuff.
size_t getWidth() const override
Returns the width of the image in pixels.
float KLT_response(const unsigned int x, const unsigned int y, const unsigned int half_window_size) const
Compute the KLT response at a given pixel (x,y) - Only for grayscale images (for efficiency it avoids...
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
void trackFeatures_addNewFeats< TSimpleFeaturefList >(TSimpleFeaturefList &featureList, const TSimpleFeatureList &new_feats, const std::vector< size_t > &sorted_indices, const size_t nNewToCheck, const size_t maxNumFeatures, const float minimum_KLT_response_to_add, const double threshold_sqr_dist_to_add_new, const size_t patchSize, const CImage &cur_gray, TFeatureID &max_feat_ID_at_input)
void trackFeatures_updatePatch< TSimpleFeatureList >(TSimpleFeatureList &featureList, const CImage &cur_gray)
void openCV_cross_correlation(const mrpt::utils::CImage &img, const mrpt::utils::CImage &patch_img, size_t &x_max, size_t &y_max, double &max_val, int x_search_ini=-1, int y_search_ini=-1, int x_search_size=-1, int y_search_size=-1)
Computes the correlation between this image and another one, encapsulating the openCV function cvMatc...
void updateAdaptiveNewFeatsThreshold(const size_t nNewlyDetectedFeats, const size_t desired_num_features)
Adapts the threshold m_detector_adaptive_thres according to the real and desired number of features j...
size_t getHeight() const override
Returns the height of the image in pixels.
void trackFeatures_addNewFeats< TSimpleFeatureList >(TSimpleFeatureList &featureList, const TSimpleFeatureList &new_feats, const std::vector< size_t > &sorted_indices, const size_t nNewToCheck, const size_t maxNumFeatures, const float minimum_KLT_response_to_add, const double threshold_sqr_dist_to_add_new, const size_t patchSize, const CImage &cur_gray, TFeatureID &max_feat_ID_at_input)
Classes for computer vision, detectors, features, etc.
A generic 2D feature from an image, extracted with CFeatureExtraction Each feature may have one or mo...
uint8_t octave
The image octave the image was found in: 0=original image, 1=1/2 image, 2=1/4 image, etc.
iterator erase(const iterator &it)
uint64_t TFeatureID
Definition of a feature ID.
A list of visual features, to be used as output by detectors, as input/output by trackers, etc.
Unable to track this feature (mismatch is too high for the given tracking window: lack of texture...
void checkTrackedFeatures(CFeatureList &leftList, CFeatureList &rightList, vision::TMatchingOptions options)
Search for correspondences which are not in the same row and deletes them ...
float response
process (old name: KLT_status)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void trackFeatures_addNewFeats< CFeatureList >(CFeatureList &featureList, const TSimpleFeatureList &new_feats, const std::vector< size_t > &sorted_indices, const size_t nNewToCheck, const size_t maxNumFeatures, const float minimum_KLT_response_to_add, const double threshold_sqr_dist_to_add_new, const size_t patchSize, const CImage &cur_gray, TFeatureID &max_feat_ID_at_input)
void trackFeatures_checkResponses(FEATLIST &featureList, const CImage &cur_gray, const float minimum_KLT_response, const unsigned int KLT_response_half_win, const unsigned int max_x, const unsigned int max_y)
void trackFeatures_addNewFeats_simple_list(FEAT_LIST &featureList, const TSimpleFeatureList &new_feats, const std::vector< size_t > &sorted_indices, const size_t nNewToCheck, const size_t maxNumFeatures, const float minimum_KLT_response_to_add, const double threshold_sqr_dist_to_add_new, const size_t patchSize, const CImage &cur_gray, TFeatureID &max_feat_ID_at_input)
TFeatureID ID
ID of the feature.
size_t trackFeatures_deleteOOB(FEATLIST &trackedFeats, const size_t img_width, const size_t img_height, const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
pixel_coords_t pt
Coordinates in the image.
float response
A measure of the "goodness" of the feature (typically, the KLT_response value)
A structure containing options for the matching.
A simple structure for representing one image feature (without descriptor nor patch) - This is the te...
void trackFeatures_updatePatch< CFeatureList >(CFeatureList &featureList, const CImage &cur_gray)
int round(const T value)
Returns the closer integer (int) to x.
TInternalFeatList::iterator iterator
float minCC_TH
Minimum Value of the Cross Correlation.
void setSize(size_t row, size_t col, bool zeroNewElements=false)
Changes the size of matrix, maintaining the previous contents.
void trackFeatures_checkResponses< CFeatureList >(CFeatureList &featureList, const CImage &cur_gray, const float minimum_KLT_response, const unsigned int KLT_response_half_win, const unsigned int max_x, const unsigned int max_y)
mrpt::utils::CImage patch
A patch of the image surrounding the feature.
void trackFeatures_checkResponses< TSimpleFeatureList >(TSimpleFeatureList &featureList, const CImage &cur_gray, const float minimum_KLT_response, const unsigned int KLT_response_half_win, const unsigned int max_x, const unsigned int max_y)
Feature fell Out Of Bounds (out of the image limits, too close to image borders)
This class is a "CSerializable" wrapper for "CMatrixFloat".
void trackFeatures_updatePatch(FEATLIST &featureList, const CImage &cur_gray)
size_t trackFeatures_deleteOOB(CFeatureList &trackedFeats, const size_t img_width, const size_t img_height, const int MIN_DIST_MARGIN_TO_STOP_TRACKING)
void trackFeatures_checkResponses< TSimpleFeaturefList >(TSimpleFeaturefList &featureList, const CImage &cur_gray, const float minimum_KLT_response, const unsigned int KLT_response_half_win, const unsigned int max_x, const unsigned int max_y)
void internal_trackFeatures(const mrpt::utils::CImage &old_img, const mrpt::utils::CImage &new_img, FEATLIST &inout_featureList)
Perform feature tracking from "old_img" to "new_img", with a (possibly empty) list of previously trac...
void fillAll(const T &val)