【OpenCV】OpenCV實戰從入門到精通之六 -- 教你如何使用滑動條-createTrackbar()函數

本文是《OpenCV實戰從入門到精通》系列之第6篇

【OpenCV】OpenCV實戰從入門到精通之一 -- OpenCV宏的講解

【OpenCV】OpenCV實戰從入門到精通之二 -- OpenCV如何進行圖像腐蝕操作

【OpenCV】OpenCV實戰從入門到精通之三 -- canny邊緣檢測

【OpenCV】OpenCV實戰從入門到精通之四 -- 常用的函數講解(mat、imread、imshow、imwrite、nameWindow)

【OpenCV】OpenCV實戰從入門到精通之五 -- 教你使用Rect()函數

目錄

本文是《OpenCV實戰從入門到精通》系列之第6篇

 首先看一下creatTrackbar() 原型

createTrackbar(軌跡條名字,窗口名字,滑塊位置,滑塊最大值,回調函數,傳給回調函數的值) 

 //務必要找兩幅圖是一樣大小的,並且有明顯的區別,以讓自己的結果明顯

結果:


 首先看一下creatTrackbar() 原型

C++: int createTrackbar(conststring& trackbarname, conststring& winname,
 int* value, int count, TrackbarCallback onChange=0,void* userdata=0);

createTrackbar(軌跡條名字,窗口名字,滑塊位置,滑塊最大值,回調函數,傳給回調函數的值) 

第一個參數:const string&類型的trackbarname,表示軌跡條的名字,用來代表我們創建的軌跡條。
第二個參數:const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪個窗口上
第三個參數,int* 類型的value,指向整型的指針,表示滑塊的位置。並且創建時,滑塊的初始位置就是該變量當前的值。
第四個參數:int類型的count,表示滑塊可以達到的最大位置的值。PS:滑塊最小的位置的值始終爲0。
第五個參數:TrackbarCallback類型的onChange,首先注意他有默認值0。這是一個指向回調函數的指針,每次滑塊位置改變時,這個函數都會進行回調。並且這個函數的原型必須爲void XXXX(int,void*);其中第一個參數是軌跡條的位置,第二個參數是用戶數據(看下面的第六個參數)。如果回調是NULL指針,表示沒有回調函數的調用,僅第三個參數value有變化。
第六個參數:void*類型的userdata,他也有默認值0。這個參數是用戶傳給回調函數的數據,用來處理軌跡條事件。如果使用的第三個參數value實參是全局變量的話,完全可以不去管這個userdata參數

 //務必要找兩幅圖是一樣大小的,並且有明顯的區別,以讓自己的結果明顯

//-----------------------------------【創建滑動條】---------------------------------------
//	                           createTrackbar()函數,透明
//---------------------------------------------------------------------------------------------- 
#include <opencv2\opencv.hpp>
#include "opencv2\imgproc\imgproc.hpp"
#include "opencv2\highgui\highgui.hpp"
#include <iostream>

//-----------------------------------【命名空間聲明部分】---------------------------------------
//	描述:包含程序所使用的命名空間
//-----------------------------------------------------------------------------------------------   
using namespace cv;
using namespace std;

#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和beta值進行線性混合
	 addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
	 // 顯示窗口
	 imshow(	WINDOW_NAME, g_dstImage);
}


//-----------------------------------【main( )函數】--------------------------------------------
//	描述:控制檯應用程序的入口函數,我們的程序從這裏開始
//-----------------------------------------------------------------------------------------------
int main()
{

	//載入圖片
	g_srcImage1 = imread("1.jpg");
	g_srcImage2 = imread("2.jpg");
	//if (!img.data) { printf("Oh,no,讀取img圖片文件錯誤~! \n"); return -1; }

	g_nAlphaValueSlider = 70;

	//創建處理窗口
	namedWindow(WINDOW_NAME, 1);

	char TrackbarName[50];
	sprintf(TrackbarName, "透明%d", g_nAlphaValueSlider);
	//創建軌跡條
	createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_trackbar);

	on_trackbar(g_nAlphaValueSlider, 0);


	waitKey(0);
	return 0;
}

1.jpg 2.jpg

結果:

進度條爲10 進度條爲80
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章