博客
关于我
Qt--在显示视频的Label上画矩形
阅读量:285 次
发布时间:2019-03-01

本文共 4163 字,大约阅读时间需要 13 分钟。

自定义QLabel控件实现图像缩放与矩形绘制

实现方法

本文将详细介绍一个自定义QLabel控件的实现方法,该控件能够支持图像缩放操作以及绘制矩形。实现的核心思路是重写Label类的鼠标事件和绘图事件,从而实现对图像的缩放和矩形绘制功能。


项目代码解析

mylabel.h

#ifndef MYLABEL_H#define MYLABEL_H#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
class MyLabel : public QLabel {public: explicit MyLabel(QWidget* parent = 0); ~MyLabel();protected: void paintEvent(QPaintEvent* event); void mousePressEvent(QMouseEvent* e); void mouseMoveEvent(QMouseEvent* e); void mouseReleaseEvent(QMouseEvent* e);private: QPoint m_rectStartPoint; QPoint m_rectEndPoint;};#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"MyLabel::MyLabel(QWidget* parent) : QLabel(parent) {}void MyLabel::mousePressEvent(QMouseEvent* e) {    m_rectStartPoint = e->pos();}void MyLabel::mouseMoveEvent(QMouseEvent* e) {    m_rectEndPoint = e->pos();}void MyLabel::mouseReleaseEvent(QMouseEvent* e) {}void MyLabel::paintEvent(QPaintEvent* event) {    QLabel::paintEvent(event);    QPainter painter(this);    painter.setPen(QPen(Qt::green, 2));    if (m_rectStartPoint != m_rectEndPoint) {        painter.drawRect(QRect(m_rectStartPoint, m_rectEndPoint));    }}

main.cpp

#include "mywidget.h"#include 
int main(int argc, char* argv[]) { QApplication a(argc, argv); MyWidget w; w.show(); return a.exec();}

mywidget.h

#ifndef MYWIDGET_H#define MYWIDGET_H#include 
#include
#include "mylabel.h"#include
#include
#include
#include
using namespace cv;namespace Ui { class MyWidget;}class MyWidget : public QWidget { Q_OBJECTpublic: explicit MyWidget(QWidget* parent = 0); ~MyWidget(); QImage mat2QImage(cv::Mat cvImg); QImage ScaleImage2Label(QImage qImage, QLabel* qLabel);private: Ui::MyWidget* ui; QTimer* timer; Mat frame; VideoCapture cap; MyLabel* label;};#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"#include "ui_mywidget.h"MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {    ui->setupUi(this);    label = new MyLabel;    label->setStyleSheet("border:2px solid;border-color:blue");    ui->horizontalLayout->addWidget(label);    timer = new QTimer(this);    timer->start(10);    cap.open(1);}void MyWidget::readFrame() {    cap >> frame;    if (frame.empty()) {        qDebug() << "frame is empty";        cap.release();    }    QImage img = ScaleImage2Label(mat2QImage(frame), label);    label->setAlignment(Qt::AlignCenter);    label->setPixmap(QPixmap::fromImage(img));}QImage MyWidget::ScaleImage2Label(QImage qImage, QLabel* qLabel) {    QImage qScaledImage;    QSize qImageSize = qImage.size();    QSize qLabelSize = qLabel->size();    double dWidthRatio = 1.0 * qImageSize.width() / qLabelSize.width();    double dHeightRatio = 1.0 * qImageSize.height() / qLabelSize.height();    if (dWidthRatio > dHeightRatio) {        qScaledImage = qImage.scaledToWidth(qLabelSize.width());    } else {        qScaledImage = qImage.scaledToHeight(qLabelSize.height());    }    return qScaledImage;}QImage MyWidget::mat2QImage(cv::Mat cvImg) {    QImage qImg;    if (cvImg.channels() == 3) {        cv::cvtColor(cvImg, cvImg, CV_BGR2RGB);        qImg = QImage((const unsigned char*)(cvImg.data),                      cvImg.cols, cvImg.rows,                      cvImg.cols * cvImg.channels(),                      QImage::Format_RGB888);    } else if (cvImg.channels() == 1) {        qImg = QImage((const unsigned char*)(cvImg.data),                      cvImg.cols, cvImg.rows,                      cvImg.cols * cvImg.channels(),                      QImage::Format_Indexed8);    } else {        qImg = QImage((const unsigned char*)(cvImg.data),                      cvImg.cols, cvImg.rows,                      cvImg.cols * cvImg.channels(),                      QImage::Format_RGB888);    }    return qImg;}MyWidget::~MyWidget() {    delete ui;}

功能说明

本项目实现了一个基于Qt的自定义Label控件,该控件主要支持以下功能:

  • 矩形绘制:通过鼠标点击和拖动,可以绘制并显示矩形区域
  • 图像缩放:支持将OpenCV读取的图像缩放并显示到控件中
  • 鼠标交互:支持鼠标按下、移动和释放等操作
  • 通过上述实现,可以方便地在应用程序中快速实现图像缩放和矩形绘制功能,适用于需要图像处理和交互的场景。

    转载地址:http://msco.baihongyu.com/

    你可能感兴趣的文章
    Netty WebSocket客户端
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>
    Netty工作笔记0013---Channel应用案例4Copy图片
    查看>>
    Netty工作笔记0014---Buffer类型化和只读
    查看>>
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>