diff --git a/inc/camera.h b/inc/camera.h
index 1626d1afea00c362d1e323f1f6149309c1e17d92..fd3998f9ff9184446be812f79e1771e2cdc5a5c1 100644
--- a/inc/camera.h
+++ b/inc/camera.h
@@ -15,7 +15,8 @@ class Camera{
 
         rs2::video_frame *color_frame;
         rs2::depth_frame *depth_frame;
-
+        
+        rs2_intrinsics intr_profile;
         float depth_scale;
         cv::Rect croppingMask;
 
diff --git a/inc/projection.h b/inc/projection.h
index 7fb3d02bd2e6e7bc1f7e685d80a2ef40b15da811..2cb0589818c136f803f0f6c040395aa0a7d4e013 100644
--- a/inc/projection.h
+++ b/inc/projection.h
@@ -10,12 +10,12 @@ class Projection{
         cv::Mat adjustingMatrix;
         float distanceTopSandbox;
 
-        void deprojectPixelsFromDepth(cv::Mat &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat &pixelsDeprojectMap);
-        void filterLowestDeprojectedPoints(cv::Mat &depth, cv::Mat &deprojectMap, cv::Mat &frameMapMask);
-        void buildFrame(cv::Mat &depth, cv::Mat &pixelsDeprojectHighestMap, cv::Mat &src, cv::Mat &dst);
+        void deprojectPixelsFromDepth(cv::Mat_<float> &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat_<cv::Point2i> &deprojectMap);
+        void filterLowestDeprojectedPoints(cv::Mat_<float> &depth, cv::Mat_<cv::Point2i> &deprojectMap, cv::Mat_<cv::Point2i> &frameMapMask);
+        void buildFrame(cv::Mat_<float> &depth, cv::Mat_<cv::Point2i> &frameMapMask, cv::Mat_<cv::Vec3b> &src, cv::Mat_<cv::Vec3b> &dst);
         cv::Point2i findMatchingPixel(int i, int j, float z, Camera *camera, cv::Point3f beamer_pos);
-        void copyPixelsInto(cv::Point2i pixel_dst, cv::Mat &dst, cv::Point2i pixel_src, cv::Mat &src, cv::Mat &depth);
-        cv::Size getMatchingSize(cv::Mat &src, cv::Rect base);
+        void copyPixelsInto(cv::Point2i pixel_dst, cv::Mat_<cv::Vec3b> &dst, cv::Point2i pixel_src, cv::Mat_<cv::Vec3b> &src, cv::Mat_<float> &depth);
+        cv::Size getMatchingSize(cv::Mat_<cv::Vec3b> &src, cv::Rect base);
 
     public:
         Projection();
@@ -27,7 +27,7 @@ class Projection{
 
         cv::Point2i rotatePixel(cv::Point2i pixel);
         cv::Point2i revertRotatePixel(cv::Point2i pixel);
-        void adjustFrame(cv::Mat depth, cv::Mat src, cv::Mat &dst, Camera *camera, cv::Point3f beamer_pos);
+        void adjustFrame(cv::Mat_<float> depth, cv::Mat_<cv::Vec3b> src, cv::Mat_<cv::Vec3b> &dst, Camera *camera, cv::Point3f beamer_pos);
         void printAdjustingMatrix();
 
 };
diff --git a/inc/sandbox.h b/inc/sandbox.h
index c517c2bf19a31cd9e19c38f0d31cea8af287e32c..3368f4a3fbb9b90a0cea3a6141c635c93878720f 100644
--- a/inc/sandbox.h
+++ b/inc/sandbox.h
@@ -24,9 +24,9 @@ class Sandbox{
 
         int init();
         void captureFrame();
-        cv::Mat getColorFrame();
-        cv::Mat getDepthFrame();
-        cv::Mat adjustProjection(cv::Mat frame);
+        cv::Mat_<cv::Vec3b> getColorFrame();
+        cv::Mat_<float> getDepthFrame();
+        cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> frame);
         int loadConfig();
         int loadConfigFrom(char *path);
     
diff --git a/src/components/camera.cpp b/src/components/camera.cpp
index dda660ff849927a75a5979df80813c18e0d08d1e..4e90345556492df6156f2c6625ccf8a01641ce49 100644
--- a/src/components/camera.cpp
+++ b/src/components/camera.cpp
@@ -63,6 +63,11 @@ int Camera::start(){
 
     warmUpDepthLens();
 
+    // save intrisic profil since it's an heavy operation (used to project and deproject pixels)
+    // and we use it only in one precise case
+    capture();
+    intr_profile = depth_frame->get_profile().as<rs2::video_stream_profile>().get_intrinsics();
+
     return 0;
 }
 
@@ -96,8 +101,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){
 
     float point[3] = {point3D.x, point3D.y, point3D.z};
     float pixel[2];
-    rs2_intrinsics intr = depth_frame->get_profile().as<rs2::video_stream_profile>().get_intrinsics();
-    rs2_project_point_to_pixel(pixel, &intr, point);
+    rs2_project_point_to_pixel(pixel, &intr_profile, point);
     return cv::Point2i(pixel[0], pixel[1]);
 }
 
@@ -105,8 +109,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){
 cv::Point3f Camera::deprojectPixelToPoint(float coord[], float z){
 
     float p[3];
-    rs2_intrinsics intr = depth_frame->get_profile().as<rs2::video_stream_profile>().get_intrinsics();
-    rs2_deproject_pixel_to_point(p, &intr, coord, z);
+    rs2_deproject_pixel_to_point(p, &intr_profile, coord, z);
     return cv::Point3f(p[0], p[1], p[2]);
 }
 
diff --git a/src/components/projection.cpp b/src/components/projection.cpp
index 0d9a294e6f3c4cf9318928050cf9765079cdf4fd..ed61e759dd5c97a82183cdda11bde67d6312669d 100644
--- a/src/components/projection.cpp
+++ b/src/components/projection.cpp
@@ -29,28 +29,31 @@ cv::Point2i Projection::revertRotatePixel(cv::Point2i pixel){
 
 
 // Adjust the projected frame with the topology from the camera to the beamer POV
-void Projection::adjustFrame(cv::Mat depth, cv::Mat src, cv::Mat &dst, Camera *camera, cv::Point3f beamer_pos){
+void Projection::adjustFrame(cv::Mat_<float> depth, cv::Mat_<cv::Vec3b> src, cv::Mat_<cv::Vec3b> &dst, Camera *camera, cv::Point3f beamer_pos){
 
     cv::Rect mask = camera->getCroppingMask();
-    cv::Size dst_size = dst.size();
 
     // resize the frames to be a multiple of the camera size :
     //      src.size = n * camera.depth.size , where n is uint > 0
-    cv::resize(dst, dst, getMatchingSize(dst, mask));
-    cv::resize(src, src, dst.size());
+    static cv::Mat_<cv::Vec3b> resized_dst = cv::Mat_<cv::Vec3b>(getMatchingSize(dst, mask));
+    cv::resize(dst, resized_dst, resized_dst.size());
+    cv::resize(src, src, resized_dst.size());
    
-    cv::Mat deprojectMap = cv::Mat_<cv::Point2i>(mask.height, mask.width, cv::Point2i(-1,-1));
-    cv::Mat frameMapMask = cv::Mat_<cv::Point2i>(mask.height, mask.width, cv::Point2i(-1,-1));
+    static cv::Mat_<cv::Point2i> deprojectMap = cv::Mat_<cv::Point2i>(mask.height, mask.width);
+    deprojectMap = cv::Point2i(-1,-1);
+
+    static cv::Mat_<cv::Point2i> frameMapMask = cv::Mat_<cv::Point2i>(mask.height, mask.width, cv::Point2i(-1,-1));
+    frameMapMask = cv::Point2i(-1,-1);
 
     deprojectPixelsFromDepth(depth, mask, camera, beamer_pos, deprojectMap);
 
     filterLowestDeprojectedPoints(depth, deprojectMap, frameMapMask);
 
-    buildFrame(depth, frameMapMask, src, dst);
+    buildFrame(depth, frameMapMask, src, resized_dst);
 
     // TODO : Holefilling method
 
-    cv::resize(dst, dst, dst_size);
+    cv::resize(resized_dst, dst, dst.size());
     cv::warpAffine(dst, dst, adjustingMatrix, dst.size());
 }
 
@@ -60,7 +63,7 @@ void Projection::adjustFrame(cv::Mat depth, cv::Mat src, cv::Mat &dst, Camera *c
  *   PRIVATE
  */
 
-void Projection::deprojectPixelsFromDepth(cv::Mat &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat &deprojectMap){
+void Projection::deprojectPixelsFromDepth(cv::Mat_<float> &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat_<cv::Point2i> &deprojectMap){
 
     // Browse the depth frame matching the cropping mask
     // while adapting pixels's position to the beamer's position
@@ -85,7 +88,7 @@ void Projection::deprojectPixelsFromDepth(cv::Mat &depth, cv::Rect mask, Camera
 }
 
 
-void Projection::filterLowestDeprojectedPoints(cv::Mat &depth, cv::Mat &deprojectMap, cv::Mat &frameMapMask){
+void Projection::filterLowestDeprojectedPoints(cv::Mat_<float> &depth, cv::Mat_<cv::Point2i> &deprojectMap, cv::Mat_<cv::Point2i> &frameMapMask){
 
     for (int j = 0; j < deprojectMap.rows; j++){
         for (int i = 0; i < deprojectMap.cols; i++){
@@ -112,7 +115,7 @@ void Projection::filterLowestDeprojectedPoints(cv::Mat &depth, cv::Mat &deprojec
 }
 
 
-void Projection::buildFrame(cv::Mat &depth, cv::Mat &frameMapMask, cv::Mat &src, cv::Mat &dst){
+void Projection::buildFrame(cv::Mat_<float> &depth, cv::Mat_<cv::Point2i> &frameMapMask, cv::Mat_<cv::Vec3b> &src, cv::Mat_<cv::Vec3b> &dst){
     
     for (int j = 0; j < frameMapMask.rows; j++){
         for (int i = 0; i < frameMapMask.cols; i++){
@@ -129,7 +132,7 @@ void Projection::buildFrame(cv::Mat &depth, cv::Mat &frameMapMask, cv::Mat &src,
 }
 
 
-cv::Size Projection::getMatchingSize(cv::Mat &src, cv::Rect base){
+cv::Size Projection::getMatchingSize(cv::Mat_<cv::Vec3b> &src, cv::Rect base){
     cv::Size bigSize;
     bigSize.width = (src.size().width % base.width == 0) ? src.size().width : src.size().width - (src.size().width % base.width) + base.width;
     bigSize.height = (src.size().height % base.height == 0) ? src.size().height : src.size().height - (src.size().height % base.height) + base.height;
@@ -138,7 +141,7 @@ cv::Size Projection::getMatchingSize(cv::Mat &src, cv::Rect base){
 
 
 // pixels coordinates are relative to the camera depth frame
-void Projection::copyPixelsInto(cv::Point2i pixel_dst, cv::Mat &dst, cv::Point2i pixel_src, cv::Mat &src, cv::Mat &depth){
+void Projection::copyPixelsInto(cv::Point2i pixel_dst, cv::Mat_<cv::Vec3b> &dst, cv::Point2i pixel_src, cv::Mat_<cv::Vec3b> &src, cv::Mat_<float> &depth){
 
     if( src.size().width == dst.size().width && src.size().height == dst.size().height ){
 
diff --git a/src/lib/sandbox.cpp b/src/lib/sandbox.cpp
index a39a2bb1e744c0ef790488d1bd43952fa842f851..477edfa481d8dda1508883507de22d3452fc58f9 100644
--- a/src/lib/sandbox.cpp
+++ b/src/lib/sandbox.cpp
@@ -30,20 +30,21 @@ void Sandbox::captureFrame(){
     camera->capture();
 }
 
-cv::Mat Sandbox::getColorFrame(){
+cv::Mat_<cv::Vec3b> Sandbox::getColorFrame(){
     return camera->getColorFrame()(camera->getCroppingMask());
 }
 
-cv::Mat Sandbox::getDepthFrame(){
+cv::Mat_<float> Sandbox::getDepthFrame(){
     return camera->getDepthFrame()(camera->getCroppingMask());
 }
 
 
-cv::Mat Sandbox::adjustProjection(cv::Mat frame){
+cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> frame){
     
     captureFrame();
-    cv::Mat depth = getDepthFrame();
-    cv::Mat imageCalibrate = cv::Mat(cv::Size(beamer->getWidth(), beamer->getHeight()), CV_8UC3, cv::Scalar(0, 0, 0));
+    cv::Mat_<float> depth = getDepthFrame();
+    static cv::Mat_<cv::Vec3b> imageCalibrate = cv::Mat_<cv::Vec3b>(cv::Size(beamer->getWidth(), beamer->getHeight()));
+    imageCalibrate =  cv::Vec3b(0, 0, 0);
     projection->adjustFrame(depth, frame, imageCalibrate, camera, beamer->getPosition());
 
     // frame after process