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

29 篇文章 20 订阅
6 篇文章 1 订阅

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

0)Widget_op.ui (界面文件)设计:
在这里插入图片描述

1、代码:

1)opencv_imwrite_Q.pro 添加:

INCLUDEPATH+= D:\opencv-3.1.0\opencv\build\include

win32: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_world310

INCLUDEPATH += 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_OBJECT

public:
    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 = 1
        if(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 Mat
            uchar *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 = 3
        else if(mat.type() == CV_8UC3)
        {
            // Copy input Mat
            const uchar *pSrc = (const uchar*)mat.data;
            // Create QImage with same dimensions as input Mat
            QImage 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 Mat
            const uchar *pSrc = (const uchar*)mat.data;
            // Create QImage with same dimensions as input Mat
            QImage 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 class
         return QWidget::eventFilter(obj, event);
     }
}

2、运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值