这个范例相对来说比较简单,简单到在OpenCV的sample里面都没有提供源代码,只能自己复制黏贴tutorial中的代码了,范例中介绍了线性混合操作的原理,和OpenCV提供的 addWeighted()函数的用法,虽然简单,但实现的功能还是挺有趣的,看看吧。
1、原理
线性混合操作 也是一种典型的二元(两个输入)的 像素操作 :
通过在范围 内改变
,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果。主要是在第一幅图片中提取一定权重的像素值,在第二幅图片中提取一定权重的像素值,然后相加赋值给最后的图片,就这么简单。
2、代码实现
- // Adding (blending) two images using OpenCV.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <iostream>
- using namespace cv;
- int main( int argc, char** argv )
- {
- double alpha = 0.5; double beta; double input;
- Mat src1, src2, dst;
- /// Ask the user enter alpha
- std::cout<<" Simple Linear Blender "<<std::endl;
- std::cout<<"-----------------------"<<std::endl;
- std::cout<<"* Enter alpha [0-1]: ";
- std::cin>>input;
- /// We use the alpha provided by the user iff it is between 0 and 1
- if( alpha >= 0 && alpha <= 1 )
- { alpha = input; }
- /// Read image ( same size, same type )
- src1 = imread("LinuxLogo.jpg");
- src2 = imread("WindowsLogo.jpg");
- if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
- if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
- /// Create Windows
- namedWindow("Linear Blend", 1);
- beta = ( 1.0 - alpha );
- addWeighted( src1, alpha, src2, beta, 0.0, dst);
- imshow( "Linear Blend", dst );
- waitKey(0);
- return 0;
- }
3、运行结果
图1、alpha值为0.5 图2、alpha值为0.2
4、总结
程序可以根据输入的alpha值,来确定权重,从而影响两幅图片所显示的情况。
addWeighted:
功能:计算两个矩阵的加权和
结构:
- void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
- src1:第一幅图片
- alpha :第一幅图片的权重
- src2 :第二幅图片,size和channel和第一幅图片一样
- beta :第二幅图片的权重
- dst :输出图片,size和chann和输入图片一样
- gamma :附加的数值
- dtype :默认为-1,即输出图片深度和src1图片深度一样