这个范例相对来说比较简单,简单到在OpenCV的sample里面都没有提供源代码,只能自己复制黏贴tutorial中的代码了,范例中介绍了线性混合操作的原理,和OpenCV提供的 addWeighted()函数的用法,虽然简单,但实现的功能还是挺有趣的,看看吧。
线性混合操作 也是一种典型的二元(两个输入)的 像素操作 :
通过在范围 内改变
,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果。主要是在第一幅图片中提取一定权重的像素值,在第二幅图片中提取一定权重的像素值,然后相加赋值给最后的图片,就这么简单。
// 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; }
图1、alpha值为0.5 图2、alpha值为0.2
程序可以根据输入的alpha值,来确定权重,从而影响两幅图片所显示的情况。
功能:计算两个矩阵的加权和
结构:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)