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

    你可能感兴趣的文章
    npm设置源地址,npm官方地址
    查看>>
    npm设置镜像如淘宝:http://npm.taobao.org/
    查看>>
    npm配置安装最新淘宝镜像,旧镜像会errror
    查看>>
    NPM酷库052:sax,按流解析XML
    查看>>
    npm错误 gyp错误 vs版本不对 msvs_version不兼容
    查看>>
    npm错误Error: Cannot find module ‘postcss-loader‘
    查看>>
    npm,yarn,cnpm 的区别
    查看>>
    NPOI
    查看>>
    NPOI之Excel——合并单元格、设置样式、输入公式
    查看>>
    NPOI初级教程
    查看>>
    NPOI利用多任务模式分批写入多个Excel
    查看>>
    NPOI在Excel中插入图片
    查看>>
    NPOI将某个程序段耗时插入Excel
    查看>>
    NPOI格式设置
    查看>>
    NPOI设置单元格格式
    查看>>
    Npp删除选中行的Macro录制方式
    查看>>
    NR,NF,FNR
    查看>>
    nrf24l01+arduino
    查看>>
    nrf开发笔记一开发软件
    查看>>
    nrm —— 快速切换 NPM 源 (附带测速功能)
    查看>>