博客
关于我
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/

    你可能感兴趣的文章
    Python3:setup.py:完成所有任务的PIP安装(Build_ext+Install)
    查看>>
    python4.0 gil_Python 并发编程系列--1、浅谈GIL历史及对多线程的影响
    查看>>
    python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
    查看>>
    Python: AES加密与解密
    查看>>
    Python: Range() 最大尺寸;动态的还是静态的?
    查看>>
    Python: Windows下用 multiprocessing 的深坑
    查看>>
    python:Could not find platform independent libraries <prefix>解决方法
    查看>>
    Python:datetime tzinfo 时区名称文档
    查看>>
    Python:deepcopy(list) vs new_list = old_list[:]
    查看>>
    Python:Google API - 从消息中获取 mimeTypes
    查看>>
    Python:Google API - 从消息中获取 mimeTypes
    查看>>
    Python:subprocess.call,stdout to file,stderr to file,在屏幕上实时显示stderr
    查看>>
    Python:TypeError:无法连接“str“和“int“对象
    查看>>
    Python:XPath 在 ElementTree 中不可用
    查看>>
    Python:从 FTP 服务器下载文件
    查看>>
    python:从列表中创建元组列表
    查看>>
    Python:从嵌套列表中删除重复项
    查看>>
    Python:从间隔映射到值
    查看>>
    Python:使用 shell=False 的子进程调用不起作用
    查看>>
    Python:修改 PATH 环境变量的平台无关方式
    查看>>