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