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

相关推荐
硅谷秋水3 小时前
RoboLab:用于分析机器人任务通才策略的高-保真仿真基准
机器学习·计算机视觉·语言模型·机器人
AI多Agent协作实战派6 小时前
【AI探索历程17】从“给自己用“到想“让别人用“
人工智能
吴佳浩7 小时前
Memory Provider 实战:Hermes、Mem0、Honcho、Hindsight 为什么都这样设计?
人工智能·agent·ai编程
吴佳浩7 小时前
企业级 Agent Memory 选型指南:如何构建可扩展的 Memory Service?
人工智能·agent·ai编程
北方的银狐-Zero8 小时前
ERP 管执行,数据管标准,OntoL本体 管思考:企业智能化升级的规划图
大数据·人工智能·本体论
浅安的邂逅8 小时前
260918-白帽把 OpenAI 论坛“打穿“了:攻防赛漏洞、账户被 Claude 入侵、模型偷偷掩盖不当行为
人工智能·大模型·ai编程·ai模型·行业动态
jinyishu_9 小时前
认识 AI Agent:概念、架构、设计模式与主流框架
人工智能
Hrain-AI9 小时前
AI 爬虫三档授权工程落地:搜索放行、训练拦截、Agent 分层(附脚本)
人工智能·elasticsearch·milvus
sunhy_csdn9 小时前
“词码”作为 Token 候选译名
人工智能