QT+OpenCV综合示例:图像混合(滑动条)

  • 1、代码:
  • 2、运行结果:

0)Widget_op.ui (界面文件)设计:

1、代码:

1)opencv_imwrite_Q.pro 添加:

INCLUDEPATH+= D:\opencv-3.1.0\opencv\build\includewin32:CONFIG(release, debug|release): LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310
else:win32:CONFIG(debug, debug|release): LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310d
else:unix: LIBS += -LD:/opencv-3.1.0/opencv/build/x64/vc12/lib/ -lopencv_world310INCLUDEPATH += D:/opencv-3.1.0/opencv/build/x64/vc12
DEPENDPATH += D:/opencv-3.1.0/opencv/build/x64/vc12

2)主函数 main.cpp 添加:

#include "Widget_c.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget_c w;w.show();return a.exec();
}

3)Widget_c.h (主窗口头文件)添加:

#ifndef WIDGET_C_H
#define WIDGET_C_H
#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif
#pragma warning(disable:4819)
#include <QWidget>
#include <opencv2/opencv.hpp>
#include <QImage>
#include <QMouseEvent>
#include <QLabel>namespace Ui {class Widget_c;
}class Widget_c : public QWidget
{Q_OBJECTpublic:explicit Widget_c(QWidget *parent = 0);~Widget_c();bool eventFilter(QObject *obj, QEvent *event);private slots:void on_horizontalSlider_valueChanged(int value);private:Ui::Widget_c *ui;cv::Mat g_srcImage1;cv::Mat g_srcImage2;cv::Mat g_dstImage;const int g_nMaxAlphaValue=100; //Alpha值的最大值private:QImage MatToQImage(const cv::Mat& mat);void display_MatInQT(QLabel* label,cv::Mat& mat);
};#endif // WIDGET_C_H

4)Widget_c.cpp (主窗口源文件)添加:

