因为项目需求,在处理视频流的同时需要对单帧的图片实现一些简单的处理,尝试写了一个这样的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;