美文网首页
三 (HighGUI 模块)

三 (HighGUI 模块)

作者: 交大小丑 | 来源:发表于2018-11-06 17:19 被阅读0次

为程序界面添加滑动条 — OpenCV 2.3.2 documentation http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/highgui/trackbar/trackbar.html#adding-trackbars


createTrackbar函数讲解:

CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

  • 形式参数一、trackbarname:滑动空间的名称;
  • 形式参数二、winname:滑动空间用于依附的图像窗口的名称;
  • 形式参数三、value:初始化阈值;
  • 形式参数四、count:滑动控件的刻度范围;
  • 形式参数五、TrackbarCallback是回调函数,其定义如下:
typedef void (CV_CDECL *TrackbarCallback)(int pos, void* userdata);
注意问题:

参数五 TrackbarCallback 函数的形式是固定的,参数的类型个数是固定,不能的修改的。没有实现自定义回调函数的功能。


使用实例

单文件结果写法:

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

多文件结果写法:

test.h

void useTractbar();

test.cpp

#include <cv.h>
#include <highgui.h>

using namespace cv;

// createTrackbar 使用
/**
 * @function on_trackbar
 * @定义响应滑动条的回调函数
 */
void on_trackbar(int alpha_slider, void*)
{
    /// 声明存储图像的变量
    Mat src1;
    Mat src2;
    /// 加载图像 (两图像的大小与类型要相同)
    /// Read image ( same size, same type )
    src1 = imread("test.jpg");
    resize(src1, src1, Size(1000, 750));
    src2 = imread("test2.jpg");
    resize(src2, src2, Size(1000, 750));
    if (!src1.data) { printf("Error loading src1 \n"); }
    if (!src2.data) { printf("Error loading src2 \n"); }
    Mat dst;
    double alpha;
    int alpha_slider_max = 100;
    alpha = (double)alpha_slider / alpha_slider_max;
    double beta; beta = (1.0 - alpha);
    addWeighted(src1, alpha, src2, beta, 0.0, dst);
    imshow("Linear Blend", dst);
}

void useTractbar() {
    int alpha_slider = 0;
    int alpha_slider_max = 100;
    /// 创建窗体
    namedWindow("Linear Blend", 1);
    /// 在创建的窗体中创建一个滑动条控件
    char TrackbarName[50] = "滑动杆";
    createTrackbar(TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar);
    /// 结果在回调函数中显示
    on_trackbar(alpha_slider, 0);
    /// 按任意键退出
    waitKey(0);
}

main.cpp

#include "pch.h"   
#include <iostream>    
#include"test1.h"

using namespace std;

int main() {
    useTractbar();
    return 0;
}

OpenCV学习笔记(十)——图形交互和媒体接口HighGUI - 迭代的是人,递归的是神 - CSDN博客 https://blog.csdn.net/yang_xian521/article/details/6900901

相关文章

网友评论

      本文标题:三 (HighGUI 模块)

      本文链接:https://www.haomeiwen.com/subject/uvmjtqtx.html