QT实现图片的操作(缩放、平移、绘图、对比度及亮度调节)

        因为项目需求,在处理视频流的同时需要对单帧的图片实现一些简单的处理,尝试写了一个这样的demo。

        本程序实现的主要功能如下:

(1)实现了对加载图片的缩放与平移

(2)在加载的图片上进行一些简单的标记绘图(矩形和圆圈工具),并实现撤回功能

(3)利用OpenCV对图片进行对比度和亮度的调节

主要思路:通过集成QLabel类,并重写以下函数实现:

void contextMenuEvent(QContextMenuEvent *event) override;   //右键菜单
void paintEvent(QPaintEvent *event) override;               //QPaint画图
void wheelEvent(QWheelEvent *event) override;               //鼠标滚轮滚动
void mousePressEvent(QMouseEvent *event) override;          //鼠标摁下
void mouseMoveEvent(QMouseEvent *event) override;           //鼠标松开
void mouseReleaseEvent(QMouseEvent *event) override;        //鼠标发射事件

界面展示:

 

 

 

 

我主要是通过重写QLabel来实现的,下面附上我们的几个主要功能代码:(完整代码见最后)

        (1)加载图片

LocalFileName = QFileDialog::getOpenFileName(this, "Open Image", "./", "Images (*.png *.xpm *.jpg)");
QFile file(LocalFileName);
if (!file.exists())
    return;
Image.load(LocalFileName);

        (2)实现图片的缩放,平移

/*
int XPtInterval = 0;             //平移X轴的值
int YPtInterval = 0;             //平移Y轴的值
*/
// 平移
painter.translate(this->width() / 2 + XPtInterval, this->height() / 2 + YPtInterval);
// 缩放
painter.scale(ZoomValue, ZoomValue);//垂直水平两个方向

        (3)实现绘图(通过重写QLabel类的paintEvent) 

/*
_rects和_ellipses是储存矩形和圆形的两个容器
*/
QPainter painter(this);
//绘制矩形
painter.drawRect(_rects.at(i1++));
//绘制圆形
painter.drawEllipse(_ellipses.at(i2++));

        (4)对比度和亮度调节

/*
image_Mat是待处理的图像
-1代表输出维度与原维度相同
contrast代表对比度
brightness代表亮度
*/
image_Mat.convertTo(image_Mat, -1,contrast,brightness);

下面附上源代码:

vediolabel.h

#ifndef VIDEOLABEL_H
#define VIDEOLABEL_H
#include <QLabel>
#include <QFileDialog>
#include <QMenu>
#include <QPainter>
#include <QWheelEvent>
#include <QDebug>
#include <QTime>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

using namespace cv;

#pragma execution_character_set("utf-8")

const int RECTTYPE = 1;
const int ELLIPSETYPE = 2;

class videoLabel : public QLabel
{
public:
    videoLabel(QWidget *parent = nullptr);

public:
    void setLocalFilename(QString name);
    void setPaintingType(int num);
    void setBrightness(float num);
    void setContrast(float num);
    void changePaintingState();
    void ChangeBriAndConChangedState();
    bool _rectsIsEmpty();
    bool _ellipsesIsEmpty();
    QImage Mat2QImage(const Mat& mat);       //Mat2QImage格式转换
    Mat QImageToMat(QImage image);           //QImage2Mat格式转换
    QImage ImageAdjustment(QImage image);    //改变图片的亮度和对比度




protected:
    void contextMenuEvent(QContextMenuEvent *event) override;   //右键菜单
    void paintEvent(QPaintEvent *event) override;                        //QPaint画图
    void wheelEvent(QWheelEvent *event) override;               //鼠标滚轮滚动
    void mousePressEvent(QMouseEvent *event) override;          //鼠标摁下
    void mouseMoveEvent(QMouseEvent *event) override;           //鼠标松开
    void mouseReleaseEvent(QMouseEvent *event) override;        //鼠标发射事件

public slots:
    void OnSelectImage();       //选择打开图片
    void OnZoomInImage();       //图片放大
    void OnZoomOutImage();      //图片缩小
    void OnPresetImage();       //图片还原
    void OnPaintingback();       //画图回撤

private:
    QImage Image;                    //显示的图片
    Mat image_Mat;                   //改变的图片
    qreal ZoomValue = 1.0;           //鼠标缩放值
    int XPtInterval = 0;             //平移X轴的值
    int YPtInterval = 0;      
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值