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

    你可能感兴趣的文章
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>