图像----滑动条

1、

CreateTrackbar函数

函数作用:
创建一个滑动条

函数形式:
C++: int createTrackbar(const string& trackbarname, onst string& winna c me , int*  value , int  count , TrackbarCallback onChange =0, void*  userdata =0 )

const string& trackbarname:滑动条的名称
const string& winname:;;滑动条显示的窗口
int* value:滑动条变化的值
int count:value最大的值
on_change:每次滑块位置被改变的时候,被调用函数的指针。这个函数应该被声明为void Foo(int,void*); 如果没有回调函数,这个值可以设为NULL。int 是value的值,调用函数Foo(int ,void) void* userdata=0:用户信息

例子:
#include <cv.h>
#include <highgui.h>

using namespace cv;

/// 全局变量的声明与初始化
const int alpha_slider_max = 100;
int alpha_slider;
double alpha;
double beta;

/// 声明存储图像的变量
Mat src1;
Mat src2;
Mat dst;

/**
 * @function on_trackbar
 * @定义响应滑动条的回调函数
 */
void on_trackbar( int, void* )
{
 alpha = (double) alpha_slider/alpha_slider_max ;
 beta = ( 1.0 - alpha );

 addWeighted( src1, alpha, src2, beta, 0.0, dst);

 imshow( "Linear Blend", dst );
}

int main( int argc, char** argv )
{
 /// 加载图像 (两图像的大小与类型要相同)
 src1 = imread("../../images/LinuxLogo.jpg");
 src2 = imread("../../images/WindowsLogo.jpg");

 if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
 if( !src2.data ) { printf("Error loading src2 \n"); return -1; }

 /// 初始化为零
 alpha_slider = 0;

 /// 创建窗体
 namedWindow("Linear Blend", 1);

 /// 在创建的窗体中创建一个滑动条控件
 char TrackbarName[50];
 sprintf( TrackbarName, "Alpha x %d", alpha_slider_max );

 createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );

 /// 结果在回调函数中显示
 on_trackbar( alpha_slider, 0 );

 /// 按任意键退出
 waitKey(0);
 return 0;
}

程序说明

我们只分析关于滑动条的那段代码:

#.首先, 我们加载了两个图像, 目的是把它们混合显示.

src1 = imread("../../images/LinuxLogo.jpg");
src2 = imread("../../images/WindowsLogo.jpg");

#.在创建滑动条之前, 我们要先创建一个窗体,以便把创建的滑动条放置在上面:

namedWindow("Linear Blend", 1);
  1. 现在可以创建滑动条了:

    createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
    

    记住下面的参数介绍:

    • 在标签中显示的文字(提示滑动条的用途) TrackbarName
    • 创建的滑动条要放置窗体的名字 “Linear Blend”
    • 滑动条的取值范围从 0 到 alpha_slider_max (最小值只能为 zero).
    • 滑动后的值存放在 alpha_slider 变量里
    • 每当滑动条的值改变, 就会调用 on_trackbar 回调函数
  2. 最后, 我们还要定义这个回调函数 on_trackbar 来实现我们想要的结果

    void on_trackbar( int, void* )
    {
     alpha = (double) alpha_slider/alpha_slider_max ;
     beta = ( 1.0 - alpha );
    
     addWeighted( src1, alpha, src2, beta, 0.0, dst);
    
     imshow( "Linear Blend", dst );
    }
    

    注意回调函数中的整型与双精度型的转换:

    • 从滑动条中获取的整型值 alpha_slider (integer) 要转换为双精度类型 alpha.
    • alpha_slider 的值会在滑动条滑动后被修改.
    • 我们所定义的 src1src2distalphaalpha_slider 和 beta 都是全局变量, 因此也可以在回调函数中使用.

结果

  • 下图是程序的运行结果:

    Adding Trackbars - Windows Linux
  • 也可以使用其它方式验证, 你可以用 改变图像的对比度和亮度 中的例程实现两个滑动条. 一个控制 \alpha 另一个控制 \beta. 可能的输出会是下面的样子:

    Adding Trackbars - Lena

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序分享如何实现实时滚动条效果类Mathematica的manipulate-manipulate.m 大家知道,在MATLAB中的滚动条控件是“非实时”的。所谓非实时,指的是用户在拖动滚动条时,滚动条的callback函数不会被触发,只有放开滚动条后,callback函数才会被调用一次。 但是,有的时候我们可能会有这样的需要:比如我们在窗口中做出了一个y = f函数的图形,这个函数有几个参数a, b, c ... 然后我们希望通过用滚动条的形式来改变这些参数的数值,并实时地在窗口中观察参数改变后的图形的结果。但直接使用滚动条控件的话,拖动滚动条时图形不会更新。想看到参数连续变化时对图形的影响,就只能一下一下地点击滚动条两端的箭头,非常繁琐。 这个功能在Mathematica下用manipulate命令就非常容易实现。但是在MATLAB下却一直没有提供具有类似功能的函数。所以我自己写了一个MATLAB的manipulate版本。当然,现在这个版本只能实现最基本的2D plot对象。至于其他类型的图形对象,我会在以后慢慢添加。 后 (或者在 http://www.mathworks.com/matlabcentral/fileexchange/36512-manipulate-interactive-parametrized-plotting 下载,帮我增加点人气) 在命令行中输入 manipulate复制代码 即可看到如下图所示的界面,用户可以随意拖动滚动条,axes中的内容会实时更新。 manipulate_demo.gif 实时滚动条效果演示 用户也可以使用自己给定的函数,并且可以操纵任意数目的参数,比如下列语句: manipulate*x param),[-10:10],[2 0]},{[-10 10],[-10 10]}, {1,'Slope',1 10}, {2,'Shift',-5 5})复制代码 会产生一条直线,用户可以操纵其斜率和截距。 更多使用方法请看函数自带的帮助(英文)。 欢迎提出宝贵意见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值