Skip to content
Snippets Groups Projects
colours.cpp 2.01 KiB
Newer Older
#include <ftl/operators/colours.hpp>

using ftl::operators::ColourChannels;
using ftl::codecs::Channel;

ColourChannels::ColourChannels(ftl::Configurable *cfg) : ftl::operators::Operator(cfg) {

}

ColourChannels::~ColourChannels() {

}

bool ColourChannels::apply(ftl::rgbd::Frame &in, ftl::rgbd::Frame &out, ftl::rgbd::Source *s, cudaStream_t stream) {
	auto cvstream = cv::cuda::StreamAccessor::wrapStream(stream);

Nicolas Pope's avatar
Nicolas Pope committed
	auto &col = in.get<cv::cuda::GpuMat>(Channel::Colour);

	// Convert colour from BGR to BGRA if needed
Nicolas Pope's avatar
Nicolas Pope committed
	if (col.type() == CV_8UC3) {
		//cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream);
		// Convert to 4 channel colour
		temp_.create(col.size(), CV_8UC4);
		cv::cuda::swap(col, temp_);
		cv::cuda::cvtColor(temp_,col, cv::COLOR_BGR2BGRA, 0, cvstream);
	if (in.hasChannel(Channel::Right)) {
		auto &col = in.get<cv::cuda::GpuMat>(Channel::Right);

		// Convert colour from BGR to BGRA if needed
		if (col.type() == CV_8UC3) {
			//cv::cuda::Stream cvstream = cv::cuda::StreamAccessor::wrapStream(stream);
			// Convert to 4 channel colour
			temp_.create(col.size(), CV_8UC4);
			cv::cuda::swap(col, temp_);
			cv::cuda::cvtColor(temp_,col, cv::COLOR_BGR2BGRA, 0, cvstream);
		}
	}

	//in.resetTexture(Channel::Colour);
	in.createTexture<uchar4>(Channel::Colour, true);

	if (in.hasChannel(Channel::Depth)) {
		auto &depth = in.get<cv::cuda::GpuMat>(Channel::Depth);
		if (depth.size() != col.size()) {
			auto &col2 = in.create<cv::cuda::GpuMat>(Channel::ColourHighRes);
			cv::cuda::resize(col, col2, depth.size(), 0.0, 0.0, cv::INTER_LINEAR, cvstream);
			in.createTexture<uchar4>(Channel::ColourHighRes, true);
			in.swapChannels(Channel::Colour, Channel::ColourHighRes);
		}

		// Ensure right channel is also downsized
		if (in.hasChannel(Channel::Right)) {
			auto &right = in.get<cv::cuda::GpuMat>(Channel::Right);
			if (depth.size() != right.size()) {
				cv::cuda::resize(right, rbuf_, depth.size(), 0.0, 0.0, cv::INTER_LINEAR, cvstream);
				cv::cuda::swap(right, rbuf_);
			}
		}