1. 程式人生 > >2.4使用OpenCV新增(混合)兩個影象

2.4使用OpenCV新增(混合)兩個影象

目標
在本教程中,您將瞭解:
•什麼是線性混合以及為什麼它是有用的;
•如何新增兩個影象
理論
注:下面的解釋屬於Richard Szeliski的《計算機視覺:演算法與應用》一書
在前面的教程中,我們已經瞭解了一些畫素運算子。一個有趣的二元(雙輸入)運算子是。
線性混合運算子:g(x) = (1 - α)f0(x) + αf1(x)
通過改變α從0 到1該運算子可用於在兩個影象或視訊之間執行時間交叉刻劃,
就像在幻燈片放映和電影製作中看到的(酷,嗯?)
程式碼實現:

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src1; Mat src2; Mat dst; double alpha = 0.5; double beta; double input; ///請求使用者輸入alpha std::cout << " Simple Linear Blender "
<< std::endl; std::cout << "-----------------------" << std::endl; std::cout << "* Enter alpha [0-1]: "; std::cin >> input; ///如果在0和1之間,我們使用使用者提供的alpha if (input >= 0.0 && input <= 1.0) { alpha = input; } ///讀取影象(大小相同,型別相同) src1 = imread("D:\\workplace\\Visual Studio\\2013\\OpenCV2.4.11\\pic_data\\LinuxLogo.jpg"
); src2 = imread("D:\\workplace\\Visual Studio\\2013\\OpenCV2.4.11\\pic_data\\WindowsLogo.jpg"); if (!src1.data) { printf("Error loading src1 \n"); return -1; } if (!src2.data) { printf("Error loading src2 \n"); return -1; } ///建立視窗 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.因為我們要實現:
g(x)=(1-α)f0(x)+αf1(x)
我們需要兩個源影象(f0(x)和f1(x))。因此,我們以通常的方式裝載它們:
src1=imread(“D:\workplace\VisualStudio\2013\OpenCV2.4.11\pic_data\LinuxLogo.jpg”);
src2=imread(“D:\workplace\VisualStudio\2013\OpenCV2.4.11\pic_data\WindowsLogo.jpg”);
警告:因為我們添加了src1和src2,所以它們必須具有相同的大小(寬度和高度)和
型別。
2.現在我們需要生成g(x)影象。為此,新增權重的函式非常方便:
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
直到addWeighted產生:
dst =α·src1 +β·src2 +γ
在這種情況下,γ引數是0.0在上面的程式碼中。
3.執行效果所示。建立視窗,顯示影象並等待使用者結束程式