From 377202f037aeff97481252bdc7856cfacf939b66 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 18 Dec 2015 20:41:49 +0100 Subject: tracker/pt: optimize widget --- tracker-pt/pt_video_widget.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'tracker-pt/pt_video_widget.cpp') diff --git a/tracker-pt/pt_video_widget.cpp b/tracker-pt/pt_video_widget.cpp index cbb7c268..860d0a77 100644 --- a/tracker-pt/pt_video_widget.cpp +++ b/tracker-pt/pt_video_widget.cpp @@ -23,33 +23,29 @@ void PTVideoWidget::update_image(const cv::Mat& frame) void PTVideoWidget::update_and_repaint() { - QImage qframe; { QMutexLocker foo(&mtx); if (_frame.empty() || !freshp) return; - qframe = QImage(_frame.cols, _frame.rows, QImage::Format_RGB888); + texture = QImage(_frame.cols, _frame.rows, QImage::Format_RGB888); freshp = false; - uchar* data = qframe.bits(); - const int pitch = qframe.bytesPerLine(); - unsigned char *input = (unsigned char*) _frame.data; + uchar* data = texture.bits(); const int chans = _frame.channels(); + const int pitch = texture.bytesPerLine(); for (int y = 0; y < _frame.rows; y++) { - const int step = y * _frame.step; - const int pitch_ = y * pitch; + unsigned char* dest = data + pitch * y; + const unsigned char* ln = _frame.ptr(y); for (int x = 0; x < _frame.cols; x++) { - data[pitch_ + x * 3 + 0] = input[step + x * chans + 2]; - data[pitch_ + x * 3 + 1] = input[step + x * chans + 1]; - data[pitch_ + x * 3 + 2] = input[step + x * chans + 0]; + const int idx = x * chans; + const int x_ = x * 3; + dest[x_ + 0] = ln[idx + 2]; + dest[x_ + 1] = ln[idx + 1]; + dest[x_ + 2] = ln[idx + 0]; } } } - qframe = qframe.scaled(size(), Qt::IgnoreAspectRatio, Qt::FastTransformation); - { - QMutexLocker foo(&mtx); - texture = qframe; - } + texture = texture.scaled(size(), Qt::IgnoreAspectRatio, Qt::FastTransformation); update(); } -- cgit v1.2.3 From 487ee12372d054ec8d6cfaf534ca8c6639d0b96f Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Fri, 18 Dec 2015 21:28:30 +0100 Subject: tracker/pt: avoid widget malloc when able --- tracker-pt/pt_video_widget.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'tracker-pt/pt_video_widget.cpp') diff --git a/tracker-pt/pt_video_widget.cpp b/tracker-pt/pt_video_widget.cpp index 860d0a77..8c18e678 100644 --- a/tracker-pt/pt_video_widget.cpp +++ b/tracker-pt/pt_video_widget.cpp @@ -16,7 +16,13 @@ void PTVideoWidget::update_image(const cv::Mat& frame) if (!freshp) { - _frame = frame.clone(); + if (_frame.cols != frame.cols || + _frame.rows != frame.rows || + _frame.channels() != frame.channels()) + { + _frame = cv::Mat(); + } + frame.copyTo(_frame); freshp = true; } } -- cgit v1.2.3 From f6c32359f0697b3c8caea669d4a766b684b06a9b Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 19 Dec 2015 21:57:01 +0100 Subject: tracker/pt: avoid widget temp QImage allocation --- tracker-pt/pt_video_widget.cpp | 44 +++++++++++++++--------------------------- tracker-pt/pt_video_widget.h | 2 +- 2 files changed, 17 insertions(+), 29 deletions(-) (limited to 'tracker-pt/pt_video_widget.cpp') diff --git a/tracker-pt/pt_video_widget.cpp b/tracker-pt/pt_video_widget.cpp index 8c18e678..095c325f 100644 --- a/tracker-pt/pt_video_widget.cpp +++ b/tracker-pt/pt_video_widget.cpp @@ -9,6 +9,7 @@ */ #include "pt_video_widget.h" +#include void PTVideoWidget::update_image(const cv::Mat& frame) { @@ -16,11 +17,10 @@ void PTVideoWidget::update_image(const cv::Mat& frame) if (!freshp) { - if (_frame.cols != frame.cols || - _frame.rows != frame.rows || - _frame.channels() != frame.channels()) + if (_frame.cols != frame.cols || _frame.rows != frame.rows) { - _frame = cv::Mat(); + _frame = cv::Mat(frame.rows, frame.cols, CV_8U); + _frame2 = cv::Mat(frame.rows, frame.cols, CV_8U); } frame.copyTo(_frame); freshp = true; @@ -29,29 +29,17 @@ void PTVideoWidget::update_image(const cv::Mat& frame) void PTVideoWidget::update_and_repaint() { - { - QMutexLocker foo(&mtx); - if (_frame.empty() || !freshp) - return; - texture = QImage(_frame.cols, _frame.rows, QImage::Format_RGB888); - freshp = false; - uchar* data = texture.bits(); - const int chans = _frame.channels(); - const int pitch = texture.bytesPerLine(); - for (int y = 0; y < _frame.rows; y++) - { - unsigned char* dest = data + pitch * y; - const unsigned char* ln = _frame.ptr(y); - for (int x = 0; x < _frame.cols; x++) - { - const int idx = x * chans; - const int x_ = x * 3; - dest[x_ + 0] = ln[idx + 2]; - dest[x_ + 1] = ln[idx + 1]; - dest[x_ + 2] = ln[idx + 0]; - } - } - } - texture = texture.scaled(size(), Qt::IgnoreAspectRatio, Qt::FastTransformation); + 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*) _frame2.data, _frame2.cols, _frame2.rows, QImage::Format_RGB888); + freshp = false; update(); } diff --git a/tracker-pt/pt_video_widget.h b/tracker-pt/pt_video_widget.h index 1235c0d5..073b2e93 100644 --- a/tracker-pt/pt_video_widget.h +++ b/tracker-pt/pt_video_widget.h @@ -42,6 +42,6 @@ private: QMutex mtx; QImage texture; QTimer timer; - cv::Mat _frame; + cv::Mat _frame, _frame2, _frame3; bool freshp; }; -- cgit v1.2.3 From 778b82aee0b6f41bb4bafdaf6d079221306d942c Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 20 Dec 2015 17:43:58 +0100 Subject: tracker/pt: don't resize twice in widget Fix typo. --- tracker-pt/pt_video_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tracker-pt/pt_video_widget.cpp') diff --git a/tracker-pt/pt_video_widget.cpp b/tracker-pt/pt_video_widget.cpp index 095c325f..608f754a 100644 --- a/tracker-pt/pt_video_widget.cpp +++ b/tracker-pt/pt_video_widget.cpp @@ -39,7 +39,7 @@ void PTVideoWidget::update_and_repaint() cv::resize(_frame2, _frame3, cv::Size(width(), height()), 0, 0, cv::INTER_NEAREST); - texture = QImage((const unsigned char*) _frame2.data, _frame2.cols, _frame2.rows, QImage::Format_RGB888); freshp = false; update(); + texture = QImage((const unsigned char*) _frame3.data, _frame3.cols, _frame3.rows, QImage::Format_RGB888); } -- cgit v1.2.3 From c88d7897eec259ea7c649467e01590a08faa2dcb Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 20 Dec 2015 17:44:21 +0100 Subject: tracker/pt: only show widget if the frame is visible --- tracker-pt/pt_video_widget.cpp | 27 +++++++++++++++------------ tracker-pt/pt_video_widget.h | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) (limited to 'tracker-pt/pt_video_widget.cpp') diff --git a/tracker-pt/pt_video_widget.cpp b/tracker-pt/pt_video_widget.cpp index 608f754a..99f86eb2 100644 --- a/tracker-pt/pt_video_widget.cpp +++ b/tracker-pt/pt_video_widget.cpp @@ -29,17 +29,20 @@ void PTVideoWidget::update_image(const cv::Mat& frame) void PTVideoWidget::update_and_repaint() { - 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); - - freshp = false; - update(); + if (static_cast(parent())->isEnabled()) + { + 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(); + } } diff --git a/tracker-pt/pt_video_widget.h b/tracker-pt/pt_video_widget.h index 073b2e93..d9144ac0 100644 --- a/tracker-pt/pt_video_widget.h +++ b/tracker-pt/pt_video_widget.h @@ -17,6 +17,7 @@ #include #include #include +#include class PTVideoWidget : public QWidget { -- cgit v1.2.3