diff --git a/include/publisher_vision.h b/include/publisher_vision.h index 8789a01e4509f0ff529b6277c16fdda37733fe6d..d278e777a60d5198ed06c7ae1f2ee0a22f23bb9d 100644 --- a/include/publisher_vision.h +++ b/include/publisher_vision.h @@ -83,7 +83,9 @@ class PublisherVisionDebug : public Publisher int size_feature_kfs_pix_; double thickness_lmk_; double size_text_ID_; + double thickness_track_; COLOR color_tracks_features_; + COLOR color_tracks_features_preprocess_; COLOR color_landmarks_; COLOR color_last_keypoints_; @@ -149,6 +151,7 @@ class PublisherVisionDebug : public Publisher */ void showLandmarks (cv::Mat _image, const TrackMatrix& _track_matrix, const CaptureBasePtr& _cap); + void showTracksPreprocess (cv::Mat _image, const CaptureImagePtr& _origin, const CaptureImagePtr& _last); }; WOLF_REGISTER_PUBLISHER(PublisherVisionDebug) diff --git a/src/publisher_vision.cpp b/src/publisher_vision.cpp index 55e3ce7c3d4d258411d746fc2c971fee07f2a9aa..175bbd0ad2d8d3483910f3e669a0833289c9ff9d 100644 --- a/src/publisher_vision.cpp +++ b/src/publisher_vision.cpp @@ -57,7 +57,7 @@ COLOR PublisherVisionDebug::colorStringToEnum(const std::string _color) return COLOR::RED; else { std::cout << _color << " color not available! Defaulting to CYAN." << std::endl; - return COLOR::MAGENTA; + return COLOR::CYAN; } } @@ -72,24 +72,27 @@ PublisherVisionDebug::PublisherVisionDebug(const std::string &_unique_name, // if user do not provide processor's name, first processor of type PublisherVisionDebug is taken auto processor_name = getParamWithDefault<std::string>(_server, prefix_ + "/processor_name", ""); - show_tracks_ID_ = getParamWithDefault<bool>(_server, prefix_ + "/show_tracks_ID", false); - show_landmarks_ID_ = getParamWithDefault<bool>(_server, prefix_ + "/show_landmarks_ID", false); - min_luminosity_ = getParamWithDefault<int>(_server, prefix_ + "/min_luminosity", 100); - max_luminosity_ = getParamWithDefault<int>(_server, prefix_ + "/max_luminosity", 450); - thickness_curr_ftr_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_curr_ftr", -1); - size_feature_curr_pix_ = getParamWithDefault<int>(_server, prefix_ + "/size_feature_curr_pix", 2); - thickness_kfs_ftr_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_kfs_ftr", 0.1); - size_feature_kfs_pix_ = getParamWithDefault<int>(_server, prefix_ + "/size_feature_kfs_pix", 1); - thickness_lmk_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_lmk", 5); - size_text_ID_ = getParamWithDefault<double>(_server, prefix_ + "/size_text_ID", 0.5); - std::string str_color_tracks_features = getParamWithDefault<std::string>(_server, prefix_ + "/color_tracks_features", "CYAN"); - std::string str_color_landmarks = getParamWithDefault<std::string>(_server, prefix_ + "/color_landmarks", "CYAN"); - std::string str_color_last_keypoints = getParamWithDefault<std::string>(_server, prefix_ + "/color_last_keypoints", "CYAN"); + show_tracks_ID_ = getParamWithDefault<bool>(_server, prefix_ + "/show_tracks_ID", false); + show_landmarks_ID_ = getParamWithDefault<bool>(_server, prefix_ + "/show_landmarks_ID", false); + min_luminosity_ = getParamWithDefault<int>(_server, prefix_ + "/min_luminosity", 100); + max_luminosity_ = getParamWithDefault<int>(_server, prefix_ + "/max_luminosity", 450); + thickness_curr_ftr_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_curr_ftr", -1); + size_feature_curr_pix_ = getParamWithDefault<int>(_server, prefix_ + "/size_feature_curr_pix", 2); + thickness_kfs_ftr_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_kfs_ftr", 0.1); + size_feature_kfs_pix_ = getParamWithDefault<int>(_server, prefix_ + "/size_feature_kfs_pix", 1); + thickness_lmk_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_lmk", 5); + size_text_ID_ = getParamWithDefault<double>(_server, prefix_ + "/size_text_ID", 0.5); + thickness_track_ = getParamWithDefault<double>(_server, prefix_ + "/thickness_track", 1.5); + std::string str_color_tracks_features = getParamWithDefault<std::string>(_server, prefix_ + "/color_tracks_features", "CYAN"); + std::string str_color_tracks_features_preProcess = getParamWithDefault<std::string>(_server, prefix_ + "/color_tracks_features_preprocess", "CYAN"); + std::string str_color_landmarks = getParamWithDefault<std::string>(_server, prefix_ + "/color_landmarks", "CYAN"); + std::string str_color_last_keypoints = getParamWithDefault<std::string>(_server, prefix_ + "/color_last_keypoints", "CYAN"); // set color attributes - color_tracks_features_ = colorStringToEnum(str_color_tracks_features); - color_landmarks_ = colorStringToEnum(str_color_landmarks); - color_last_keypoints_ = colorStringToEnum(str_color_last_keypoints); + color_tracks_features_ = colorStringToEnum(str_color_tracks_features); + color_tracks_features_preprocess_ = colorStringToEnum(str_color_tracks_features); + color_landmarks_ = colorStringToEnum(str_color_landmarks); + color_last_keypoints_ = colorStringToEnum(str_color_last_keypoints); // search the processor for (auto sen : _problem->getHardware()->getSensorList()) @@ -131,8 +134,10 @@ void PublisherVisionDebug::publishDerived() // Get capture image auto cap_img = std::dynamic_pointer_cast<CaptureImage>(processor_vision_->getLast()); + auto cap_img_origin = std::dynamic_pointer_cast<CaptureImage>(processor_vision_->getOrigin()); assert(cap_img != nullptr && "Received Capture is not of type CaptureImage!"); + assert(cap_img_origin != nullptr && "Received origin Capture is not of type CaptureImage!"); auto track_matrix = processor_vision_->getTrackMatrix(); // copy track matrix @@ -142,6 +147,7 @@ void PublisherVisionDebug::publishDerived() // Extract cv image cv::Mat cv_img_debug; cv::cvtColor(cap_img->getImage(), cv_img_debug, cv::COLOR_GRAY2BGR); + cv::cvtColor(cap_img_origin->getImage(), cv_img_debug, cv::COLOR_GRAY2BGR); // Draw all tracks showTracks(cv_img_debug, track_matrix, cap_img); @@ -380,7 +386,7 @@ void PublisherVisionDebug::showTracks(cv::Mat _image, // draw line in between keyframes (as well as last KF and current frame) cv::line(_image, cv::Point(ftr->second->getMeasurement(0), ftr->second->getMeasurement(1)), cv::Point(previous->second->getMeasurement(0), previous->second->getMeasurement(1)), - CV_RGB(color[0], color[1], color[2]), 1.5); + CV_RGB(color[0], color[1], color[2]), thickness_track_); } } @@ -530,7 +536,51 @@ void PublisherVisionDebug::showLandmarks(cv::Mat _image, } } +} + +void PublisherVisionDebug::showTracksPreprocess(cv::Mat _image, + const CaptureImagePtr& _origin, + const CaptureImagePtr& _last) +{ + std::vector<int> color_track_preprocess = primaryColor(color_tracks_features_preprocess_); + const auto& tracks_origin = _last->getTracksOrigin(); + const auto& kps_last = _last->getKeyPoints(); + const auto& kps_origin = _origin->getKeyPoints(); + + for(auto it = tracks_origin.begin(); it != tracks_origin.end(); it++) + { + + const auto& it_ftr_origin = kps_origin.find(it->first); + const auto& it_ftr_last = kps_last.find(it->second); + + if (it_ftr_origin != kps_origin.end() && it_ftr_last != kps_last.end()) + { + const auto& ftr_origin = it_ftr_origin->second.getCvKeyPoint(); + const auto& ftr_last = it_ftr_last->second.getCvKeyPoint(); + + const auto& pos_ftr_origin = std::make_tuple(ftr_origin.pt.x, ftr_origin.pt.y) ; + const auto& pos_ftr_last = std::make_tuple(ftr_last.pt.x, ftr_last.pt.y); + + cv::circle(_image, + cv::Point(std::get<0>(pos_ftr_last), std::get<1>(pos_ftr_last)), + size_feature_curr_pix_, + CV_RGB(color_track_preprocess[0], color_track_preprocess[1], color_track_preprocess[2]), + thickness_curr_ftr_); + + cv::circle(_image, + cv::Point(std::get<0>(pos_ftr_origin), std::get<1>(pos_ftr_origin)), + size_feature_kfs_pix_, + CV_RGB(color_track_preprocess[0], color_track_preprocess[1], color_track_preprocess[2]), + thickness_kfs_ftr_); + + cv::line(_image, + cv::Point(std::get<0>(pos_ftr_last), std::get<1>(pos_ftr_last)), + cv::Point(std::get<0>(pos_ftr_origin), std::get<1>(pos_ftr_origin)), + CV_RGB(color_track_preprocess[0], color_track_preprocess[1], color_track_preprocess[2]), + thickness_track_); + } + } }