基础学习笔记之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下载.

 

 

 

 

posted on 2012-07-23 22:55  tornadomeet  阅读(8071)  评论(0编辑  收藏  举报

阿萨德发斯蒂芬