Skip to content
Snippets Groups Projects
Commit 2858cf62 authored by Sebastian Hahta's avatar Sebastian Hahta
Browse files

Place all channels to same Frame class.

Simplifies StereoVideoSource::swap() method.
parent bfdcc2b7
No related branches found
No related tags found
2 merge requests!105CUDA optical flow smoothing,!103feature/frame class
Pipeline #13240 passed
......@@ -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
}
......
......@@ -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 &);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment