From c5c3d3e6de11f622aa9d24a5884a11a88833163f Mon Sep 17 00:00:00 2001
From: cesardebeunne <debeunnecesar@gmail.com>
Date: Fri, 22 Apr 2022 11:24:36 +0200
Subject: [PATCH] Use homogeneous pixels for Outlier rejection Makes it more
 modular Add getters for eigen points on WKeyPoints Add computeRay to
 sensorCamera Edit filterWithEssential

---
 include/vision/capture/capture_image.h      |  3 +++
 include/vision/sensor/sensor_camera.h       |  1 +
 src/processor/processor_visual_odometry.cpp | 12 +++++++++---
 src/sensor/sensor_camera.cpp                |  7 +++++++
 4 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/include/vision/capture/capture_image.h b/include/vision/capture/capture_image.h
index 66415c5d7..2cc479082 100644
--- a/include/vision/capture/capture_image.h
+++ b/include/vision/capture/capture_image.h
@@ -60,6 +60,9 @@ class WKeyPoint
         cv::KeyPoint getCvKeyPoint() const {return cv_kp_;}
         void setCvKeyPoint(cv::KeyPoint _cv_kp) {cv_kp_ = _cv_kp;}
 
+        Eigen::Vector2f getEigenKeyPoint() const {return Eigen::Vector2f(cv_kp_.pt.x, cv_kp_.pt.y);}
+        cv::Point2f getCvPoint() const {return cv_kp_.pt;}
+
         cv::Mat getDescriptor() const {return desc_;}
         void setDescriptor(cv::Mat _desc) {desc_ = _desc;}
 
diff --git a/include/vision/sensor/sensor_camera.h b/include/vision/sensor/sensor_camera.h
index 91b23e254..adf852759 100644
--- a/include/vision/sensor/sensor_camera.h
+++ b/include/vision/sensor/sensor_camera.h
@@ -120,6 +120,7 @@ class SensorCamera : public SensorBase
         bool useRawImages();
         bool useRectifiedImages();
 
+        Eigen::Vector3f computeRay(Eigen::Vector2f _pix);
 
         int getImgWidth(){return img_width_;}
         int getImgHeight(){return img_height_;}
diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp
index a0ea2f2b3..2192ab6af 100644
--- a/src/processor/processor_visual_odometry.cpp
+++ b/src/processor/processor_visual_odometry.cpp
@@ -651,20 +651,26 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev
     std::vector<size_t> all_indices;
     for (auto & track : _tracks_prev_curr){
         all_indices.push_back(track.first);
-        p2f_prev.push_back(_mwkps_prev.at(track.first).getCvKeyPoint().pt);
-        p2f_curr.push_back(_mwkps_curr.at(track.second).getCvKeyPoint().pt);
+        Eigen::Vector3f ray_prev = sen_cam_->computeRay(_mwkps_prev.at(track.first).getEigenKeyPoint());
+        Eigen::Vector3f ray_curr = sen_cam_->computeRay(_mwkps_curr.at(track.second).getEigenKeyPoint());
+        p2f_prev.push_back(cv::Point2f(ray_prev.x() / ray_prev.z(), ray_prev.y() / ray_prev.z()));
+        p2f_curr.push_back(cv::Point2f(ray_curr.x() / ray_curr.z(), ray_curr.y() / ray_curr.z()));
     }
 
     // We need at least five tracks
     if (p2f_prev.size() < 5) return false;
 
     cv::Mat cvMask;
+    cv::Mat K = cv::Mat::eye(3,3,CV_32F);
+    float focal = (sen_cam_->getIntrinsicMatrix()(0,0) +
+                   sen_cam_->getIntrinsicMatrix()(1,1)) / 2;
+
     _E = cv::findEssentialMat(p2f_prev, 
                               p2f_curr, 
                               Kcv_, 
                               cv::RANSAC,
                               prms.ransac_prob_,
-                              prms.ransac_thresh_,
+                              prms.ransac_thresh_ / focal,
                               cvMask);
     
     // Let's remove outliers from tracksMap
diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp
index 8c57c542e..888a4cf5d 100644
--- a/src/sensor/sensor_camera.cpp
+++ b/src/sensor/sensor_camera.cpp
@@ -71,6 +71,13 @@ Eigen::Matrix3d SensorCamera::setIntrinsicMatrix(Eigen::Vector4d _pinhole_model)
     K.row(2) << 0, 0, 1;
     return K;
 }
+
+Eigen::Vector3f SensorCamera::computeRay(Eigen::Vector2f _pix)
+{
+    Eigen::Vector3f ray;
+    ray = K_.cast<float>().inverse() * Eigen::Vector3f(_pix.x(), _pix.y(), 1);
+    return ray; 
+}
 } // namespace wolf
 
 // Register in the FactorySensor
-- 
GitLab