summaryrefslogtreecommitdiffhomepage
path: root/cv/video-widget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cv/video-widget.cpp')
-rw-r--r--cv/video-widget.cpp108
1 files changed, 47 insertions, 61 deletions
diff --git a/cv/video-widget.cpp b/cv/video-widget.cpp
index acaf06a6..7accd275 100644
--- a/cv/video-widget.cpp
+++ b/cv/video-widget.cpp
@@ -1,78 +1,64 @@
-/* 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 "video-widget.hpp"
+#include "compat/macros.h"
#include <opencv2/imgproc.hpp>
-cv_video_widget::cv_video_widget(QWidget* parent) :
- QWidget(parent), freshp(false)
-{
- connect(&timer, SIGNAL(timeout()), this, SLOT(update_and_repaint()));
- timer.start(65);
-}
-
void cv_video_widget::update_image(const cv::Mat& frame)
{
- QMutexLocker l(&mtx);
-
- if (!freshp)
- {
- const int w = preview_size.width(), h = preview_size.height();
-
- if (w < 1 || h < 1)
- return;
-
- if (_frame.cols != frame.cols || _frame.rows != frame.rows)
- _frame = cv::Mat(frame.rows, frame.cols, CV_8UC3);
- frame.copyTo(_frame);
- freshp = true;
-
- if (_frame2.cols != _frame.cols || _frame2.rows != _frame.rows)
- _frame2 = cv::Mat(_frame.rows, _frame.cols, CV_8UC3);
-
- if (_frame3.cols != w || _frame3.rows != h)
- _frame3 = cv::Mat(h, w, CV_8UC3);
-
- cv::cvtColor(_frame, _frame2, cv::COLOR_RGB2BGR);
-
- const cv::Mat* img_;
+ if (fresh())
+ return;
- if (_frame.cols != w || _frame.rows != h)
- {
- cv::resize(_frame2, _frame3, cv::Size(w, h), 0, 0, cv::INTER_NEAREST);
+ auto [ W, H ] = preview_size();
- img_ = &_frame3;
- }
- else
- img_ = &_frame2;
+ if (W < 1 || H < 1 || frame.rows < 1 || frame.cols < 1)
+ return;
- const cv::Mat& img = *img_;
+ cv::Mat const* __restrict scaled = nullptr;
+ frame3.create(H, W, frame.type());
+ frame2.create(H, W, CV_8UC4);
- texture = QImage((const unsigned char*) img.data, w, h, QImage::Format_RGB888);
+ if (frame.cols != W || frame.rows != H)
+ {
+ cv::resize(frame, frame3, { W, H }, 0, 0, cv::INTER_NEAREST);
+ scaled = &frame3;
}
-}
+ else if (!frame.isContinuous())
+ {
+ frame.copyTo(frame3);
+ scaled = &frame3;
+ }
+ else
+ scaled = &frame;
-void cv_video_widget::paintEvent(QPaintEvent*)
-{
- QMutexLocker foo(&mtx);
- QPainter painter(this);
- painter.drawImage(rect(), texture);
-}
+ int color_cvt = cv::COLOR_COLORCVT_MAX;
-void cv_video_widget::update_and_repaint()
-{
- QMutexLocker l(&mtx);
+ switch (scaled->channels())
+ {
+ case 1:
+ color_cvt = cv::COLOR_GRAY2BGRA;
+ break;
+ case 3:
+ color_cvt = cv::COLOR_BGR2BGRA;
+ break;
+ case 4:
+ break;
+ default:
+ unreachable();
+ break;
+ }
- preview_size = size();
+ cv::Mat const* color;
- if (freshp)
+ if (color_cvt != cv::COLOR_COLORCVT_MAX)
{
- freshp = false;
- update();
+ cv::cvtColor(*scaled, frame2, color_cvt);
+ color = &frame2;
}
+ else
+ color = scaled;
+
+ int width = color->cols, height = color->rows;
+ unsigned stride = color->step.p[0];
+ set_image(color->data, width, height, stride, QImage::Format_ARGB32);
+
+ set_fresh(true);
}