尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

opencv 调节图片对比度和亮度

opencv 调节图片对比度和亮度 1. OpenCV Mat 存储格式BGR1. imreadQString imgPath xxxx;Mat imgData imread(imgPath.toStdString());2. zeros 初始化0阵列 相当于 清零 申请的内存Mat imgSrc imgData;Mat imgDst Mat::zeros(imgSrc.size(), imgSrc.type());imread: opencv 读取图片toStdString将QString 转为std::string2. 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);3. QImageQImage img QImage((const unsigned char *)imgdata.data, // Mat 像素数据首地址imgdata.cols, imgdata.rows, // 图片宽度列数 图片高度行数static_castint(imgdata.step), // 行步长QImage::Format_RGB888 //生成的 QImage 格式).copy();4. void Mat::convertTo( OutputArray dst, int rtype, double alpha1, double beta0 ) const;调节图片的亮度(beta)和对比度alpha, 通过下面公式转换图片像素dst(x,y) saturate_castuchar( alpha * src(x,y) beta)imgSrc.converTo(imgDst, -1, con, bri);OpenCVEnhance.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_castint(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_castint(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#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_Hopencv_demo.proQT core gui widgets CONFIG console c11 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.qrcmain.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
返回列表