From 6f3f5d99bdbd81e888b288f0790d28e19e03ed46 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Sat, 2 Nov 2019 12:04:25 +0200 Subject: [PATCH] Add colour channels filter --- applications/reconstruct/src/main.cpp | 53 +++---------------- components/filters/CMakeLists.txt | 1 + .../filters/include/ftl/filters/colours.hpp | 23 ++++++++ .../filters/include/ftl/filters/filter.hpp | 1 + components/filters/src/colours.cpp | 24 +++++++++ components/filters/src/smoothing.cu | 1 + 6 files changed, 58 insertions(+), 45 deletions(-) create mode 100644 components/filters/include/ftl/filters/colours.hpp create mode 100644 components/filters/src/colours.cpp diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp index 4ca06248a..68c1cb03b 100644 --- a/applications/reconstruct/src/main.cpp +++ b/applications/reconstruct/src/main.cpp @@ -31,6 +31,7 @@ #include <ftl/net/universe.hpp> #include <ftl/filters/smoothing.hpp> +#include <ftl/filters/colours.hpp> #include <ftl/cuda/normals.hpp> #include <ftl/registration.hpp> @@ -248,6 +249,7 @@ static void run(ftl::Configurable *root) { // Create the source depth map filters auto *filters = ftl::config::create<ftl::Filters>(root, "filters"); + filters->create<ftl::filters::ColourChannels>("colour"); filters->create<ftl::filters::DepthSmoother>("hfnoise"); filters->create<ftl::filters::MLSSmoother>("mls"); @@ -275,51 +277,12 @@ static void run(ftl::Configurable *root) { UNIQUE_LOCK(scene_A.mtx, lk); - cv::cuda::GpuMat tmp; - /*float factor = filter->value("smooth_factor", 0.4f); - float colour_limit = filter->value("colour_limit", 30.0f); - bool do_smooth = filter->value("pre_smooth", false); - int iters = filter->value("iterations", 3); - int radius = filter->value("radius", 5); - float var_thesh = filter->value("variance_threshold", 0.02f);*/ - - //if (do_smooth) { - // Presmooth... - for (int i=0; i<scene_A.frames.size(); ++i) { - auto &f = scene_A.frames[i]; - auto s = scene_A.sources[i]; - - // Convert colour from BGR to BGRA if needed - if (f.get<cv::cuda::GpuMat>(Channel::Colour).type() == CV_8UC3) { - //cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream); - // Convert to 4 channel colour - auto &col = f.get<cv::cuda::GpuMat>(Channel::Colour); - tmp.create(col.size(), CV_8UC4); - cv::cuda::swap(col, tmp); - cv::cuda::cvtColor(tmp,col, cv::COLOR_BGR2BGRA, 0); - } - - filters->filter(f, s, 0); - - /*ftl::cuda::smoothing_factor( - f.createTexture<float>(Channel::Depth), - f.createTexture<float>(Channel::Depth2, ftl::rgbd::Format<float>(f.get<cv::cuda::GpuMat>(Channel::Depth).size())), - f.createTexture<float>(Channel::Energy, ftl::rgbd::Format<float>(f.get<cv::cuda::GpuMat>(Channel::Depth).size())), - //f.createTexture<uchar4>(Channel::Colour), - f.createTexture<float>(Channel::Smoothing, ftl::rgbd::Format<float>(f.get<cv::cuda::GpuMat>(Channel::Depth).size())), - var_thesh, - s->parameters(), 0 - );*/ - - /*ftl::cuda::depth_smooth( - f.createTexture<float>(Channel::Depth), - f.createTexture<uchar4>(Channel::Colour), - f.createTexture<float>(Channel::Depth2, ftl::rgbd::Format<float>(f.get<cv::cuda::GpuMat>(Channel::Depth).size())), - s->parameters(), - radius, factor, colour_limit, iters, 0 - );*/ - } - //} + // Apply pre-filters to all frames + for (int i=0; i<scene_A.frames.size(); ++i) { + auto &f = scene_A.frames[i]; + auto s = scene_A.sources[i]; + filters->filter(f, s, 0); + } // Send all frames to GPU, block until done? //scene_A.upload(Channel::Colour + Channel::Depth); // TODO: (Nick) Add scene stream. diff --git a/components/filters/CMakeLists.txt b/components/filters/CMakeLists.txt index 31fc04413..b631b00ae 100644 --- a/components/filters/CMakeLists.txt +++ b/components/filters/CMakeLists.txt @@ -2,6 +2,7 @@ add_library(ftlfilter src/smoothing.cpp src/smoothing.cu src/filter.cpp + src/colours.cpp ) # These cause errors in CI build and are being removed from PCL in newer versions diff --git a/components/filters/include/ftl/filters/colours.hpp b/components/filters/include/ftl/filters/colours.hpp new file mode 100644 index 000000000..4f611903a --- /dev/null +++ b/components/filters/include/ftl/filters/colours.hpp @@ -0,0 +1,23 @@ +#ifndef _FTL_FILTERS_COLOURS_HPP_ +#define _FTL_FILTERS_COLOURS_HPP_ + +#include <ftl/filters/filter.hpp> + +namespace ftl { +namespace filters { + +class ColourChannels : public ftl::Filter { + public: + explicit ColourChannels(nlohmann::json &config); + ~ColourChannels(); + + void filter(ftl::rgbd::Frame &frame, ftl::rgbd::Source *src, cudaStream_t stream) override; + + private: + cv::cuda::GpuMat temp_; +}; + +} +} + +#endif // _FTL_FILTERS_COLOURS_HPP_ diff --git a/components/filters/include/ftl/filters/filter.hpp b/components/filters/include/ftl/filters/filter.hpp index d11ba08e4..f302aaa2f 100644 --- a/components/filters/include/ftl/filters/filter.hpp +++ b/components/filters/include/ftl/filters/filter.hpp @@ -1,4 +1,5 @@ #ifndef _FTL_FILTERS_FILTER_HPP_ +#define _FTL_FILTERS_FILTER_HPP_ #include <list> #include <ftl/configurable.hpp> diff --git a/components/filters/src/colours.cpp b/components/filters/src/colours.cpp new file mode 100644 index 000000000..8427ac6f7 --- /dev/null +++ b/components/filters/src/colours.cpp @@ -0,0 +1,24 @@ +#include <ftl/filters/colours.hpp> + +using ftl::filters::ColourChannels; +using ftl::codecs::Channel; + +ColourChannels::ColourChannels(nlohmann::json &config) : ftl::Filter(config) { + +} + +ColourChannels::~ColourChannels() { + +} + +void ColourChannels::filter(ftl::rgbd::Frame &f, ftl::rgbd::Source *s, cudaStream_t stream) { + // Convert colour from BGR to BGRA if needed + if (f.get<cv::cuda::GpuMat>(Channel::Colour).type() == CV_8UC3) { + //cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream); + // Convert to 4 channel colour + auto &col = f.get<cv::cuda::GpuMat>(Channel::Colour); + temp_.create(col.size(), CV_8UC4); + cv::cuda::swap(col, temp_); + cv::cuda::cvtColor(temp_,col, cv::COLOR_BGR2BGRA, 0); + } +} diff --git a/components/filters/src/smoothing.cu b/components/filters/src/smoothing.cu index d7d2a8a3f..7eff77d96 100644 --- a/components/filters/src/smoothing.cu +++ b/components/filters/src/smoothing.cu @@ -29,6 +29,7 @@ using ftl::cuda::TextureObject; float contrib = 0.0f; float d0 = depth_in.tex2D(x, y); + depth_out(x,y) = d0; if (d0 < camera.minDepth || d0 > camera.maxDepth) return; float3 X = camera.screenToCam((int)(x),(int)(y),d0); -- GitLab