#include "Widget_c.h"
#include "ui_Widget_c.h"
#pragma warning(disable:4819)
#include <QMessageBox>
#include <QFileDialog>using namespace  cv;Widget_c::Widget_c(QWidget *parent) :QWidget(parent),ui(new Ui::Widget_c)
{ui->setupUi(this);this->setFixedSize(600,450);this->setWindowFlags(Qt::WindowCloseButtonHint |Qt::WindowMinimizeButtonHint );ui->label->installEventFilter(this);    //安装事件过滤器ui->label->setText(tr("点击加载图片..."));ui->label->setFont(QFont("微软雅黑",20,QFont::Bold,true));ui->label->setStyleSheet("color:blue; background-color:lightYellow;");  //文本颜色(前景色)//加载图像 (两图像的尺寸需相同)//g_srcImage1 = imread("F:/C++/2. OPENCV 3.1.0/Trackbar_QSlier/1.jpg");//g_srcImage2 = imread("F:/C++/2. OPENCV 3.1.0/Trackbar_QSlier/2.jpg");//设置滑动条控件的最小/大值ui->horizontalSlider->setMinimum(0);ui->horizontalSlider->setMaximum(100);ui->horizontalSlider->setEnabled(false);//ui->lineEdit->setText(tr("50 %"));
}Widget_c::~Widget_c()
{delete ui;
}//  MatToQImage 图像转换函数
QImage Widget_c::MatToQImage(const cv::Mat& mat)
{// 8-bits unsigned, NO. OF CHANNELS = 1if(mat.type() == CV_8UC1){QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);// Set the color table (used to translate colour indexes to qRgb values)image.setColorCount(256);for(int i = 0; i < 256; i++){image.setColor(i, qRgb(i, i, i));}// Copy input Matuchar *pSrc = mat.data;for(int row = 0; row < mat.rows; row ++){uchar *pDest = image.scanLine(row);memcpy(pDest, pSrc, mat.cols);pSrc += mat.step;}return image;}// 8-bits unsigned, NO. OF CHANNELS = 3else if(mat.type() == CV_8UC3){// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_RGB888);return image.rgbSwapped();}else if(mat.type() == CV_8UC4){//qDebug() << "CV_8UC4";// Copy input Matconst uchar *pSrc = (const uchar*)mat.data;// Create QImage with same dimensions as input MatQImage image(pSrc, mat.cols, mat.rows, (int)mat.step, QImage::Format_ARGB32);return image.copy();}else{//qDebug() << "ERROR: Mat could not be converted to QImage.";return QImage();}}void Widget_c::display_MatInQT(QLabel* label,Mat&    mat)
{label->setPixmap(QPixmap::fromImage(MatToQImage(mat)).scaled(label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));}//  滑动条处理函数 process function
void Widget_c::on_horizontalSlider_valueChanged(int value)
{if(g_srcImage1.data&&g_srcImage2.data){// 显示slider 值:QString str = QString("%1%2").arg(value).arg(" %");ui->lineEdit->setText(str);//求出当前alpha值相对于最大值的比例double g_dAlphaValue = (double)value / g_nMaxAlphaValue;//则beta值为1减去alpha值double g_dBetaValue = (1.0 - g_dAlphaValue);//   根据alpha和beta值进行线性混合(加权)// dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);//imshow("show",g_dstImage);// 通过QT label 显示display_MatInQT(ui->label,g_dstImage);}else{QMessageBox::warning(this, tr("提示"),tr("未成功载入图片!"), QMessageBox::Ok);}}// 事件过滤器处理
bool Widget_c::eventFilter(QObject *obj, QEvent *event)
{if (obj == ui->label)//指定某个QLabel{if (event->type() == QEvent::MouseButtonPress) //鼠标点击{QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 时间转换if(mouseEvent->button() == Qt::LeftButton){QStringList fileNames = QFileDialog::getOpenFileNames(this,tr("保存对话框"),"F:/C++/2. OPENCV 3.1.0/Trackbar_QSlier", tr("图片文件(*.png *.jpg *.jpeg *.bmp *.tif *.tiff);;所有文件(*)"));if(fileNames.length()==2) // 逐行显示文件路径名{g_srcImage1 = imread(fileNames[0].toLocal8Bit().data());g_srcImage2 = imread(fileNames[1].toLocal8Bit().data());if(g_srcImage1.data&&g_srcImage2.data){ui->horizontalSlider->setEnabled(true);}else{QMessageBox::warning(NULL,"警告","载入图片错误:请载入两张同类型、尺寸的图片!",QMessageBox::Yes);}ui->horizontalSlider->setValue(50);}else{QMessageBox::information(NULL,"提示","请载入两张同类型、尺寸的图片!",QMessageBox::Yes);}return true;}else{return false;}}else{return false;}}else{// pass the event on to the parent classreturn QWidget::eventFilter(obj, event);}
}

2、运行结果:

QT+OpenCV综合示例:图像混合(滑动条)相关推荐

  1. QT+OpenCV综合示例:载入、读取图片

    QT+OpenCV综合示例:载入.读取图片 1.代码: 2.运行结果: 下载1 GitHub: 下载2 1.代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH+= D ...

  2. QT+Halcon综合示例:clip回形针2D位姿检测

    QT+Halcon综合示例(一):clip回形针2D位姿检测 0.halcon源码: 1.Qt代码: 2.运行结果: 下载:clip回形针2D位姿检测 0.halcon源码: * clip.hdev: ...

  3. OpenCV学习笔记七-创建滑动条

    摘要:主要记录滑动条函数使用方法 创建滑动条函数: C++: int createTrackbar(const string& trackbarname, const string& ...

  4. 利用OpenCV的函数createTrackbar创建滑动条查看二值化的最优阈值的源码及讲解

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 这个功能的实现其实很简单,主要是要明白creat ...

  5. HTML滑动条自动滑动,HTML5新特性——自定义滑动条(input[type=range])

    HTML 4.01 与 HTML5之间的差异 以下 input 的 type属性值是 HTML5 中新增的: color.date.datetime.datetime-local.month.week ...

  6. HighGUI图像用户界面初步(滑动条、鼠标操作)

    文章目录 1.Mat类简析 2.图像的载入:imread()函数 3.图像的显示:imshow()函数 4.创建窗口:namedWindow()函数 5.输出图像到文件:imwrite()函数 6.综 ...

  7. OpenCV之highgui 模块. 高层GUI和媒体I/O: 为程序界面添加滑动条 OpenCV的视频输入和相似度测量 用OpenCV创建视频

    为程序界面添加滑动条 在以前的教程中 (例如 linear blending 和 brightness and contrast adjustments)你有可能注意到需要 input 一些数值到我们 ...

  8. opencv 滑动条的创建和使用

    CV_EXPORTS int createTrackbar(const string& trackbarname, // 轨迹条名称const string& winname, // ...

  9. 【火同学】OPencv学习笔记——滑动条的创建和使用

    Opencv中的滑动条的创建和使用 Ps:素材来源:opencv编程,目的是记录自己的学习过程. 一,创建滑动条:createTrackbar() 1)createTrackbar()函数是用来创建一 ...

最新文章

  1. maven项目中,如何导出项目所有的jar
  2. Android 6.0 以及HttpClient
  3. 在linux下php挂接mysql.so扩展的方法
  4. boost::char_separator相关的测试程序
  5. kaggle实战—泰坦尼克(三、数据重构)
  6. 从0到1搭建spark集群---企业集群搭建
  7. 北深互联网之争:北京约饭,深圳建群
  8. Linux下测试PHP和MySQL是否正确安装
  9. JS连接数据库(需配置odbc)
  10. cocos2d-x学习资源整理(持续更新)
  11. RC振荡电路——文氏桥振荡电路(OP07仿真)
  12. 科隆国际游戏展:2000系列显卡来袭,iGame板卡信仰搭配
  13. c语言数制转换程序,数制转换(C语言实现)
  14. 实习一月记——美团点评云计算部
  15. 《The Wiley Handbook of Human Computer Interaction》翻译(冰山一角)
  16. C语言int型数据范围
  17. 泰山OFFICE技术讲座:全网首发:中文字体,字号就是中文字符的宽度
  18. 计算机教师知识老化,【计算机教学论文】技校计算机教学分析(共2800字)
  19. 禅宗公案节选(中国禅宗概述)
  20. 我喜欢夜晚,黑黑的夜色带给人安全感

热门文章

  1. 学完文本知识,我就直接看懂图片了!
  2. 常见中文NER数据集大盘点
  3. 推荐系统经典论文学习
  4. 企业咨询:常用分析和咨询方法列表
  5. Python实现二叉树的遍历
  6. C++ 空字符('\0')和空格符(' ')
  7. HDU 2089 不要62
  8. 如何给网页标题添加icon小图标
  9. JavaScript之event事件
  10. java.lang.UnsupportedClassVersionError: Bad version number in .class file异常