diff --git a/include/vision/capture/capture_image.h b/include/vision/capture/capture_image.h
index 2cc479082546c8955e807ad124d11102a17a2733..fa938812d54188675d06eeec09cef3d05850f4de 100644
--- a/include/vision/capture/capture_image.h
+++ b/include/vision/capture/capture_image.h
@@ -60,8 +60,8 @@ 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;}
+        Eigen::Vector2d getEigenKeyPoint() const {return Eigen::Vector2d(cv_kp_.pt.x, cv_kp_.pt.y);}
+        cv::Point2d 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 adf8527596f4d3915083073c839d94d6c3128d25..107ec7d06a0840d96d1baf86ec80bbd7adc2bb53 100644
--- a/include/vision/sensor/sensor_camera.h
+++ b/include/vision/sensor/sensor_camera.h
@@ -115,13 +115,12 @@ class SensorCamera : public SensorBase
         Eigen::VectorXd getDistortionVector()   { return distortion_; }
         Eigen::VectorXd getCorrectionVector()   { return correction_; }
         Eigen::Matrix3d getIntrinsicMatrix()    { return K_; }
+        Eigen::Vector4d getPinholeModel()       { return pinhole_model_raw_; }
 
         bool isUsingRawImages() { return using_raw_; }
         bool useRawImages();
         bool useRectifiedImages();
 
-        Eigen::Vector3f computeRay(Eigen::Vector2f _pix);
-
         int getImgWidth(){return img_width_;}
         int getImgHeight(){return img_height_;}
         void setImgWidth(int _w){img_width_ = _w;}
diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp
index 2192ab6af4cdef0962ec61df6350309a54eba44b..9d78da8163e258d588231e9436825f6873a9063a 100644
--- a/src/processor/processor_visual_odometry.cpp
+++ b/src/processor/processor_visual_odometry.cpp
@@ -646,27 +646,27 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev
 {
     ParamsProcessorVisualOdometry::RansacParams prms = params_visual_odometry_->ransac_params_;
 
-    // We need to build lists of pt2f for openCV function
-    std::vector<cv::Point2f> p2f_prev, p2f_curr;
+    // We need to build lists of pt2d for openCV function
+    std::vector<cv::Point2d> p2d_prev, p2d_curr;
     std::vector<size_t> all_indices;
     for (auto & track : _tracks_prev_curr){
         all_indices.push_back(track.first);
-        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()));
+        Eigen::Vector2d ray_prev = pinhole::depixellizePoint(sen_cam_->getPinholeModel(), _mwkps_prev.at(track.first).getEigenKeyPoint());
+        Eigen::Vector2d ray_curr = pinhole::depixellizePoint(sen_cam_->getPinholeModel(), _mwkps_curr.at(track.second).getEigenKeyPoint());
+        p2d_prev.push_back(cv::Point2d(ray_prev.x(), ray_prev.y()));
+        p2d_curr.push_back(cv::Point2d(ray_curr.x(), ray_curr.y()));
     }
 
     // We need at least five tracks
-    if (p2f_prev.size() < 5) return false;
+    if (p2d_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) +
+    double focal = (sen_cam_->getIntrinsicMatrix()(0,0) +
                    sen_cam_->getIntrinsicMatrix()(1,1)) / 2;
 
-    _E = cv::findEssentialMat(p2f_prev, 
-                              p2f_curr, 
+    _E = cv::findEssentialMat(p2d_prev, 
+                              p2d_curr, 
                               Kcv_, 
                               cv::RANSAC,
                               prms.ransac_prob_,
diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp
index 888a4cf5dd73d8d71beb0a3ccf11ba8562fa3ff0..8c57c542eae854c48476ad4caf1023fc7bac1ec0 100644
--- a/src/sensor/sensor_camera.cpp
+++ b/src/sensor/sensor_camera.cpp
@@ -71,13 +71,6 @@ 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
diff --git a/test/gtest_processor_visual_odometry.cpp b/test/gtest_processor_visual_odometry.cpp
index 4a584eb7a8848c649b7ca425c450bc35861b9b84..76c2713c056fe96d5dc465517d9ddf39f57e384c 100644
--- a/test/gtest_processor_visual_odometry.cpp
+++ b/test/gtest_processor_visual_odometry.cpp
@@ -404,8 +404,8 @@ TEST(ProcessorVisualOdometry, filterWithEssential)
     ASSERT_EQ(tracks_prev_curr.size(), mwkps_curr.size());
 
     // We had here an outlier: a keyPoint that doesn't move
-    mwkps_prev.insert(std::pair<size_t, WKeyPoint>(8, WKeyPoint(cv::KeyPoint(cv::Point2f(120,140), 1))));
-    mwkps_curr.insert(std::pair<size_t, WKeyPoint>(8, WKeyPoint(cv::KeyPoint(cv::Point2f(120,140), 1))));
+    mwkps_prev.insert(std::pair<size_t, WKeyPoint>(8, WKeyPoint(cv::KeyPoint(cv::Point2d(120,140), 1))));
+    mwkps_curr.insert(std::pair<size_t, WKeyPoint>(8, WKeyPoint(cv::KeyPoint(cv::Point2d(120,140), 1))));
     tracks_prev_curr.insert(std::pair<size_t, size_t>(8,8)); 
 
     // point at 8 must be discarded