.. _Adding_Trackbars: 为程序界面添加滑动条 *************************************** * 在以前的教程中 (例如 *linear blending* 和 *brightness and contrast adjustments*)你有可能注意到需要 **input** 一些数值到我们的程序中, 例如 :math:`\alpha` 和 :math:`beta` 。我们会在代码中输入这些数据来配合程序的运行。 * 好, 下面来介绍所要用到的一个 GUI 中的工具. OpenCV 提供的 GUI 库在(*highgui.h*)里. 这是一个 **滑动条** 的样子 .. image:: images/Adding_Trackbars_Tutorial_Trackbar.png :alt: Trackbar example :align: center * 在这里教程指导我们修改以前的方案,以便从滑动条中获得那些需要输入数据. 目标 ====== 在这节教程中你将学习: * 使用OpenCV函数 :create_trackbar:`createTrackbar <>` 在窗口中添加一个滑动条: 代码 ===== 首先来修改一下教程中 :ref:`Adding_Images` 这个例子. 用滑动条来动态输入 :math:`\alpha` 这个值. .. code-block:: cpp #include #include 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; } 程序说明 ============ 我们只分析关于滑动条的那段代码: #.首先, 我们加载了两个图像, 目的是把它们混合显示. .. code-block:: cpp src1 = imread("../../images/LinuxLogo.jpg"); src2 = imread("../../images/WindowsLogo.jpg"); #.在创建滑动条之前, 我们要先创建一个窗体,以便把创建的滑动条放置在上面: .. code-block:: cpp namedWindow("Linear Blend", 1); #. 现在可以创建滑动条了: .. code-block:: cpp createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar ); 记住下面的参数介绍: * 在标签中显示的文字(提示滑动条的用途) **TrackbarName** * 创建的滑动条要放置窗体的名字 **"Linear Blend"** * 滑动条的取值范围从 :math:`0` 到 **alpha_slider_max** (最小值只能为 **zero**). * 滑动后的值存放在 **alpha_slider** 变量里 * 每当滑动条的值改变, 就会调用 **on_trackbar** 回调函数 #. 最后, 我们还要定义这个回调函数 **on_trackbar** 来实现我们想要的结果 .. code-block:: cpp 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** 的值会在滑动条滑动后被修改. * 我们所定义的 *src1*, *src2*, *dist*, *alpha*, *alpha_slider* 和 *beta* 都是全局变量, 因此也可以在回调函数中使用. 结果 ======= * 下图是程序的运行结果: .. image:: images/Adding_Trackbars_Tutorial_Result_0.jpg :alt: Adding Trackbars - Windows Linux :align: center * 也可以使用其它方式验证, 你可以用 :ref:`Basic_Linear_Transform` 中的例程实现两个滑动条. 一个控制 :math:`\alpha` 另一个控制 :math:`\beta`. 可能的输出会是下面的样子: .. image:: images/Adding_Trackbars_Tutorial_Result_1.jpg :alt: Adding Trackbars - Lena :align: center 翻译者 ================= SENWELL@ `OpenCV中文网站 `_