毛星云的《opencv3编程入门》中经常使用滑动条Trackbar来调节参数,是一个很好的实用工具,可以达到替代按钮的作用。
创建滑动条:creatTrackbar()函数
creatTrackbar()函数可以创建一个滑动条,并将滑动条放置在指定的窗口上,它往往配合一个回调函数一起使用,函数原型如下:
int createTrackbar(const string& trackname, const string& winname, int *value, int count, TrackbarCallback onChange=0, void *userdata=0)
Trackname是创建的滑动条的名字,winname是放置滑动条的窗口名称,value是一个指向整型的指针,表示滑块所处的位置,count是滑块能达到的最大位置,滑块的最小位置始终为0,onChange是TrackbarCallback类型的指向回调函数的指针,每次滑块位置改变就会调用回调函数,且这个回调函数的原型必须是void XXXX(int, void*)userdata是用户传给回调函数的数据,如果value实参是全局变量的话,则不用管这个参数。
回调函数
所谓回调函数就是通过函数指针调用的函数,如果我们将函数的地址作为参数传递给另一个函数,则当这个指针被用来调用其所指向的函数时,就称为回调函数。需要注意的是:回调函数不是由该函数的实现方直接调用,而是在特定的事件触发的时候由另一方调用。
代码示例(基于C++)
#include "stdafx.h"
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
using namespace std;
using namespace cv;
# define WINDOW_NAME "滑动条的创建及使用"
//全局变量的声明
const int g_MaxSliderValue = 100;
int g_SliderValue;
double g_Alpha;
double g_Beta;
Mat img1;
Mat img2;
Mat dstImg;
void on_Track(int, void*)
{
g_Alpha = (double)g_SliderValue / g_MaxSliderValue;
g_Beta = 1.0 - g_Alpha;
addWeighted(img1, g_Alpha, img2, g_Beta, 0.0, dstImg);
imshow(WINDOW_NAME, dstImg);
}
int _tmain(int argc, _TCHAR* argv[])
{
img1 = imread("1.jpg");
img2 = imread("2.jpg");
//设置初始滑动条位置
g_SliderValue = 20;
// 创建窗口
namedWindow(WINDOW_NAME);
char TrackName[50];
sprintf(TrackName, "透明度:%d", g_MaxSliderValue);
// 创建滑动条
createTrackbar(TrackName, WINDOW_NAME, &g_SliderValue, g_MaxSliderValue, on_Track);
// 结果在回调函数中显示
on_Track(g_SliderValue, 0);
waitKey(0);
return 0;
}
代码示例(基于Python)
# coding=UTF-8
import numpy as np
import cv2
trackname = 'transparency'
winname = 'result'
g_MaxSlider = 100
g_SlierValue = 60
def on_Track(arg):
'''
:param arg:
:return:
'''
# Python中必须加入getTrackbarsPos()函数来获取滑动块的位置
g_SlierValue = cv2.getTrackbarPos(trackname, winname)
g_Alpha = float(g_SlierValue) / g_MaxSlider
g_Beta = 1.0 - g_Alpha
dstImg = cv2.addWeighted(img1, g_Alpha, img2, g_Beta, 0.0)
cv2.imshow(winname, dstImg)
if __name__ =='__main__':
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('2.jpg')
# 创建窗口
cv2.namedWindow(winname)
# 创建滑动条
cv2.createTrackbar(trackname, winname, g_SlierValue, g_MaxSlider, on_Track)
# 将结果显示在回调函数中显示
on_Track(g_SlierValue)
cv2.waitKey(0)