[OpenCV3函数] —— createTrackbar

createTrackbar

头文件:opencv2/highgui/highgui.hpp

**作用:**createTrackbar是Opencv中的API,其可在显示图像的窗口中快速创建一个滑动控件,用于手动调节阈值,具有非常直观的效果。

函数原型:

CV_EXPORTS int createTrackbar(const String& trackbarname,
                                                const String& winname,
                                                int* value, 
                                                int count,                     
                                                TrackbarCallback onChange = 0void* userdata = 0);     
  • 参数1 trackbarname:滑动条轨迹名

  • 参数2 winname:滑动条依附的窗口名

  • 参数3 value:滑块的位置,创建时,滑块初始位置就是这个变量当前的值

  • 参数4 count:轨迹的最大值

  • 参数5 onChange:回调函数

  • 参数6 userdata:默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值.

如果使用第6个参数,则作为参数传给回调函数的usrdata

回调函数TrackbarCallback转定义如下

typedef void (*TrackbarCallback)(int pos, void* userdata);
  • 参数1 pos:其中第一个参数是跟踪栏位置

  • 参数2 userdata:第二个参数是用户数据,如果回调函数是NULL指针,则不会调用回调函数,而只会更新值(比如窗口中的图像数据地址)

    TrackbarCallback)为函数void (int pos,void userdata)的别名

#include
#include
using namespace std;

int g_slider_position = 0;	//滑动条起始位置
cv::VideoCapture g_cap;	//视频
int g_run = 1, g_dontset = 0;	//以单步模式启动
void onTrackbarSlide(int pos, void *) {
	g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);	//视频流第几帧
	if (!g_dontset)g_run = 1;	//当点击滚动条时,将g_dontset设为0,然后setTrackbarPos进入后,便会将run赋值为0
	g_dontset = 0;	//滚动条有点击
}
int main() {
	cv::namedWindow("Example2_4", 1);
	g_cap.open("C:/Users/Administrator/Desktop/test.avi");
	assert(g_cap.isOpened());
	int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);	//获取帧数
	int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
	int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
	cout << "video has" << frames << " frames of dimensions("
		<< tmpw << ", " << tmph << ")." << endl;
	//创建一个滚动条
	cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames, onTrackbarSlide);
	cv::Mat frame;
	for (;;) {
		if (g_run != 0) {
			g_cap >> frame;
			if (frame.empty())break;
			int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);	//获取当前帧数
			g_dontset = 1;	//滚动条没有点击
			cv::setTrackbarPos("Position", "Example2_4", current_pos);	//设置滚动条位置
			cv::imshow("Example2_4", frame);
			g_run -= 1;
		}
		char c = (char)cv::waitKey(10);
		if (c == 's') {
			g_run = 1;
			cout << "单步" << endl;
		}
		if (c == 'r') {
			g_run = -1;
			cout << "连续" << endl;
		}
		if (c == 27)break;	//如果键入的是esc则退出
	}
}

你可能感兴趣的:(OpenCV,opencv,计算机视觉)