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.執行效果所示。建立視窗,顯示影象並等待使用者結束程式