diff options
Diffstat (limited to 'cv/video-widget.cpp')
| -rw-r--r-- | cv/video-widget.cpp | 108 |
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); } |
