Skip to content
Snippets Groups Projects
Commit f2124872 authored by simon.fanetti's avatar simon.fanetti
Browse files

enhance performance

parent 3df03d1a
No related branches found
No related tags found
No related merge requests found
...@@ -15,7 +15,8 @@ class Camera{ ...@@ -15,7 +15,8 @@ class Camera{
rs2::video_frame *color_frame; rs2::video_frame *color_frame;
rs2::depth_frame *depth_frame; rs2::depth_frame *depth_frame;
rs2_intrinsics intr_profile;
float depth_scale; float depth_scale;
cv::Rect croppingMask; cv::Rect croppingMask;
......
...@@ -10,12 +10,12 @@ class Projection{ ...@@ -10,12 +10,12 @@ class Projection{
cv::Mat adjustingMatrix; cv::Mat adjustingMatrix;
float distanceTopSandbox; float distanceTopSandbox;
void deprojectPixelsFromDepth(cv::Mat &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat &pixelsDeprojectMap); void deprojectPixelsFromDepth(cv::Mat_<float> &depth, cv::Rect mask, Camera *camera, cv::Point3f beamer_pos, cv::Mat_<cv::Point2i> &deprojectMap);
void filterLowestDeprojectedPoints(cv::Mat &depth, cv::Mat &deprojectMap, cv::Mat &frameMapMask); void filterLowestDeprojectedPoints(cv::Mat_<float> &depth, cv::Mat_<cv::Point2i> &deprojectMap, cv::Mat_<cv::Point2i> &frameMapMask);
void buildFrame(cv::Mat &depth, cv::Mat &pixelsDeprojectHighestMap, cv::Mat &src, cv::Mat &dst); 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); 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); 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 &src, cv::Rect base); cv::Size getMatchingSize(cv::Mat_<cv::Vec3b> &src, cv::Rect base);
public: public:
Projection(); Projection();
...@@ -27,7 +27,7 @@ class Projection{ ...@@ -27,7 +27,7 @@ class Projection{
cv::Point2i rotatePixel(cv::Point2i pixel); cv::Point2i rotatePixel(cv::Point2i pixel);
cv::Point2i revertRotatePixel(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(); void printAdjustingMatrix();
}; };
......
...@@ -24,9 +24,9 @@ class Sandbox{ ...@@ -24,9 +24,9 @@ class Sandbox{
int init(); int init();
void captureFrame(); void captureFrame();
cv::Mat getColorFrame(); cv::Mat_<cv::Vec3b> getColorFrame();
cv::Mat getDepthFrame(); cv::Mat_<float> getDepthFrame();
cv::Mat adjustProjection(cv::Mat frame); cv::Mat_<cv::Vec3b> adjustProjection(cv::Mat_<cv::Vec3b> frame);
int loadConfig(); int loadConfig();
int loadConfigFrom(char *path); int loadConfigFrom(char *path);
......
...@@ -63,6 +63,11 @@ int Camera::start(){ ...@@ -63,6 +63,11 @@ int Camera::start(){
warmUpDepthLens(); 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; return 0;
} }
...@@ -96,8 +101,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){ ...@@ -96,8 +101,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){
float point[3] = {point3D.x, point3D.y, point3D.z}; float point[3] = {point3D.x, point3D.y, point3D.z};
float pixel[2]; float pixel[2];
rs2_intrinsics intr = depth_frame->get_profile().as<rs2::video_stream_profile>().get_intrinsics(); rs2_project_point_to_pixel(pixel, &intr_profile, point);
rs2_project_point_to_pixel(pixel, &intr, point);
return cv::Point2i(pixel[0], pixel[1]); return cv::Point2i(pixel[0], pixel[1]);
} }
...@@ -105,8 +109,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){ ...@@ -105,8 +109,7 @@ cv::Point2i Camera::projectPointToPixel(cv::Point3f point3D){
cv::Point3f Camera::deprojectPixelToPoint(float coord[], float z){ cv::Point3f Camera::deprojectPixelToPoint(float coord[], float z){
float p[3]; float p[3];
rs2_intrinsics intr = depth_frame->get_profile().as<rs2::video_stream_profile>().get_intrinsics(); rs2_deproject_pixel_to_point(p, &intr_profile, coord, z);
rs2_deproject_pixel_to_point(p, &intr, coord, z);
return cv::Point3f(p[0], p[1], p[2]); return cv::Point3f(p[0], p[1], p[2]);
} }
......
...@@ -29,28 +29,31 @@ cv::Point2i Projection::revertRotatePixel(cv::Point2i pixel){ ...@@ -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 // 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::Rect mask = camera->getCroppingMask();
cv::Size dst_size = dst.size();
// resize the frames to be a multiple of the camera size : // resize the frames to be a multiple of the camera size :
// src.size = n * camera.depth.size , where n is uint > 0 // src.size = n * camera.depth.size , where n is uint > 0
cv::resize(dst, dst, getMatchingSize(dst, mask)); static cv::Mat_<cv::Vec3b> resized_dst = cv::Mat_<cv::Vec3b>(getMatchingSize(dst, mask));
cv::resize(src, src, dst.size()); 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)); static cv::Mat_<cv::Point2i> deprojectMap = cv::Mat_<cv::Point2i>(mask.height, mask.width);
cv::Mat frameMapMask = cv::Mat_<cv::Point2i>(mask.height, mask.width, cv::Point2i(-1,-1)); 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); deprojectPixelsFromDepth(depth, mask, camera, beamer_pos, deprojectMap);
filterLowestDeprojectedPoints(depth, deprojectMap, frameMapMask); filterLowestDeprojectedPoints(depth, deprojectMap, frameMapMask);
buildFrame(depth, frameMapMask, src, dst); buildFrame(depth, frameMapMask, src, resized_dst);
// TODO : Holefilling method // TODO : Holefilling method
cv::resize(dst, dst, dst_size); cv::resize(resized_dst, dst, dst.size());
cv::warpAffine(dst, dst, adjustingMatrix, 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 ...@@ -60,7 +63,7 @@ void Projection::adjustFrame(cv::Mat depth, cv::Mat src, cv::Mat &dst, Camera *c
* PRIVATE * 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 // Browse the depth frame matching the cropping mask
// while adapting pixels's position to the beamer's position // while adapting pixels's position to the beamer's position
...@@ -85,7 +88,7 @@ void Projection::deprojectPixelsFromDepth(cv::Mat &depth, cv::Rect mask, Camera ...@@ -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 j = 0; j < deprojectMap.rows; j++){
for (int i = 0; i < deprojectMap.cols; i++){ for (int i = 0; i < deprojectMap.cols; i++){
...@@ -112,7 +115,7 @@ void Projection::filterLowestDeprojectedPoints(cv::Mat &depth, cv::Mat &deprojec ...@@ -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 j = 0; j < frameMapMask.rows; j++){
for (int i = 0; i < frameMapMask.cols; i++){ for (int i = 0; i < frameMapMask.cols; i++){
...@@ -129,7 +132,7 @@ void Projection::buildFrame(cv::Mat &depth, cv::Mat &frameMapMask, cv::Mat &src, ...@@ -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; 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.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; 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){ ...@@ -138,7 +141,7 @@ cv::Size Projection::getMatchingSize(cv::Mat &src, cv::Rect base){
// pixels coordinates are relative to the camera depth frame // 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 ){ if( src.size().width == dst.size().width && src.size().height == dst.size().height ){
......
...@@ -30,20 +30,21 @@ void Sandbox::captureFrame(){ ...@@ -30,20 +30,21 @@ void Sandbox::captureFrame(){
camera->capture(); camera->capture();
} }
cv::Mat Sandbox::getColorFrame(){ cv::Mat_<cv::Vec3b> Sandbox::getColorFrame(){
return camera->getColorFrame()(camera->getCroppingMask()); return camera->getColorFrame()(camera->getCroppingMask());
} }
cv::Mat Sandbox::getDepthFrame(){ cv::Mat_<float> Sandbox::getDepthFrame(){
return camera->getDepthFrame()(camera->getCroppingMask()); return camera->getDepthFrame()(camera->getCroppingMask());
} }
cv::Mat Sandbox::adjustProjection(cv::Mat frame){ cv::Mat_<cv::Vec3b> Sandbox::adjustProjection(cv::Mat_<cv::Vec3b> frame){
captureFrame(); captureFrame();
cv::Mat depth = getDepthFrame(); cv::Mat_<float> depth = getDepthFrame();
cv::Mat imageCalibrate = cv::Mat(cv::Size(beamer->getWidth(), beamer->getHeight()), CV_8UC3, cv::Scalar(0, 0, 0)); 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()); projection->adjustFrame(depth, frame, imageCalibrate, camera, beamer->getPosition());
// frame after process // frame after process
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment