學習OpenCV範例(四)——使用OpenCV對兩幅影象求和(求混合(blending))
阿新 • • 發佈:2019-02-14
這個範例相對來說比較簡單,簡單到在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圖片深度一樣