- OpenCV Mat 存储格式:BGR
- imread
QString imgPath = "xxxx";
Mat imgData = imread(imgPath.toStdString());
- zeros 初始化0阵列 (相当于 清零 申请的内存)
Mat imgSrc = imgData;
Mat imgDst = Mat::zeros(imgSrc.size(), imgSrc.type());
imread: opencv 读取图片,
toStdString:将QString 转为std::string
- cvtColot(IntputArray src, IntputArray dst, int code ,int dstCn = 0)
src 可以是Mat,支持1/3/4通道;输入源图像
dst 输出是Mat , 输出图像
code : 转换编码 格式 COLOR_源格式2目标格式
Mat imgdata;cvtColor(imgData, imgdata, COLOR_BGR2RGB);
- QImage
QImage img = QImage(
(const unsigned char *)imgdata.data, // Mat 像素数据首地址
imgdata.cols, imgdata.rows, // 图片宽度(列数) 图片高度(行数)
static_cast<int>(imgdata.step), // 行步长
QImage::Format_RGB888 //生成的 QImage 格式
).copy();
- void Mat::convertTo( OutputArray dst, int rtype, double alpha=1, double beta=0 ) const;
调节图片的亮度(beta)和对比度(alpha), 通过下面公式转换图片像素
dst(x,y) = saturate_cast<uchar>( alpha * src(x,y) + beta)
imgSrc.converTo(imgDst, -1, con, bri);
OpenCVEnhance.cpp
cpp
#include "opencvenhance.h"
#include "ui_opencvenhance.h"
#include <QDir>
#include <QDebug>
OpencvEnhance::OpencvEnhance(QWidget *parent) :
QWidget(parent),
ui(new Ui::OpencvEnhance)
{
ui->setupUi(this);
setFixedSize(800,480);
init();
}
OpencvEnhance::~OpencvEnhance()
{
delete ui;
}
void OpencvEnhance::init()
{
ui->viewLabel->resize(667,463);
lableSize = ui->viewLabel->geometry().size();
qDebug() << "当前工作目录:" << QDir::currentPath();
QString imgPath = R"(D:/new_share/016_opencv/opencv_demo/img1.jpg)";
Mat tempImg = imread(imgPath.toStdString());
if(tempImg.empty())
{
qDebug() << "图片读取失败,请检查路径!";
return;
}
// OpenCV默认BGR,转为RGB给Qt显示
cvtColor(tempImg, imgdata, COLOR_BGR2RGB);
// 深拷贝 .copy(),防止Mat内存变化导致QImage野指针崩溃
myQimg = QImage((const unsigned char *)imgdata.data,
imgdata.cols,
imgdata.rows,
static_cast<int>(imgdata.step),
QImage::Format_RGB888).copy();
imgShow();
}
void OpencvEnhance::imgShow()
{
ui->viewLabel->setPixmap(QPixmap::fromImage(myQimg.scaled(lableSize,Qt::KeepAspectRatio)));
}
void OpencvEnhance::imgProc(double con, double bri)
{
lightness = ui->brightnessVerticalSlider->value();
contrast = ui->contrastVerticalSlider->value();
Mat imgSrc = imgdata;
Mat imgDst = Mat::zeros(imgSrc.size(), imgSrc.type());
// 对比度亮度处理,-1保持图像深度不变
imgSrc.convertTo(imgDst, -1, con, bri);
// imgdata = imgDst;
// ✔ 这里必须 Format_RGB888!之前写BGR888是颜色颠倒的根源
// 追加 .copy() 深拷贝!!
myQimg = QImage(
imgDst.data,
imgDst.cols,
imgDst.rows,
static_cast<int>(imgDst.step), // 关键:Mat的真实行字节步长
QImage::Format_RGB888
).copy();
imgShow();
}
void OpencvEnhance::on_contrastVerticalSlider_valueChanged(int value)
{
contrast = value;
// value /33.3 映射:比如slider范围0~100 → 0 ~3左右对比度
imgProc(contrast / 33.3 , lightness);
}
void OpencvEnhance::on_brightnessVerticalSlider_valueChanged(int value)
{
lightness = value;
imgProc(contrast/33.3, lightness);
}
OpenCVEnnhance.h
cpp
#ifndef OPENCVENHANCE_H
#define OPENCVENHANCE_H
#include <QWidget>
#include <opencv2/opencv.hpp>
#include <QSize>
namespace Ui {
class OpencvEnhance;
}
using namespace cv;
class OpencvEnhance : public QWidget
{
Q_OBJECT
public:
explicit OpencvEnhance(QWidget *parent = nullptr);
~OpencvEnhance();
void init();
void imgShow();
void imgProc(double con, double bri);
private slots:
// 只保留 valueChanged,去掉 sliderMoved 槽函数,避免重复计算
void on_contrastVerticalSlider_valueChanged(int value);
void on_brightnessVerticalSlider_valueChanged(int value);
protected:
private:
Ui::OpencvEnhance *ui;
Mat imgdata; // 原始RGB图像
QImage myQimg;
QSize lableSize;
int contrast;
int lightness;
};
#endif // OPENCVENHANCE_H
opencv_demo.pro
cpp
QT += core gui widgets
CONFIG += console c++11
SOURCES += \
main.cpp \
mywidget.cpp \
opencvenhance.cpp
HEADERS += \
mywidget.h \
opencvenhance.h
INCLUDEPATH += D:\opencv-4.6.0\OpenCV_4.6.0-Build\install\include
LIBS += D:\opencv-4.6.0\OpenCV_4.6.0-Build\install\x64\mingw\bin\libopencv_*.dll
FORMS += \
opencvenhance.ui
RESOURCES += \
rec.qrc
main.cpp
cpp
#include "mywidget.h"
#include "opencvenhance.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc,argv);
OpencvEnhance w;
w.show();
return a.exec();
}
OpencvEnhance.ui 对比度0-100 亮度 -50~50
