diff --git a/inc/projection.h b/inc/projection.h index a5ce9eb953310ca4d01e8cd9319ff49f64da1537..5390b06abbcbfa78dcb4329b3dd7de5425e11a2e 100644 --- a/inc/projection.h +++ b/inc/projection.h @@ -7,7 +7,7 @@ class Projection{ private: - cv::Mat adjustingMatrix; + cv::Mat_<float> adjustingMatrix; float distanceTopSandbox; cv::Mat_<float> resized_depth; @@ -28,14 +28,14 @@ class Projection{ public: Projection(); - void setAdjustingMatrix(cv::Mat matrix){ adjustingMatrix = matrix; } + void setAdjustingMatrix(cv::Mat_<float> matrix){ adjustingMatrix = matrix; } cv::Mat getAdjustingMatrix(){ return adjustingMatrix; } void setDistanceTopSandbox(float dist){ distanceTopSandbox = dist; }; float getDistanceTopSandbox(){ return distanceTopSandbox; }; cv::Point2i rotatePixel(cv::Point2i pixel); cv::Point2i revertRotatePixel(cv::Point2i pixel); - void adjustFrame(cv::Mat_<float> depth, cv::Mat_<cv::Vec3b> src, cv::Mat_<cv::Vec3b> &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 02828dbd5304e80478c9db5215c0ae625c75f01f..bb45cae46c256a29dc8419ae40d2200f345de457 100644 --- a/inc/sandbox.h +++ b/inc/sandbox.h @@ -13,6 +13,7 @@ class Sandbox{ Projection *projection; Camera *camera; Beamer *beamer; + cv::Mat_<cv::Vec3b> projectedFrame; public: Sandbox(); @@ -26,8 +27,8 @@ class Sandbox{ void captureFrame(); cv::Mat_<cv::Vec3b> getColorFrame(); cv::Mat_<float> getDepthFrame(); - cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> frame); - cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> frame, cv::Mat_<float> depth); + cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> &frame); + cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> &frame, cv::Mat_<float> &depth); int loadConfig(); int loadConfigFrom(char *path); diff --git a/src/components/projection.cpp b/src/components/projection.cpp index 90206c065ac9edc116a5fb01134df6477fe02363..483e696aec11eb6ebfcd23830ac17ee79c88e945 100644 --- a/src/components/projection.cpp +++ b/src/components/projection.cpp @@ -1,5 +1,5 @@ #include "../../inc/projection.h" - +#include <chrono> /* * MAIN @@ -30,15 +30,16 @@ 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_<float> depth, cv::Mat_<cv::Vec3b> src, cv::Mat_<cv::Vec3b> &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){ - if(deprojectMap.empty() || deprojectMap.size() != depth.size()){ + if(deprojectMap.empty() || deprojectMap.size() != dst.size()){ if(!deprojectMap.empty()){ deprojectMap.release(); frameMap.release(); resized_depth.release(); resized_src.release(); } + std::cout << "Create" << std::endl; deprojectMap.create(dst.rows, dst.cols); frameMap.create(dst.rows, dst.cols); resized_depth.create(dst.rows, dst.cols); @@ -57,9 +58,25 @@ void Projection::adjustFrame(cv::Mat_<float> depth, cv::Mat_<cv::Vec3b> src, cv: cv::resize(src, resized_src, dst.size()); cv::resize(depth, resized_depth, dst.size()); + // 75 ms + //std::chrono::milliseconds start_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); deprojectPixelsFromDepth(resized_depth, camera, camera->getCroppingMask() , beamer_pos, deprojectMap, fxy, ppxy); + //std::chrono::milliseconds now_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); + //std::cout << "Deproject : " << (now_ms - start_ms).count() << std::endl; + + // 18-19 ms + //start_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); filterLowestDeprojectedPoints(resized_depth, deprojectMap, frameMap); + //now_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); + //std::cout << "Filter : " << (now_ms - start_ms).count() << std::endl; + + // 14-15 ms + //start_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); buildFrame(resized_depth, frameMap, resized_src, dst); + //now_ms = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch() ); + //std::cout << "Build : " << (now_ms - start_ms).count() << std::endl; + + cv::warpAffine(dst, dst, adjustingMatrix, dst.size()); } diff --git a/src/lib/sandbox.cpp b/src/lib/sandbox.cpp index f5747f0a20b99ede034b607ec5ae2d97fa79eba1..aa5fd148d0690edaac54439e84c472045ace9d22 100644 --- a/src/lib/sandbox.cpp +++ b/src/lib/sandbox.cpp @@ -38,20 +38,23 @@ cv::Mat_<float> Sandbox::getDepthFrame(){ return camera->getDepthFrame()(camera->getCroppingMask()); } -cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> frame, cv::Mat_<float> depth){ +cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> &frame, cv::Mat_<float> &depth){ - 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()); + if(projectedFrame.empty()){ + projectedFrame.create(beamer->getHeight(), beamer->getWidth()); + } + + projectedFrame = cv::Vec3b(0, 0, 0); + projection->adjustFrame(depth, frame, projectedFrame, camera, beamer->getPosition()); // frame after process - //cv::dilate(imageCalibrate, imageCalibrate, cv::Mat(), cv::Point(-1, -1), 2, 1, 1); - //cv::erode(imageCalibrate, imageCalibrate, cv::Mat(), cv::Point(-1, -1), 2, 1, 1); + //cv::dilate(projectedFrame, projectedFrame, cv::Mat(), cv::Point(-1, -1), 2, 1, 1); + //cv::erode(projectedFrame, projectedFrame, cv::Mat(), cv::Point(-1, -1), 2, 1, 1); - return imageCalibrate; + return projectedFrame; } -cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> frame){ +cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> &frame){ captureFrame(); cv::Mat_<float> depth = getDepthFrame();