diff --git a/components/rgbd-sources/src/sources/stereovideo/opencv.cpp b/components/rgbd-sources/src/sources/stereovideo/opencv.cpp index b3c2ba810beea992cf9b9e9c7866f49875183717..b7ff35953472bfb0c071a4ea9f672dd0d8aec155 100644 --- a/components/rgbd-sources/src/sources/stereovideo/opencv.cpp +++ b/components/rgbd-sources/src/sources/stereovideo/opencv.cpp @@ -46,7 +46,8 @@ using std::chrono::milliseconds; using std::this_thread::sleep_for; OpenCVDevice::OpenCVDevice(nlohmann::json &config, bool stereo) - : ftl::rgbd::detail::Device(config), timestamp_(0.0) { + : ftl::rgbd::detail::Device(config), timestamp_(0.0), + interpolation_(cv::INTER_CUBIC) { std::vector<ftl::rgbd::detail::DeviceDetails> devices_ = getDevices(); @@ -147,6 +148,12 @@ OpenCVDevice::OpenCVDevice(nlohmann::json &config, bool stereo) left_hm_ = cv::cuda::HostMem(dheight_, dwidth_, CV_8UC4); right_hm_ = cv::cuda::HostMem(dheight_, dwidth_, CV_8UC4); hres_hm_ = cv::cuda::HostMem(height_, width_, CV_8UC4); + + interpolation_ = value("inter_cubic", false) ? cv::INTER_CUBIC : cv::INTER_LINEAR; + on("inter_cubic", [this](){ + interpolation_ = value("inter_cubic_", false) ? + cv::INTER_CUBIC : cv::INTER_LINEAR; + }); } OpenCVDevice::~OpenCVDevice() { @@ -355,7 +362,7 @@ bool OpenCVDevice::get(ftl::rgbd::Frame &frame, cv::cuda::GpuMat &l_out, cv::cud if (hasHigherRes()) { // TODO: Use threads? - cv::resize(rfull, r, r.size(), 0.0, 0.0, cv::INTER_CUBIC); + cv::resize(rfull, r, r.size(), 0.0, 0.0, interpolation_); r_hres_out = rfull; } else { @@ -397,13 +404,13 @@ bool OpenCVDevice::get(ftl::rgbd::Frame &frame, cv::cuda::GpuMat &l_out, cv::cud // Need to resize //if (hasHigherRes()) { // TODO: Use threads? - // cv::resize(rfull, r, r.size(), 0.0, 0.0, cv::INTER_CUBIC); + // cv::resize(rfull, r, r.size(), 0.0, 0.0, interpolation_); //} } if (hasHigherRes()) { //FTL_Profile("Frame Resize", 0.01); - cv::resize(lfull, l, l.size(), 0.0, 0.0, cv::INTER_CUBIC); + cv::resize(lfull, l, l.size(), 0.0, 0.0, interpolation_); l_hres_out.upload(hres, stream); } else { l_hres_out = cv::cuda::GpuMat(); diff --git a/components/rgbd-sources/src/sources/stereovideo/opencv.hpp b/components/rgbd-sources/src/sources/stereovideo/opencv.hpp index e0f10ca1e5329cff94545d00a97e20e638ae1b78..acd263a97b54003877233085724adb22b5071c39 100644 --- a/components/rgbd-sources/src/sources/stereovideo/opencv.hpp +++ b/components/rgbd-sources/src/sources/stereovideo/opencv.hpp @@ -62,6 +62,7 @@ class OpenCVDevice : public ftl::rgbd::detail::Device { cv::Mat frame_l_; cv::Mat frame_r_; + int interpolation_; }; } diff --git a/components/rgbd-sources/src/sources/stereovideo/pylon.cpp b/components/rgbd-sources/src/sources/stereovideo/pylon.cpp index 1a8f90600111c008e795083ef48cabe1ba1216c4..9a6fc73b9bb1ef301d89fe5afb48b01349ca090b 100644 --- a/components/rgbd-sources/src/sources/stereovideo/pylon.cpp +++ b/components/rgbd-sources/src/sources/stereovideo/pylon.cpp @@ -24,7 +24,8 @@ using cv::Mat; using namespace Pylon; PylonDevice::PylonDevice(nlohmann::json &config) - : ftl::rgbd::detail::Device(config), ready_(false), lcam_(nullptr), rcam_(nullptr) { + : ftl::rgbd::detail::Device(config), ready_(false), lcam_(nullptr), rcam_(nullptr), + interpolation_(cv::INTER_CUBIC) { auto &inst = CTlFactory::GetInstance(); @@ -114,6 +115,12 @@ PylonDevice::PylonDevice(nlohmann::json &config) }); on("buffer_size", buffer_size_, 1); + + interpolation_ = value("inter_cubic", false) ? cv::INTER_CUBIC : cv::INTER_LINEAR; + on("inter_cubic", [this](){ + interpolation_ = value("inter_cubic", false) ? + cv::INTER_CUBIC : cv::INTER_LINEAR; + }); } PylonDevice::~PylonDevice() { @@ -298,7 +305,7 @@ bool PylonDevice::get(ftl::rgbd::Frame &frame, cv::cuda::GpuMat &l_out, cv::cuda c->rectify(rfull, Channel::Right); if (hasHigherRes()) { - cv::resize(rfull, r, r.size(), 0.0, 0.0, cv::INTER_CUBIC); + cv::resize(rfull, r, r.size(), 0.0, 0.0, interpolation_); h_r = rfull; } else { @@ -338,7 +345,7 @@ bool PylonDevice::get(ftl::rgbd::Frame &frame, cv::cuda::GpuMat &l_out, cv::cuda } if (hasHigherRes()) { - cv::resize(lfull, l, l.size(), 0.0, 0.0, cv::INTER_CUBIC); + cv::resize(lfull, l, l.size(), 0.0, 0.0, interpolation_); h_l.upload(hres, stream); } else { h_l = cv::cuda::GpuMat(); diff --git a/components/rgbd-sources/src/sources/stereovideo/pylon.hpp b/components/rgbd-sources/src/sources/stereovideo/pylon.hpp index 3f1982a36287ddcc9579e764a7a480bf1598a97c..691c54d52b5394a80fb5942cccff7cd422401853 100644 --- a/components/rgbd-sources/src/sources/stereovideo/pylon.hpp +++ b/components/rgbd-sources/src/sources/stereovideo/pylon.hpp @@ -57,6 +57,7 @@ class PylonDevice : public ftl::rgbd::detail::Device { cv::cuda::HostMem right_hm_; cv::cuda::HostMem hres_hm_; cv::Mat rtmp_; + int interpolation_; void _configureCamera(Pylon::CBaslerUniversalInstantCamera *cam); bool _retrieveFrames(Pylon::CGrabResultPtr &result, Pylon::CBaslerUniversalInstantCamera *cam);