在以前的幾個例子裏面,我們並沒有實現與計算機的交互。在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);
}
}