基础学习笔记之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权重比为1:9时混合效果:
图片1和图片2权重比为1:1时混合效果:
图片1和图片2权重比为9:1时混合效果:
实验主要部分代码及注释(附录有工程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某些控件颜色的操作稍微了解了点。另外图片显示时不能够根据图片实际大小来自动调整窗口。