diff --git a/applications/reconstruct/src/main.cpp b/applications/reconstruct/src/main.cpp index 4ca06248a336a51bf6ca2aacc25aced4ec970e34..68c1cb03b8b8560db257546b22db8770befc4dd0 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 31fc04413f12bcfb4a0194b05516ccd63adb5cf9..b631b00ae7b4a676ea05e9b2d5c41acfddfe687b 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 0000000000000000000000000000000000000000..4f611903a63a5e06258d95d5ace671f0861e4416 --- /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 d11ba08e48dae5a6b15af34a4ebd6535fc4201ab..f302aaa2f1af1e628ef4179a93e087d30d009845 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 0000000000000000000000000000000000000000..8427ac6f72018b2a34805e27c2de1e4c0dcd252a --- /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 d7d2a8a3fcccc903c70f2cb39adfa169ee20acd7..7eff77d96241429f06102dd76456d9c595b99407 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);