diff --git a/include/vision/sensor/sensor_camera.h b/include/vision/sensor/sensor_camera.h
index f677c9bccafd7800520ca30e1bcabf882adbdd57..d4b6c34af7cc35eaa7da9c8dedb8754d5bdf1754 100644
--- a/include/vision/sensor/sensor_camera.h
+++ b/include/vision/sensor/sensor_camera.h
@@ -137,17 +137,18 @@ class SensorCamera : public SensorBase
 
         ~SensorCamera() override;
 
-        Eigen::VectorXd getDistortionVector()   { return distortion_; }
-        Eigen::VectorXd getCorrectionVector()   { return correction_; }
-        Eigen::Matrix3d getIntrinsicMatrix()    { return K_; }
-        Eigen::Vector4d getPinholeModel()       { if (using_raw_) return pinhole_model_raw_; else return pinhole_model_rectified_;}
+        Eigen::VectorXd getDistortionVector()const   { return distortion_; }
+        Eigen::VectorXd getCorrectionVector()const   { return correction_; }
+        Eigen::Matrix3d getIntrinsicMatrix() const   { return K_; }
+        Eigen::Vector4d getPinholeModel()    const   { if (using_raw_) return pinhole_model_raw_; else return pinhole_model_rectified_;}
+        Eigen::Matrix<double, 3, 4>getProjectionMatrix() const;
 
-        bool isUsingRawImages() { return using_raw_; }
+        bool isUsingRawImages() const { return using_raw_; }
         bool useRawImages();
         bool useRectifiedImages();
 
-        int getImgWidth()           {return img_width_;}
-        int getImgHeight()          {return img_height_;}
+        int getImgWidth()  const    {return img_width_;}
+        int getImgHeight() const    {return img_height_;}
         void setImgWidth(int _w)    {img_width_ = _w;}
         void setImgHeight(int _h)   {img_height_ = _h;}
 
@@ -160,7 +161,7 @@ class SensorCamera : public SensorBase
         Eigen::Matrix3d K_;
         bool using_raw_;
 
-        virtual Eigen::Matrix3d setIntrinsicMatrix(Eigen::Vector4d _pinhole_model);
+        Eigen::Matrix3d computeIntrinsicMatrix(const Eigen::Vector4d& _pinhole_model) const;
 
     public:
         EIGEN_MAKE_ALIGNED_OPERATOR_NEW; // to guarantee alignment (see http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html)
@@ -169,7 +170,7 @@ class SensorCamera : public SensorBase
 inline bool SensorCamera::useRawImages()
 {
     getIntrinsic()->setState(pinhole_model_raw_);
-    K_ = setIntrinsicMatrix(pinhole_model_raw_);
+    K_ = computeIntrinsicMatrix(pinhole_model_raw_);
     using_raw_ = true;
 
     return true;
@@ -178,7 +179,7 @@ inline bool SensorCamera::useRawImages()
 inline bool SensorCamera::useRectifiedImages()
 {
     getIntrinsic()->setState(pinhole_model_rectified_);
-    K_ = setIntrinsicMatrix(pinhole_model_rectified_);
+    K_ = computeIntrinsicMatrix(pinhole_model_rectified_);
     distortion_.resize(0); // remove distortion from model
     correction_.resize(0);
     using_raw_ = false;
diff --git a/src/sensor/sensor_camera.cpp b/src/sensor/sensor_camera.cpp
index 3ecb7d08418bc68bcc43990f53b0a313ac017076..311e2212bfb260646092b8ae9a48fb6f6d716c50 100644
--- a/src/sensor/sensor_camera.cpp
+++ b/src/sensor/sensor_camera.cpp
@@ -62,7 +62,15 @@ SensorCamera::~SensorCamera()
     //
 }
 
-Eigen::Matrix3d SensorCamera::setIntrinsicMatrix(Eigen::Vector4d _pinhole_model)
+Eigen::Matrix<double, 3, 4> SensorCamera::getProjectionMatrix() const
+{
+    Eigen::Matrix<double, 3, 4> P;
+    P.setZero();
+    P.leftCols(3) = getIntrinsicMatrix();
+    return P;
+}
+
+Eigen::Matrix3d SensorCamera::computeIntrinsicMatrix(const Eigen::Vector4d& _pinhole_model) const
 {
     Eigen::Matrix3d K;
     K(0, 0) = _pinhole_model(2);