diff --git a/app.cpp b/app.cpp index 092da011eb46392da070bc4e7cf24fcdb4ca7580..7c7ff9358b1132a090ba6115e4000a413ac25ea3 100644 --- a/app.cpp +++ b/app.cpp @@ -1,35 +1,20 @@ -#include "../ar_sandbox_lib/inc/sandbox.h" -#include <numeric> -#include <fstream> -#include <string> -#include <opencv2/opencv.hpp> +#include "app.h" -using namespace std; -using namespace cv; -#define ESCAPE_CHAR 27 - - - -Mat coloredFrame(Mat frameDepth); -void showLevel(); -void showDiff(); - - - -Sandbox client; -void (*apps[2])() = {showLevel, showDiff}; +Sandbox sandbox; +void (*apps[1])() = {showLevel}; int main(int argc, char *argv[]) { - - if(client.loadConfig()){ + if(sandbox.loadConfig()){ std::cout << "Failed to load the configuration" << std::endl; return 1; } - //showLevel(); + sandbox.init(); + + apps[0](); /*cout << "Press: \n 0: Show level \n 1: Show difference \n"; int n = 0; @@ -38,32 +23,102 @@ int main(int argc, char *argv[]) apps[n]();*/ } +/* +* App n.1 +* Show levels in color +*/ void showLevel(){ - Mat frameData; - Mat colored; + float top = sandbox.getProjection()->getDistanceTopSandbox(); + float sandboxHeight = 0.1f; + char windowName[] = "Sandbox"; + cv::namedWindow(windowName, CV_WINDOW_NORMAL); + cv::setWindowProperty(windowName, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); - //Mat proj_frame; - //char windowName[] = "Sandbox"; - //cv::namedWindow(windowName, CV_WINDOW_AUTOSIZE); + do{ + cv::Mat depth = sandbox.getDepthFrame(); + cv::Mat colored = colorizeDepth(depth, top, sandboxHeight); + cv::Mat res; + cv::cvtColor(colored, res, CV_BGR2RGB); - client.initWindowsFullScreen(); + res = sandbox.adjustProjection(res); + cv::imshow(windowName, res); - do{ - client.getDepthFrame().copyTo(frameData); - colored = coloredFrame(frameData); + } while (cv::waitKey(10) != ESCAPE_CHAR); + + cv::destroyAllWindows(); +} - //colored.copyTo(proj_frame); - //Mat* res = client.adjustProjection(&proj_frame); - //cv::imshow(windowName, *res); +/* +* Colorize depth frame +*/ +cv::Mat colorizeDepth(cv::Mat depth, float sandboxTop, float sandboxHeight){ + + // matrix with depth from 0 to n, where 0 is the lowest point + cv::Mat normalizedDepth = (depth - sandboxTop) * -1.0f + sandboxHeight; + normalizedDepth.setTo(0.0f, normalizedDepth < 0.0f); + normalizedDepth.setTo(sandboxHeight, normalizedDepth > sandboxHeight); + cv::Mat res = cv::Mat(depth.rows, depth.cols, CV_8UC3); + + + + for(int j=0; j<depth.rows; j++){ + for(int i=0; i<depth.cols; i++){ + //std::cout << "Color" << std::endl; + cv::Scalar color = floatToColor(normalizedDepth.at<float>(j,i), 0.0f, sandboxHeight); + res.at<cv::Vec3b>(j,i)[0] = color[0]; + res.at<cv::Vec3b>(j,i)[1] = color[1]; + res.at<cv::Vec3b>(j,i)[2] = color[2]; + } + } + + return res; +} - client.showImage(&colored); - } while (waitKey(10) != ESCAPE_CHAR); +/* +* Return the color matching the value in the gradient color between min and max +* Where : +* red = highest point +* blue = lowest point +*/ +cv::Scalar floatToColor(float value, float min, float max){ + + const uint CHANNEL_MAX = 255; + + // map for the color gradient (rgb channels) + uint initColors[4][3] = { { 0, 0, CHANNEL_MAX }, + { 0, CHANNEL_MAX, CHANNEL_MAX }, + { 0, CHANNEL_MAX, 0 }, + { CHANNEL_MAX, CHANNEL_MAX, 0 } }; + + int coeffColors[4][3] = { { 0, 1, 0 }, + { 0, 0, -1 }, + { 1, 0, 0 }, + { 0, -1, 0 } }; - cv::destroyAllWindows(); + + float clamped = value; + clamped = (clamped < min) ? min : clamped; + clamped = (clamped > max) ? max : clamped; + + // values goes from 0 to relativeMax + float relative = clamped - min; + float relativeMax = max - min; + + uint colorMax = 4*CHANNEL_MAX; + uint color = static_cast<uint>(relative * colorMax / relativeMax); + int index = static_cast<uint>(color / CHANNEL_MAX); + + // red at the highest point, blue at the lowest + uint8_t r = static_cast<uint8_t>( initColors[index][0] + coeffColors[index][0] * (color % CHANNEL_MAX) ); + uint8_t g = static_cast<uint8_t>( initColors[index][1] + coeffColors[index][1] * (color % CHANNEL_MAX) ); + uint8_t b = static_cast<uint8_t>( initColors[index][2] + coeffColors[index][2] * (color % CHANNEL_MAX) ); + + return cv::Scalar(r,g,b); } +/* Mat coloredFrame(Mat frameDepth){ Mat depthFrameColored(frameDepth.size(), CV_8U); @@ -101,11 +156,12 @@ Mat coloredFrame(Mat frameDepth){ cv::applyColorMap(depthFrameColored, depthFrameColored, cv::COLORMAP_JET); depthFrameColored.setTo(cv::Scalar(0, 0, 0), (frameDepth == 0)); return depthFrameColored; + } void showDiff(){ -/* + Mat frameData; client.getDepthFrame(&frameData); Mat frameData; @@ -129,5 +185,6 @@ void showDiff(){ keyCode = waitKey(10); } while (keyCode!= ESCAPE_CHAR); destroyAllWindows(); - */ + } +*/ \ No newline at end of file diff --git a/app.h b/app.h new file mode 100644 index 0000000000000000000000000000000000000000..0e1b397df92474303c9022102bf391592d462ae6 --- /dev/null +++ b/app.h @@ -0,0 +1,18 @@ +#ifndef MY_APPS_H +#define MY_APPS_H + +#include "../ar_sandbox_lib/inc/sandbox.h" +#include <opencv2/opencv.hpp> + +#define ESCAPE_CHAR 27 + + +void showLevel(); +//void showDiff(); + +cv::Scalar floatToColor(float value, float min, float max); +cv::Mat colorizeDepth(cv::Mat depth, float sandboxTop, float sandboxHeight); +//Mat coloredFrame(Mat frameDepth); + + +#endif diff --git a/beamer_config.sh b/beamer_config.sh index 8955109279bf1650c333a23ac5d631e3a4791e2c..b47b842a5a7d44abd5e913303ec4aa7c907ca15f 100755 --- a/beamer_config.sh +++ b/beamer_config.sh @@ -3,5 +3,6 @@ SCN_RES=1920x1080 BEAMER=HDMI-1 BM_RES=1400x1050 + xrandr --output $SCREEN --rate 60 --mode $SCN_RES --fb $SCN_RES --panning $SCN_RES* \ --output $BEAMER --mode $BM_RES --same-as $SCREEN > /dev/null diff --git a/sandbox_conf.yaml b/sandbox_conf.yaml index 7dd1043be56a137175d13c641a7e15521da5de08..b7668c6ad260eb5afae40c8cbed7ada77f309f59 100644 --- a/sandbox_conf.yaml +++ b/sandbox_conf.yaml @@ -1,13 +1,26 @@ AdjustingMatrix: width: 3 height: 2 - matrix: [1, 0, 0, -0, 1, 0] + matrix: [0.9998824, -0.0153356194, 3.71817994, 0.0153356194, 0.9998824, -4.87917471] +DistanceTopSandbox: + distance: 1.10 CroppingMask: - x: 160 - y: 120 - width: 320 - height: 245 + x: 176 + y: 121 + width: 326 + height: 250 +BeamerResolution: + width: 1400 + height: 1050 BeamerPosition: - x: 0 - y: 0 - z: 0 + x: -0.0121798348 + y: -0.146660045 + z: 0.0548454896 +FrameProcessProfil: + contrast: 2.2999999999999936 + brightness: -75 + minDistance: 60 + cannyEdgeThreshold: 137 + houghAccThreshold: 30 + minRadius: 4 + maxRadius: 9