Qt+Opencv 显示多通道摄像头画面,双击放大画面,再双击缩小

文章目录

  • 前言
  • 效果
  • 核心代码
    • widget.h
    • widget.cpp
  • 资源下载
  • 遗留问题


前言

Qt+Opencv多线程同时显示多个USB摄像头于QLabel(如何实现请看这篇博客),双击放大当前所显示的画面区域,再双击还原缩小至初始大小。

主要思想:在Widget类中通过bool eventFilter(QObject *watched, QEvent *event);函数进行事件过滤鼠标双击事件,并进行相关操作。


效果

核心代码

在实现多线程显示USB摄像头信息的基础上,在Widget类中进行相关操作

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 
#include "camera.h"

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    bool eventFilter(QObject *watched, QEvent *event);
    void resizeEvent(QResizeEvent *event);

public slots:
	//用于显示USB摄像头图像
    void recivePicture(QImage img);
    void recivePicture_2(QImage img);
    void recivePicture_3(QImage img);

private:
    Ui::Widget *ui;
    //当前图像是否已经最大化的标志位
    bool max;
	//图像的宽高尺寸
    int tempWidth;
    int tempHeight;
    //三个摄像头线程
    QThread *firstThread;
    Camera *MyCamThread;
    QThread *secondThread;
    Camera *MyCamThread_2;
    QThread *thirdThread;
    Camera *MyCamThread_3;
    //更新摄像头图像的定时器
    QTimer fps_timer;
};
#endif // WIDGET_H

widget.cpp

通过bool Widget::eventFilter(QObject *watched, QEvent *event)过滤双击事件

bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(event->type()==QEvent::MouseButtonDblClick)
    {
        QLabel *widget = (QLabel *) watched;
        //如果标志位为0,即当前状态不是最大状态,则将当前双击的QLabel放大
        if(!max)
        {
            max = true;
            //设置QLabel尺寸
            tempWidth=800;
            tempHeight=600;
			//隐去ui->label_2
            ui->gridLayout->removeWidget(ui->label_2);
            ui->label_2->setVisible(false);
            ui->gridLayout->removeWidget(ui->label_3);
            ui->label_3->setVisible(false);
            ui->gridLayout->removeWidget(ui->label_4);
            ui->label_4->setVisible(false);
            ui->gridLayout->removeWidget(ui->label_5);
            ui->label_5->setVisible(false);
            ui->gridLayout->addWidget(widget,0,0,-1,-1);
            //当前双击的QLabel设置为可见
            widget->setVisible(true);
        }
        else
        {
            max = false;
            tempWidth=400;
            tempHeight=300;

            ui->gridLayout->addWidget(ui->label_2,0,0);
            ui->gridLayout->addWidget(ui->label_3,1,0);
            ui->gridLayout->addWidget(ui->label_4,0,1);
            ui->gridLayout->addWidget(ui->label_5,1,1);
            ui->label_2->setVisible(true);
            ui->label_3->setVisible(true);
            ui->label_4->setVisible(true);
            ui->label_5->setVisible(true);
        }
        return true;
    }
    //返回父类eventfilter
    return QWidget::eventFilter(watched, event);
}

recivePicture函数将单个子线程中发送出的图像信号,显示到相应的QLabel上

void Widget::recivePicture(QImage img)
{
    //设置相应QLabel的长宽
    ui->label_2->setFixedWidth(tempWidth);
    ui->label_2->setFixedHeight(tempHeight);
    QImage newImg = img.scaled(tempWidth, tempHeight);
    ui->label_2->setPixmap(QPixmap::fromImage(newImg));
}

资源下载

本案例下资源请到此处下载。win10操作系统,且需单个摄像头连接单个USB接口。

遗留问题

本案例下若同时显示两路摄像头信息,双击操作最大化后没有问题;但如果同时三路摄像头信息,双击操作最大化后画面有所卡顿,待解决。

你可能感兴趣的:(Qt,qt,opencv,ui)