zoukankan      html  css  js  c++  java
  • 学习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);
    	} 
    }
    



  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/xmfbit/p/3872185.html
Copyright © 2011-2022 走看看