學習OpenCV(六)TrackBar的使用


在以前的幾個例子裏面,我們並沒有實現與計算機的交互。在OpenCV中,我們可以使用TrackBar來進行交互,調整一些參數的大小。這篇文章主要介紹瞭如何使用TrackBar。

舉一個均值濾波blur的例子。我們已經知道,卷積核影響了均值濾波的效果。卷積核越大,圖像的模糊化越嚴重。我們可以使用TrackBar動態地調整卷積核的大小,這樣可以使得實驗效果更加直觀。

首先,來看一下參考手冊中的描述。我們可以使用createTrackbar函數來創建一個TrackBar。這個函數的原型如下:


其中,參數的意義爲:

	int createTrackbar (const string& trackbarName,const string& winName,
						int *value,int count,
						TrackbarCallback onChange=0,void *userdata=0);

trackbarName爲創建的TrackBar的名字,

winName爲創建的TrackBar所依附的窗體名字,

*value指針指向的是TrackBar當前的值,可以通過設置它改變遊標的位置,

count爲TrackBar的量程,注意一般情況下bar的最小值都是0,

TrackbarCallback爲一個函數指針,這個函數必須有下面的原型:

void onChangeTrackbar(int ,void* );

其中第一個參數是trackerbar的值,第二個參數是一個無類型的指針,指向userdata(參數的意義見下面)這個函數作爲回調函數,在TrackBar的值發生改變的時候被調用。如果這個參數被傳進去一個空指針NULL,那麼當TrackBar值發生改變的時候什麼也不做。

userdata是指向我們想傳給回調函數onChangeTrackbar的數據的一個指針。有了這個指針,我們可以不用設置太多的全局變量。在回調函數中,需要將這個指針強制類型轉換爲我們的實際數據類型指針,然後用*運算符取出數據。

下面就是例程:

#include <iostream>
#include <opencv/cv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

//定義了窗體名
string winName="Blur Filter";

//TrackBar發生改變的回調函數
void onChangeTrackBar(int poi,void* usrdata);

//主函數
int main ()
{
	//trackbar名
	string trackBarName="Size";
	//圖像文件名
	string imgName="image.tif";
	//trackbar的值
	int poiTrackBar=0;
	//trackbar的最大值
	int maxValue=35;

	Mat img;
	img=imread (imgName,CV_LOAD_IMAGE_COLOR);   //讀入圖像
	namedWindow(winName);      //新建窗口
	imshow (winName,img); 
	//創建trackbar,我們把img作爲數據傳進回調函數中
	createTrackbar (trackBarName,winName,&poiTrackBar,maxValue,
					onChangeTrackBar ,&img);
					
	waitKey ();
	return 0;
}

//回調函數
void onChangeTrackBar (int poi,void* usrdata)
{
	Mat img=*(Mat*)(usrdata);   //強制類型轉換
	Mat dst;
	if (poi%2==0)  //poi是偶數,把它減1變爲奇數
	{
		poi-=1;
	}
	if (poi>0)   //poi是奇數
	{
		//改變矩陣核
		Size blurSize=Size(poi,poi);
		//刷新
		blur (img,dst,blurSize);
		imshow (winName,dst);
	} 
}



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