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

相关推荐
Microvision维视智造1 小时前
近十年视觉市场变化趋势分析——客户需求的三次跃迁
人工智能·计算机视觉·视觉检测·机器视觉
云简业财.AI1 小时前
业财活动 | 用真实业务场景来孵化业财AI产品的AI业财黑客松
人工智能·数字化转型·业财融合·云简业财·ai黑客松
MindUp1 小时前
面试录音视频的AI复盘方案:从语音转录到RAG问答的技术实践
人工智能·面试·音视频
阿部多瑞 ABU1 小时前
# 《器皿》
人工智能
向上的车轮2 小时前
AI Infra 是什么?AI Infra的发展趋势是怎样的?
人工智能
liangshanbo12152 小时前
Express SSE 流式输出实战:从入门 Demo 到 AI 生产级架构
人工智能·架构·express
AI云海2 小时前
完整机器学习工业项目流水线笔记
人工智能·笔记·机器学习
安全指北针2 小时前
AI Agent自主入侵真实系统:OpenAI和Anthropic两大模型接连“失控“,给安全行业敲响了什么警钟?
人工智能·安全
2601_965799682 小时前
2026 在线笔试平台深度测评与选型指南:从功能、稳定性、AI能力、防作弊全面分析
人工智能·笔记·功能测试