From 4947a8a47543dc1247551ec1d75cdf7b04f45689 Mon Sep 17 00:00:00 2001
From: Joan Sola <jsola@iri.upc.edu>
Date: Tue, 26 Apr 2022 14:02:22 +0200
Subject: [PATCH] Add equalization options: none, average, clahe

---
 .../processor/processor_visual_odometry.h     | 39 +++++++++++++++++--
 src/processor/processor_visual_odometry.cpp   | 39 ++++++++++++++++---
 2 files changed, 70 insertions(+), 8 deletions(-)

diff --git a/include/vision/processor/processor_visual_odometry.h b/include/vision/processor/processor_visual_odometry.h
index 2a526b4f3..b42766496 100644
--- a/include/vision/processor/processor_visual_odometry.h
+++ b/include/vision/processor/processor_visual_odometry.h
@@ -81,12 +81,30 @@ struct ParamsProcessorVisualOdometry : public ParamsProcessorTracker
         unsigned int separation_;
     };
 
+    struct EqualizationParams
+    {
+            unsigned int method_; // 0: none; 1: average; 2: histogram; 3: CLAHE
+            struct AverageParams
+            {
+                    int median_;
+            } average_;
+            struct HistogramParams
+            {
+                    // TODO: to be implemented
+            } histogram_;
+            struct ClaheParams
+            {
+                    double clip_limit_;
+                    cv::Size2i tile_grid_size_;
+            } clahe_;
+    };
+
     double std_pix_;
-    bool use_clahe_;
     RansacParams ransac_params_;
     KltParams klt_params_;
     FastParams fast_params_;
     GridParams grid_params_;
+    EqualizationParams equalization_params_;
     unsigned int max_nb_tracks_;
     unsigned int min_track_length_for_landmark_;
 
@@ -96,7 +114,23 @@ struct ParamsProcessorVisualOdometry : public ParamsProcessorTracker
     {
         std_pix_ = _server.getParam<int>(prefix + _unique_name + "/std_pix");
 
-        use_clahe_ = _server.getParam<bool>(prefix + _unique_name + "/use_clahe");
+        equalization_params_.method_ = _server.getParam<unsigned int>(prefix + _unique_name + "/equalization_params/method");
+        switch (equalization_params_.method_)
+        {
+            case 0: break;
+            case 1:
+                equalization_params_.average_.median_ = _server.getParam<unsigned int>(prefix + _unique_name + "/equalization_params/average/median");
+                break;
+            case 2:
+//                equalization_params_.average_.median_ = _server.getParam<unsigned int>(prefix + _unique_name + "/equalization_params/average/median");
+                break;
+            case 3:
+                equalization_params_.clahe_.clip_limit_ = _server.getParam<double>(prefix + _unique_name + "/equalization_params/clahe/clip_limit");
+                vector<int> grid_size = _server.getParam<vector<int>>(prefix + _unique_name + "/equalization_params/clahe/tile_grid_size");
+                equalization_params_.clahe_.tile_grid_size_.width  = grid_size[0];
+                equalization_params_.clahe_.tile_grid_size_.height = grid_size[1];
+                break;
+        }
 
         ransac_params_.ransac_prob_   = _server.getParam<double>(prefix + _unique_name + "/ransac_params/ransac_prob");
         ransac_params_.ransac_thresh_ = _server.getParam<double>(prefix + _unique_name + "/ransac_params/ransac_thresh");
@@ -122,7 +156,6 @@ struct ParamsProcessorVisualOdometry : public ParamsProcessorTracker
     std::string print() const override
     {
         return ParamsProcessorTracker::print()                                                                   + "\n"
-            + "use_clahe_:                       " + std::to_string(use_clahe_)                                                   + "\n"
             + "ransac_params_.ransac_prob_:      " + std::to_string(ransac_params_.ransac_prob_)                 + "\n"
             + "ransac_params_.ransac_thresh_:    " + std::to_string(ransac_params_.ransac_thresh_)               + "\n"
             + "klt_params_.tracker_width_:       " + std::to_string(klt_params_.patch_width_)                    + "\n"
diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp
index 9b6c0c89e..4ef31d06b 100644
--- a/src/processor/processor_visual_odometry.cpp
+++ b/src/processor/processor_visual_odometry.cpp
@@ -86,11 +86,40 @@ void ProcessorVisualOdometry::preProcess()
 
     cv::Mat img_incoming = capture_image_incoming_->getImage();
 
-    if (params_visual_odometry_->use_clahe_){
-        // Contrast Limited Adaptive Histogram Equalization  
-        // -> more continuous lighting and higher contrast images
-        cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(2.0, cv::Size(8,8));
-        clahe->apply(img_incoming, img_incoming);
+
+    /* Equalize image for better detection and tracking
+     * available methods:
+     *      0. none
+     *      1. average
+     *      2. opencv: histogram_equalization
+     *      3. opencv: CLAHE
+     */
+    switch (params_visual_odometry_->equalization_params_.method_)
+    {
+        case 0:
+            break;
+        case 1:
+        {
+            // average to central brightness
+            auto img_avg = (cv::mean(img_incoming)).val[0];
+            img_incoming += cv::Scalar(round(params_visual_odometry_->equalization_params_.average_.median_ - img_avg) );
+            break;
+        }
+        case 2:
+        {
+            // TODO: implement histogram equalization
+            WOLF_WARN("Histogram equalization not yet implemented. Ignoring.");
+            break;
+        }
+        case 3:
+        {
+            // Contrast Limited Adaptive Histogram Equalization  CLAHE
+            // -> more continuous lighting and higher contrast images
+            cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(params_visual_odometry_->equalization_params_.clahe_.clip_limit_,
+                                                       params_visual_odometry_->equalization_params_.clahe_.tile_grid_size_);
+            clahe->apply(img_incoming, img_incoming);
+            break;
+        }
     }
 
 
-- 
GitLab