1. 程式人生 > >學習OpenCV範例(四)——使用OpenCV對兩幅影象求和(求混合(blending))

學習OpenCV範例(四)——使用OpenCV對兩幅影象求和(求混合(blending))

這個範例相對來說比較簡單,簡單到在OpenCV的sample裡面都沒有提供原始碼,只能自己複製黏貼tutorial中的程式碼了,範例中介紹了線性混合操作的原理,和OpenCV提供的addWeighted()函式的用法,雖然簡單,但實現的功能還是挺有趣的,看看吧。

1、原理

線性混合操作 也是一種典型的二元(兩個輸入)的 畫素操作 :

g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

通過在範圍 0 \rightarrow 1 內改變 \alpha ,這個操可以用來對兩幅影象或兩段視訊產生時間上的 畫面疊化 (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圖片深度一樣
addWeighted實現原理如下:

                        dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma