滑動條的創建和使用:
addWeighted(),createTrackbar()函數
//---------------------【滑動條的創建和使用】-----------------------
#include "pch.h"
//#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui.hpp>
#define WINDOW_NAME "【線性混合實例】" //爲窗口標題定義得宏
using namespace cv;
//using namespace std;
//【全局變量聲明部分】
const int g_nMaxAlphaValue = 100;//Alpha值的最大值,爲int類型
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和beta的值進行線性混合
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
//顯示效果圖
imshow(WINDOW_NAME, g_dstImage);
}
//-----------------------------【main()函數】--------------------------
// 控制檯應用程序的入口函數,我們的程序從這裏開始執行
//---------------------------------------------------------------------
int main(int argc,char** argv)
{
//加載圖像(兩圖像的尺寸需相同)
g_srcImage1 = imread("lena.tif");
g_srcImage2 = imread("lenag.tif");
if (!g_srcImage1.data)
{
printf("讀取第一張圖片錯誤,請確定目錄下是否有imread函數指定圖片存在!\n");
return -1;
}
if (!g_srcImage2.data)
{
printf("讀取第二張圖片錯誤,請確定目錄下是否有imread函數指定圖片存在!\n");
return -1;
}
//設置滑動條的初始值爲70
g_nAlphaValueSlider = 70;
//創建窗體
namedWindow(WINDOW_NAME, 1);
//在創建的窗體中創建一個滑動條的控件
char TrackbarName[50];
sprintf_s(TrackbarName, "透明值 %d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
//結果在回調函數中顯示
on_Trackbar(g_nAlphaValueSlider, 0);
//按任意鍵退出
waitKey(0);
return 0;
}
這次介紹opencv中一個簡單的點運算函數,用來實現圖片合成。 對應於例程中的 (TUTORIAL) AddingImages 和 (TUTORIAL) AddingImagesTrackbar。
Opencv中提供的函數是addWeighted,用法很簡單
圖像處理中一個簡單而有趣的點運算操作可以用以下的公式表示,可以實現兩張圖片的線性融合。 這裏α 表示兩種圖片的融合比例,這個g(x) 表示 融合圖片中的像素點,f0(x) 和 f1(x) 分別表示背景和前景圖片中的像素點。
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
opencv 通過 addWeighted 函數實現圖片的線性融合,這個函數在之前的例程中也有提到過。
這個函數的原型如下所示,可以看出這個函數最小需要6個參數。
1、 第1個參數,輸入圖片1,
2、第2個參數,圖片1的融合比例
3、第3個參數,輸入圖片2
4、第4個參數,圖片2的融合比例
5、第5個參數,偏差
6、第6個參數,輸出圖片
二、利用highgui庫中的 createTrackbar 函數創建一個滑塊,函數的原型如下
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
可以看到,這個函數有6個參數,最後一個爲用戶數據的指針,類似回調函數中的用戶數據指針。
1、第一個參數,爲滑塊的名字
2、第二個參數,爲滑塊所在窗口的名字,用來獲取窗口的handle
3、第三個參數,爲傳人一個數據的指針,通過滑塊來改變該數據的值,該變量需要在回調函數TrackbarCallback 中作用域可見,因此例程中將它定義爲全局變量
4、第四個參數,爲傳人數據的最大值,用來控制數據的變化範圍
5、第五個參數,回調函數的函數指針,當滑塊變化時,便調用回調函數,實現融合畫面隨着滑塊的滑動而變化 下面我們來看下回調函數 on_trackbar, 它被定義了成一個static函數,意味着函數生命週期從被調用開始一直存在知道程序結束,第二個參數對應createTrackbar函數中的
第6個參數,用戶數據指針。