zoukankan      html  css  js  c++  java
  • 基础学习笔记之opencv(11):图像混合

      本文主要讲的是怎样将2幅图片叠加,就像电影里面有时候出现的镜头一样,2幅图片可以按照不同比例重叠,当然这里主要是利用opencv自带的函数addWeighted().参考资料为opencv自带tutiol及其代码。

      开发环境:ubuntu12.04+opencv2.4.2+Qt4.8.2+QtCreator2.5.

     

      实验功能:

      单击Open image1按钮,打开第1幅图片并在左边显示出来。

      单击Open image2按钮,打开第2幅图片并在中间显示出来。

      在Alpha栏输入第1幅图片在图片混合时所占的比例,这时Beta栏的值也会跟着改变,因为2着的比例之和为1.0.

      同理,在Beta栏中输入第2幅图片在图片混合时所占的比例,这时Alpha栏里的值也会改变。

      单击Add image按钮,在软件右边那栏可以看到图片混合的效果。

     

      实验说明:

      addWeighted()函数的第1个参数为输入图片1,第2个参数为图片1的系数,参数3为输入图片2,参数4为图片2的系数。其实这2个系数之和没有必要为1,我这里在程序中定为1是防止图片出现过饱和等情况。参数5为混合后图片的深度,如果图片1和图片2深度相同的话,则该参数为-1. 最后1个参数为输出混合图片结果保存处。

      获得LineEdit的值是调用其text()函数,然后转换成相应的数据类型即可.

      QPalette为调色版,其颜色组分为3组,活动组,非活动组,不可用组;其中活动组为当前窗口所在组,非活动组为其它窗口所在组,不可用组是由于某种原因暂时不能使用的  组 。改变调色版的颜色可以使用setColor这个函数,这个函数有2个重载函数,其中参数ColorRole表示是更改哪个参数;比如说一般的背景色。

      EditLine背景色颜色角色为QPalette::Base;前景色文字的颜色角色为QPalette::Text.

      Button背景色颜色角色为QPalette::Button.前景色文字的颜色角色为QPalette::ButtonText.

      Label前景文字颜色角色为QPalette::WindowText.

     

      实验结果:

    图片1和图片2权重比为19时混合效果:

     

    图片1和图片2权重比为11时混合效果:

     

    图片1和图片2权重比为91时混合效果:

     

    实验主要部分代码及注释(附录有工程code下载链接)

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QPalette>
    #include <QFileDialog>
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        alpha = 0.50;
        beta = 0.50;
        /*QPalette为调色版,其颜色组分为3组,活动组,非活动组,不可用组;其中活动组为当前窗口所在组,非活动组为其它窗口所在组,不可
          用组是由于某种原因暂时不能使用的组
          改变调色版的颜色可以使用setColor这个函数,这个函数有2个重载函数,其中参数ColorRole表示是更改哪个参数;比如说一般的背景色
          就是QPalette::base,这里的文字颜色为QPalette::Text*/
        QPalette pal_editline;
        pal_editline.setColor( QPalette::Text, Qt::green );
        pal_editline.setColor( QPalette::Base, Qt::black );
        ui->alphaEdit->setPalette( pal_editline );
        ui->betaEdit->setPalette( pal_editline );
      //  ui->img1Browser->setStyleSheet( "background-color:black" );
      //  ui->img2Browser->setStyleSheet( "background-color:balck" );
    
        //改变label的文字颜色
        QPalette pal_label;
        pal_label.setColor( QPalette::WindowText, Qt::red );//这里要用WindowText,因为这是Labl上的文字
        ui->alphaLabel->setPalette( pal_label );
        ui->betaLabel->setPalette( pal_label );
    
        //改变button上的文字颜色
        QPalette pal_button;
        pal_button.setColor( QPalette::ButtonText, Qt::green );
        pal_button.setColor( QPalette::Button, Qt::black );
        ui->closeButton->setPalette( pal_button );
        ui->open1Button->setPalette( pal_button );
        ui->open2Button->setPalette( pal_button );
        ui->addButton->setPalette( pal_button );
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_closeButton_clicked()
    {
        close();
    }
    
    void MainWindow::on_open1Button_clicked()
    {
        QString qimg1 = QFileDialog::getOpenFileName( this, "Open image1", "../", tr("Image Files( *.png *.jpeg *.jpg *.bmp)") );
        img1 = imread( qimg1.toAscii().data() );
        ui->img1Browser->clear();
        ui->img1Browser->append( tr("<img src=%1>").arg( qimg1 ) );
    }
    
    void MainWindow::on_open2Button_clicked()
    {
        QString qimg2 = QFileDialog::getOpenFileName( this, "Open image1", "../", tr("Image Files( *.png *.jpeg *.jpg *.bmp)") );
        img2 = imread( qimg2.toAscii().data() );
        ui->img2Browser->clear();
        ui->img2Browser->append( tr("<img src=%1>").arg( qimg2 ) );
    }
    
    void MainWindow::on_addButton_clicked()
    {
        addWeighted( img1, alpha, img2, beta, 0.0, img3 );//图像混合的函数
        imwrite( "../add_img.jpg", img3 );
        ui->img3Browser->clear();
        ui->img3Browser->append( "<img src=../add_img.jpg>" );
    }
    
    void MainWindow::on_betaEdit_editingFinished()
    {
        beta = ui->betaEdit->text().toFloat();//对于LineEdit是用text函数获得其内容
        alpha = 1.0 - beta;
        ui->alphaEdit->setText( QString("%1").arg(alpha) );//回车后alpha的值也会改变,且满足2之和为1.0
    }
    
    void MainWindow::on_alphaEdit_editingFinished()
    {
         alpha = ui->alphaEdit->text().toFloat();
         beta = 1.0 - alpha;
         ui->betaEdit->setText( QString("%1").arg(beta) );
    }

     

      实验总结:

      对Qt某些控件颜色的操作稍微了解了点。另外图片显示时不能够根据图片实际大小来自动调整窗口。

     

      附:工程code下载.

     

     

     

     

    作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
  • 相关阅读:
    11.26
    11.25
    11.24
    11.23
    11.22
    11.21
    11.20
    3.16结对作业1.2
    3.14结对作业1.0
    3.13Android学习
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2605719.html
Copyright © 2011-2022 走看看