diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp index 9d78da8163e258d588231e9436825f6873a9063a..d09564c1eeb298b2e0254c049f8ef5c0dbc0ad66 100644 --- a/src/processor/processor_visual_odometry.cpp +++ b/src/processor/processor_visual_odometry.cpp @@ -185,23 +185,17 @@ void ProcessorVisualOdometry::preProcess() // Edit tracks prev with only inliers wrt origin // and remove also from mwkps_incoming all the keypoints that have not been tracked TracksMap tracks_last_incoming_filtered; - KeyPointsMap mwkps_incoming_fitered; + KeyPointsMap mwkps_incoming_filtered; for (auto & track_origin_incoming : tracks_origin_incoming){ for (auto & track_last_incoming : tracks_last_incoming){ if (track_origin_incoming.second == track_last_incoming.second){ tracks_last_incoming_filtered[track_last_incoming.first] = track_last_incoming.second; - mwkps_incoming_fitered[track_last_incoming.second] = mwkps_incoming.at(track_last_incoming.second); + mwkps_incoming_filtered[track_last_incoming.second] = mwkps_incoming.at(track_last_incoming.second); continue; } } } - WOLF_INFO( "Tracked " , mwkps_incoming_fitered.size(), " inliers in incoming" ); - - // Update captures - capture_image_incoming_->addKeyPoints(mwkps_incoming_fitered); - capture_image_incoming_->setTracksPrev(tracks_last_incoming_filtered); - capture_image_incoming_->setTracksOrigin(tracks_origin_incoming); - + WOLF_INFO( "Tracked " , mwkps_incoming_filtered.size(), " inliers in incoming" ); //////////////////////////////// @@ -221,7 +215,10 @@ void ProcessorVisualOdometry::preProcess() cell_grid_.renew(); // Add last Keypoints that still form valid tracks between last and incoming + // And create a filtered map for last keypoints + KeyPointsMap mwkps_last_filtered; for (auto track: tracks_last_incoming_filtered){ + mwkps_last_filtered.at(track.first) = mwkps_last.at(track.first); size_t last_kp_id = track.first; cell_grid_.hitCell(capture_image_last_->getKeyPoints().at(last_kp_id).getCvKeyPoint()); } @@ -275,29 +272,25 @@ void ProcessorVisualOdometry::preProcess() TracksMap tracks_last_incoming_new = kltTrack(img_last, img_incoming, mwkps_last_new, mwkps_incoming_new); -// WOLF_INFO("Tracked ", mwkps_incoming_new.size(), " new keypoints to incoming"); - - // Outliers rejection with essential matrix - // tracks that are not geometrically consistent are removed from tracks_last_incoming_new - filterWithEssential(mwkps_last_new, mwkps_incoming_new, tracks_last_incoming_new, E); - WOLF_INFO("Tracked ", mwkps_incoming_new.size(), " inliers in incoming"); +// WOLF_INFO("Tracked ", mwkps_incoming_new.size(), " new keypoints to incoming"); + // Concatenation of old tracks and new tracks // Only keep tracks until it reaches a max nb of tracks // TODO: the strategy for keeping the best new tracks is dumb // -> should be improved for a better spatial repartition for (auto & track: tracks_last_incoming_new){ tracks_last_incoming_filtered[track.first] = track.second; + mwkps_last_filtered[track.first] = mwkps_last_new[track.first]; + mwkps_incoming_filtered[track.second] = mwkps_incoming_new[track.second]; } - WOLF_INFO("New total : ", n_tracks_origin, " + ", mwkps_incoming_new.size(), " = ", tracks_last_incoming_filtered.size(), " tracks"); + // Outliers rejection with essential matrix + // tracks that are not geometrically consistent are removed from tracks_last_incoming_new + filterWithEssential(mwkps_last_filtered, mwkps_incoming_filtered, tracks_last_incoming_filtered, E); - // Update captures - capture_image_last_->addKeyPoints(mwkps_last_new); - capture_image_incoming_->addKeyPoints(mwkps_incoming_new); - capture_image_incoming_->setTracksPrev(tracks_last_incoming_filtered); - capture_image_incoming_->setTracksOrigin(tracks_origin_incoming); // careful! + WOLF_INFO("New total : ", n_tracks_origin, " + ", mwkps_incoming_new.size(), " = ", tracks_last_incoming_filtered.size(), " tracks"); // add a flag so that voteForKeyFrame use it to vote for a KeyFrame capture_image_incoming_->setLastWasRepopulated(true); @@ -307,6 +300,11 @@ void ProcessorVisualOdometry::preProcess() WOLF_INFO("\n\n"); } + // Update captures + capture_image_incoming_->addKeyPoints(mwkps_incoming_filtered); + capture_image_incoming_->setTracksPrev(tracks_last_incoming_filtered); + capture_image_incoming_->setTracksOrigin(tracks_origin_incoming); + auto dt_preprocess = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count(); // print a bar with the number of active tracks in incoming