diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-07-16 23:44:31 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-07-16 23:54:27 +0200 |
commit | 754ae1a54132eb41332267fc70a42595017c5a6e (patch) | |
tree | 78e3dc7284d396f22d69230661176218f73f18f7 /tracker-aruco/pt_video_widget.cpp | |
parent | 16bb3e13dd2a7ed8fa3652e313d592dd81c73a07 (diff) |
gui, tracker/{aruco,pt}, api: detect whether widget is visible on screen
Sadly, it's only implemented right now on win32.
Remove "set enabled" code for the video widget since it only works for
explicit window minimization, not covering by other windows.
Diffstat (limited to 'tracker-aruco/pt_video_widget.cpp')
-rw-r--r-- | tracker-aruco/pt_video_widget.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/tracker-aruco/pt_video_widget.cpp b/tracker-aruco/pt_video_widget.cpp new file mode 100644 index 00000000..38d7a5e8 --- /dev/null +++ b/tracker-aruco/pt_video_widget.cpp @@ -0,0 +1,63 @@ +/* Copyright (c) 2012 Patrick Ruoff + * Copyright (c) 2014-2016 Stanislaw Halik <sthalik@misaki.pl> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + */ + +#include "pt_video_widget.h" +#include <opencv2/imgproc.hpp> + +#include "opentrack/is-window-visible.hpp" + +PTVideoWidget::PTVideoWidget(QWidget* parent) : + QWidget(parent), + freshp(false) +{ + connect(&timer, SIGNAL(timeout()), this, SLOT(update_and_repaint())); + timer.start(50); +} + +void PTVideoWidget::update_image(const cv::Mat& frame) +{ + QMutexLocker foo(&mtx); + + if (!freshp) + { + if (_frame.cols != frame.cols || _frame.rows != frame.rows) + { + _frame = cv::Mat(frame.rows, frame.cols, CV_8U); + _frame2 = cv::Mat(frame.rows, frame.cols, CV_8U); + } + frame.copyTo(_frame); + freshp = true; + } +} + +void PTVideoWidget::paintEvent(QPaintEvent* e) +{ + QMutexLocker foo(&mtx); + QPainter painter(this); + painter.drawImage(e->rect(), texture); +} + +void PTVideoWidget::update_and_repaint() +{ + if (is_window_visible(this)) + { + QMutexLocker foo(&mtx); + if (_frame.empty() || !freshp) + return; + cv::cvtColor(_frame, _frame2, cv::COLOR_RGB2BGR); + + if (_frame3.cols != width() || _frame3.rows != height()) + _frame3 = cv::Mat(height(), width(), CV_8U); + + cv::resize(_frame2, _frame3, cv::Size(width(), height()), 0, 0, cv::INTER_NEAREST); + + texture = QImage((const unsigned char*) _frame3.data, _frame3.cols, _frame3.rows, QImage::Format_RGB888); + freshp = false; + update(); + } +} |