opencv 调节图片对比度和亮度

  1. OpenCV Mat 存储格式:BGR
  1. imread

QString imgPath = "xxxx";

Mat imgData = imread(imgPath.toStdString());

  1. zeros 初始化0阵列 (相当于 清零 申请的内存)

Mat imgSrc = imgData;

Mat imgDst = Mat::zeros(imgSrc.size(), imgSrc.type());

imread: opencv 读取图片,

toStdString:将QString 转为std::string

  1. 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);

  1. QImage

QImage img = QImage(

(const unsigned char *)imgdata.data, // Mat 像素数据首地址

imgdata.cols, imgdata.rows, // 图片宽度(列数) 图片高度(行数)

static_cast<int>(imgdata.step), // 行步长

QImage::Format_RGB888 //生成的 QImage 格式

).copy();

  1. 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

相关推荐
yumgpkpm13 分钟前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
邓工说电26 分钟前
智慧断路器安全吗?数据加密、离线保护与合规认证全解读
大数据·数据库·人工智能·智能断路器·炜晔科技
阿里云大数据AI技术28 分钟前
Lance 数据检索怎么选,当然阿里云 Milvus 向量湖
人工智能
出海客29 分钟前
跨境电商多语言客服知识库怎么建:资料结构、检索边界与人工升级
大数据·人工智能
xsd202411181 小时前
从自主导航到视觉读表:一台工业巡检机器人的全栈技术链路拆解
人工智能
袁哥大话安全1 小时前
巡隐WEBSHELL扫描软件
人工智能·安全·web
论文复现现场1 小时前
8卡4090能跑70B吗?Llama-2显存预算、QLoRA与通信瓶颈
人工智能·深度学习·分布式训练·llama·显存·qlora·算家云
酷虎软件1 小时前
如何用AI创作AI歌曲AI音乐
人工智能
小宋10211 小时前
A2UI从零实战:Agent安全生成交互界面与事件回传
javascript·人工智能·安全·交互
罗小罗同学1 小时前
谷歌团队在Nat Med最新发表的医学多模态模型,4B参数的模型性能逼近671B的DeepSeek
人工智能·医学图像处理·医工交叉·医学ai