Skip to content
Snippets Groups Projects
voltu_cv.cpp 1.72 KiB
Newer Older
/**
 * @file voltu_cv.cpp
 * @copyright Copyright (c) 2020 Nicolas Pope, MIT License
 * @author Nicolas Pope
 */

Nicolas Pope's avatar
Nicolas Pope committed
#include <voltu/opencv.hpp>
#include <voltu/types/errors.hpp>
Nicolas Pope's avatar
Nicolas Pope committed

#include <opencv2/imgproc.hpp>

void voltu::cv::convert(voltu::ImagePtr img, ::cv::Mat &mat)
{
	voltu::ImageData data = img->getHost();

	if (data.format == voltu::ImageFormat::kBGRA8)
	{
		mat = ::cv::Mat(data.height, data.width, CV_8UC4, data.data);
	}
	else if (data.format == voltu::ImageFormat::kFloat32)
	{
		mat = ::cv::Mat(data.height, data.width, CV_32FC1, data.data);
	}
	else if (data.format == voltu::ImageFormat::kFloat16_4)
	{
		mat = ::cv::Mat(data.height, data.width, CV_16FC4, data.data);
	}
Nicolas Pope's avatar
Nicolas Pope committed
	else
	{
		mat = ::cv::Mat();
	}
}

void voltu::cv::convert(voltu::ImagePtr img, ::cv::cuda::GpuMat &mat)
{
	throw voltu::exceptions::NotImplemented();
Nicolas Pope's avatar
Nicolas Pope committed
}

void voltu::cv::visualise(voltu::ImagePtr img, ::cv::Mat &mat)
{
	voltu::ImageData data = img->getHost();

	if (data.format == voltu::ImageFormat::kBGRA8)
	{
		voltu::cv::convert(img, mat);
	}
	else if (data.format == voltu::ImageFormat::kFloat32)
	{
		::cv::Mat tmp;
		voltu::cv::convert(img, tmp);

Nicolas Pope's avatar
Nicolas Pope committed
		float maxdepth = 8.0f;  // TODO: Get from intrinsics

		//::cv::normalize(tmp, tmp, 0, 255, ::cv::NORM_MINMAX);
		tmp.convertTo(tmp, CV_8U, 255.0f / maxdepth);
		::cv::Mat mask = tmp > 0;
		::cv::subtract(::cv::Scalar(255), tmp, tmp, mask);
Nicolas Pope's avatar
Nicolas Pope committed
		
		//#if OPENCV_VERSION >= 40102
		//cv::applyColorMap(tmp, mat, cv::COLORMAP_TURBO);
		//#else
		::cv::applyColorMap(tmp, mat, ::cv::COLORMAP_INFERNO);
		//#endif
	}
	else if (data.format == voltu::ImageFormat::kFloat16_4)
	{
		::cv::Mat tmp;
		voltu::cv::convert(img, tmp);
		tmp.convertTo(tmp, CV_32FC4);
		tmp += 1.0f;
		tmp *= 127.0f;
		tmp.convertTo(mat, CV_8UC4);
	}