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);
    	} 
    }
    



  • 相关阅读:
    Intellij IDEA 常用快捷键
    @Transient注解----Hiberbate
    tomcat:域名指向项目名
    java实现全排列
    Bean不同配置方式的比较
    Spring MVC:在jsp中引入css
    Spring中Bean的作用域
    第9章 初识HAL固件库
    第8章 自己写库—构建库函数雏形
    第7章 使用寄存器点亮LED灯
  • 原文地址:https://www.cnblogs.com/xmfbit/p/3872185.html
Copyright © 2011-2022 走看看