实现两幅图像线性(不同系数下)的融合涉及到Opencv中两个关键的方法,addWeighted()和createTrackbar()

addWeighted方法:

函数原型:

void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype=-1);</span>

这个函数实现对输入的两幅图像进行线性系数的加权和。

第一个参数:src1,表示进行加权操作的第一个图像对象

第二个参数:double型的alpha,表示第一个图像的加权系数

第三个参数:src2,表示进行加权操作的第二个图像对象

第四个参数:double型的beta,表示第二个图像的加权系数,很多情况下,有关系 alpha+beta=1.0

第五个参数:double型的gamma,表示一个 作用到加权和后的图像上的标量,可以理解为加权和后的图像的偏移量

第六个参数:dst,表示两个图像加权和后的图像,尺寸和图像类型与src1和src2相同

createTrackbar方法:

函数原型:

int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);</span>

这个函数实现在指定图像窗口上创建一个控制条,这个控制条具有指定的参数控制范围,可以通过回调函数,执行对应的操作。

第一个参数:const修饰的string类型的引用trackbarname,表示控制条的名称

第二个参数:const修饰的string类型的引用winname,表示控制条所在的图像窗口的名称

第三个参数:int型的指针value,表示滑块的控制位置,拖动控制条滑块的位置,相应的会改变*value的值

第四个参数:int型的count,表示控制条上滑块的最大位置处对应的值

第五个参数:TrackbarCallback类型的onChange,表示一个指向回调函数的指针,每当滑块的位置发生变化,都会触发该回调函数

第六个参数:void型的userdata,一般使用其默认值0

代码实现:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream> using namespace cv; Mat image,image1,image2;
char* windowName="Image Fusion";
char* trackBarName="TrackBar";
int trackBarValue=0;
int trackBarMax=100; //控制条回调函数
void TrackBarFunc(int ,void(*));
int main(int argc,char *argv[])
{
image1=imread(argv[1]);
image2=imread(argv[2]);
//判断读入是否成功
if(!image1.data|!image2.data)
{
std::cout<<"打开图片失败,请检查路径!"<<std::endl;
return 0;
}
//调整image2的大小与image1的大小一致,融合函数addWeighted()要求输入的两个图形尺寸相同
resize(image2,image2,Size(image1.cols,image1.rows));
//建立显示窗口
namedWindow(windowName);
//在图像窗口上创建控制条
createTrackbar(trackBarName,windowName,&trackBarValue,trackBarMax,TrackBarFunc);
TrackBarFunc(0,0);
waitKey();
return 0;
}
void TrackBarFunc(int ,void(*))
{
//转换成融合比例
float rate=(float)trackBarValue/trackBarMax;
addWeighted(image1,rate,image2,1-rate,0,image);
imshow(windowName,image);
}

注意addWeighted()函数输入的两个图像尺寸和类型必须是一致的,所以在融合前先使用resize()函数调整第二幅图像的大小跟第一幅图像一致。

控制条滑块位置为0时效果,此时图像一的权重为0,所以显示出来是图像二:

控制条滑块位置居中时效果,此时图像一图像二的权重各为0.5,相当于1:1融合:

控制条滑块位置最大时效果,相当于此时图像二的权重为0,所以显示出来是图像一:

Opencv实现两幅图像融合的更多相关文章

  1. OpenCv实现两幅图像的拼接

    直接贴上源码 来源:http://www.myexception.cn/image/1498389.html 实验效果 Left.jpg right.jpg ImageMatch.jpg #inclu ...

  2. OpenCV --- 实现两幅图像并排合并(ROI)

    Mat img1 = imread("1.png"); Mat img2 = imread("2.png"); int height = img1.rows; ...

  3. OpenCV 对两幅图像求和(求混合(blending))

    #include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; int m ...

  4. OpenCV,计算两幅图像的单应矩阵

    平面射影变换是关于其次3维矢量的一种线性变换,可以使用一个非奇异的$3 \times 3$矩阵H表示,$X' = HX$,射影变换也叫做单应(Homography).计算出两幅图像之间的单应矩阵H,那 ...

  5. 【OpenCV学习】计算两幅图像的重叠区域

    问题描述:已知两幅图像Image1和Image2,计算出两幅图像的重叠区域,并在Image1和Image2标识出重叠区域. 算法思想: 若两幅图像存在重叠区域,则进行图像匹配后,会得到一张完整的全景图 ...

  6. CV 两幅图像配准

    http://www.cnblogs.com/Lemon-Li/p/3504717.html 图像配准算法一般可分为: 一.基于图像灰度统计特性配准算法:二.基于图像特征配准算法:三.基于图像理解的配 ...

  7. Opencv step by step - 图像融合

    两个图像的融合就是像素的融合了,其实手动操作即可,用函数操作更方便了. 下面代码的作用是融合阿狸和doctor,很和谐有木有! #include <cv.h> #include <h ...

  8. opencv::将两幅图像合并后,在同一个窗口显示;并将合并的图像流保存成视频文件

    /** * @file main-opencv.cpp * @date July 2014 * @brief An exemplative main file for the use of ViBe ...

  9. OpenCV 学习笔记(0)两幅图像标定配准

    参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...

随机推荐

  1. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  2. Spring Tool Suite (STS) 安装SVN插件

    今天STS安装SVN时遇到很多问题,度娘搜索几个小时才安装成功. 在此记录下安装过程. 我的 STS版本: 安装SVN有两种方式: 方法1:依次选择help->preferences->e ...

  3. 洛谷 P1034 矩形覆盖

    P1034 矩形覆盖 题目描述 在平面上有nn个点(n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4 时,44个点的坐标分另为:p_1p1​(1,11,1),p_2p2​( ...

  4. MAPZONE GIS SDK接入Openlayers3之五——图形编辑工具

    图形编辑工具提供对要素图形进行增.删.改的功能,具体包括以下几种工具类型: 浏览工具 选择工具 创建要素工具 删除命令 分割工具 合并命令 节点编辑工具 修边工具 撤销命令 重做命令 工具的实现基本上 ...

  5. Shiro源代码分析之两种Session的方式

    1.Shiro默认的Session处理方式 <!-- 定义 Shiro 主要业务对象 --> <bean id="securityManager" class=& ...

  6. android studio 使用(一)

    官方网址入门:https://developer.android.com/studio/install.html 看下Build Your first App,

  7. Linux温习(三)Linux文件和文件夹管理

    关于Linux文件夹的几个常见概念 路径 对文件位置信息的描写叙述机制.是指从树型文件夹中的某个文件夹层次到其内某个文件的一条通路.分为相对路径和绝对路径: 工作文件夹 登入系统后.用户始终处于某个文 ...

  8. router的安装和基本配置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. HDU 3065 病毒侵袭持续中(AC自己主动机)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3065 Problem Description 小t非常感谢大家帮忙攻克了他的上一个问题.然而病毒侵袭 ...

  10. Xamarin Android 记事本(三)删改

    这篇我就不做太多的说明了,数据操作之前也都举过例子了,这里就直接贴出删除和修改的代码. public override bool OnOptionsItemSelected(IMenuItem ite ...