自己立下的flag,熬夜也要完成呀,繼續更博。今天看到了第三章,對在窗口中加軌跡條,以及簡單的alpha融合有了一個簡單的認識。
還是先說alpha融合,其實個人認爲就是兩幅圖片在各自乘上各自的透明度權值然後再用addweight函數做個簡單的混合就可以。(上面的那個函數是什麼大家可以自行百度,或者參考https://blog.csdn.net/gujiligujili/article/details/7650523)
然後遇到的一點小問題就是在寫軌跡條函數時出現了一個“回調函數”。先解釋一下回調函數,說一下自己的理解。回調函數形式上不是由某一條代碼明顯獨立的在主函數中調用,而是在某個其他函數中作爲一個對這個函數的響應。(有點亂,舉個栗子,A是B的回調函數。意味着,在執行B函數時,A函數作爲執行B的一個響應,也會執行。)形式上還要注意,回調函數A的調用不是寫在B的函數體內,而是在B的參數中。A的函數名(其實就是這個函數的地址)作爲B的一個參數。額。。。不知道講清楚沒,一會看一下代碼可能會更明白。
不多說先上結果:
這其實是兩張圖,當透明值爲0或者爲100時就會顯示兩張原圖。
調節透明度後的效果。好了上代碼:
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "【線性混合示例】"
//----------------------全局變量的聲明------------------
const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑動條對應的變量
double g_dAlphaValue;
double g_dBetaValue;
//--------------------聲明存儲圖像的變量----------------
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;
//--------------------【on_Trackbar()函數】--------------
//描述:響應滑動條的回調函數
//-------------------------------------------------------
void on_Trackbar(int, void*)
{
//求出當前Alpha值對應於最大值的比例
g_dAlphaValue = (double) g_nAlphaValueSlider / g_nMaxAlphaValue;
//則Beta值爲1減去Alpha值
g_dBetaValue = (1.0 - g_dAlphaValue);
//根據alpha值和bete值進行線性混合
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//顯示效果圖
imshow(WINDOW_NAME, g_dstImage);
}
int main()
{
g_srcImage1 = imread("1.jpg");
g_srcImage2 = imread("2.jpg");
//設置滑動條初始值爲70
g_nAlphaValueSlider = 70;
//創建窗口
namedWindow(WINDOW_NAME, 1);
//在窗口裏創建一個滑動條控件
char TrackbarName[50];
sprintf(TrackbarName, "透明值 %d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
//結果在回調函數中顯示
on_Trackbar(g_nAlphaValueSlider, 0);
waitKey(0);
return 0;
}