From 2858cf622a721dd0e806553a45215d0d5109a9f3 Mon Sep 17 00:00:00 2001 From: Sebastian Hahta <joseha@utu.fi> Date: Thu, 29 Aug 2019 14:44:25 +0300 Subject: [PATCH] Place all channels to same Frame class. Simplifies StereoVideoSource::swap() method. --- components/rgbd-sources/src/stereovideo.cpp | 51 +++++++++------------ components/rgbd-sources/src/stereovideo.hpp | 36 ++++++++++++--- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/components/rgbd-sources/src/stereovideo.cpp b/components/rgbd-sources/src/stereovideo.cpp index 57e57fbbd..6e9d4fe09 100644 --- a/components/rgbd-sources/src/stereovideo.cpp +++ b/components/rgbd-sources/src/stereovideo.cpp @@ -31,7 +31,10 @@ StereoVideoSource::~StereoVideoSource() { delete lsrc_; } -void StereoVideoSource::init(const string &file) { +void StereoVideoSource::init(const string &file) +{ + frames_ = std::vector<Frame>(2); + capabilities_ = kCapVideo | kCapStereo; if (ftl::is_video(file)) { @@ -160,49 +163,39 @@ bool StereoVideoSource::capture(int64_t ts) { } bool StereoVideoSource::retrieve() { - lsrc_->get(cap_left_, cap_right_, calib_, stream2_); + auto frame = frames_[0]; + frame.reset(); + lsrc_->get(frame.left, frame.right, calib_, stream2_); stream2_.waitForCompletion(); return true; } void StereoVideoSource::swap() { - cv::cuda::GpuMat tmp; - tmp = left_; - left_ = cap_left_; - cap_left_ = tmp; - tmp = right_; - right_ = cap_right_; - cap_right_ = tmp; + auto tmp = frames_[0]; + frames_[0] = frames_[1]; + frames_[1] = tmp; } -bool StereoVideoSource::compute(int n, int b) { +bool StereoVideoSource::compute(int n, int b) { + auto &frame = frames_[1]; const ftl::rgbd::channel_t chan = host_->getChannel(); - - if (left_.empty() || right_.empty()) return false; + if (frame.left.empty() || frame.right.empty()) return false; if (chan == ftl::rgbd::kChanDepth) { - //lsrc_->get(left_, right_, stream_); - if (depth_tmp_.empty()) depth_tmp_ = cv::cuda::GpuMat(left_.size(), CV_32FC1); - if (disp_tmp_.empty()) disp_tmp_ = cv::cuda::GpuMat(left_.size(), CV_32FC1); - //calib_->rectifyStereo(left_, right_, stream_); - disp_->compute(left_, right_, disp_tmp_, stream_); - ftl::cuda::disparity_to_depth(disp_tmp_, depth_tmp_, params_, stream_); - left_.download(rgb_, stream_); - //rgb_ = lsrc_->cachedLeft(); - depth_tmp_.download(depth_, stream_); + if (frame.depth.empty()) frame.depth = cv::cuda::GpuMat(frame.left.size(), CV_32FC1); + if (frame.disp.empty()) frame.disp = cv::cuda::GpuMat(frame.left.size(), CV_32FC1); + disp_->compute(frame.left, frame.right, frame.disp, stream_); + ftl::cuda::disparity_to_depth(frame.disp, frame.depth, params_, stream_); + frame.left.download(rgb_, stream_); + frame.depth.download(depth_, stream_); stream_.waitForCompletion(); // TODO:(Nick) Move to getFrames } else if (chan == ftl::rgbd::kChanRight) { - //lsrc_->get(left_, right_, stream_); - //calib_->rectifyStereo(left_, right_, stream_); - left_.download(rgb_, stream_); - right_.download(depth_, stream_); + frame.left.download(rgb_, stream_); + frame.right.download(depth_, stream_); stream_.waitForCompletion(); // TODO:(Nick) Move to getFrames } else { - //lsrc_->get(left_, right_, stream_); - //calib_->rectifyStereo(left_, right_, stream_); - //rgb_ = lsrc_->cachedLeft(); - left_.download(rgb_, stream_); + frame.left.download(rgb_, stream_); stream_.waitForCompletion(); // TODO:(Nick) Move to getFrames } diff --git a/components/rgbd-sources/src/stereovideo.hpp b/components/rgbd-sources/src/stereovideo.hpp index 88b71a068..bd470a743 100644 --- a/components/rgbd-sources/src/stereovideo.hpp +++ b/components/rgbd-sources/src/stereovideo.hpp @@ -45,13 +45,35 @@ class StereoVideoSource : public detail::Source { cv::cuda::Stream stream_; cv::cuda::Stream stream2_; - cv::cuda::GpuMat left_; - cv::cuda::GpuMat right_; - cv::cuda::GpuMat cap_left_; - cv::cuda::GpuMat cap_right_; - cv::cuda::GpuMat disp_tmp_; - cv::cuda::GpuMat depth_tmp_; - + // possibly should be made available for other users as well + // (should be called StereoVideoFrame) + class Frame { + public: + bool left_gray_ready; + bool right_gray_ready; + bool optflow_ready; + + cv::cuda::GpuMat left; + cv::cuda::GpuMat right; + cv::cuda::GpuMat left_gray; + cv::cuda::GpuMat right_gray; + cv::cuda::GpuMat disp; + cv::cuda::GpuMat depth; + cv::cuda::GpuMat optflow; + cv::cuda::GpuMat optflow_; // original lower res optical flow + + Frame() { reset(); } + + void reset() + { + left_gray_ready = false; + right_gray_ready = false; + optflow_ready = false; + } + }; + + std::vector<Frame> frames_; + cv::Mat mask_l_; void init(const std::string &); -- GitLab