opencv中trackbar后的js回调函数的作用有什么作用

OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能。
int createTrackerbar(const string& trackerbarname, const string winame, int* value, int count, TrackbarCallback onChange=0, void* userdata=0);
trackbarname
轨迹条的名字。
窗口的名字,轨迹条会依附在这个窗口上。
一个指向整型的指针,表示滑块的位置,在创建时,滑块的初始位置就是该变量当前的值。
滑块可以达到的最大位置的值。滑块最小位置的值始终为0。
指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(本函数中参数userdata)。如果回调函数是NULL指针,则表示没有回调函数的调用,仅参数value有变化。
用户传给回调函数的数据,用来处理轨迹条事件。如果使用的value实参是全局变量,可以不去管userdata参数。
int getTrackbarPos(const string& trackbarname, const string& winname );
trackbarname
轨迹条的名字
轨迹条的父窗口的名称
下面的代码将wuli男神和wuli女神的图片混合在一起,输入图片如下:
wuliEddie1.jpg
wuliShishi.jpg
MixAlphaImages.cxx
#include &opencv2/opencv.hpp&
#include &opencv2/highgui/highgui.hpp&
#define WINDOW_NAME "Mixed Images"
// global variables
const int g_nMaxAlphaValue = 100; // maximun alpha value
int g_nAlphaValueS // value from trackbar
double g_dAlphaV
double g_dBetaV
// Mat objects for images
cv::Mat g_srcImage1;
cv::Mat g_srcImage2;
cv::Mat g_dstI
// on trackbar
void on_Trackbar( int, void* )
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaV
g_dBetaValue = (1.0-g_dAlphaValue);
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
cv::imshow(WINDOW_NAME, g_dstImage);
int main( int argc, char** argv )
// load image and show
g_srcImage1 = cv::imread("wuliEddie1.jpg");
g_srcImage2 = cv::imread("wuliShishi1.jpg");
// NOTE: two image should be the same size
if(!g_srcImage1.data)
printf("Error getting the first images. Put the image wuliEddie1.jpeg to Debug folder. \n");
return -1;
if(!g_srcImage1.data)
printf("Error getting the second images. Put the image wuliShishi1.jpeg to Debug folder. \n");
return -1;
// initialize trackbar value
g_nAlphaValueSlider = 70;
// create window
cv::namedWindow(WINDOW_NAME, 1);
// create trackbar
char TrackbarName[50];
sprintf( TrackbarName, "Alpha Value %d", g_nMaxAlphaValue );
cv::createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
// to show the initial image
on_Trackbar(g_nAlphaValueSlider, 0);
cv::waitKey(0);
阅读(...) 评论()createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便。首先大家要记住,它往往会和一个回调函数配合起来使用。先看下他的函数原型:
第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是是由该变量当前的值。第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
这个createTrackbar函数,为我们创建一个具有特定名称和范围的轨迹条(Trackbar,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量。而且要指定回调函数onChange(第五个参数),在轨迹条位置改变的时候来调用这个回调函数。并且我们知道,创建的轨迹条显示在指定的winname(第二个参数)所代表的窗口上。
看完函数讲解,先给大家一个函数使用小示例:
利用opencv &trackbar 实现的简单播放器
#include &opencv2/core/core.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/video/video.hpp&
#include &iostream&
/************************************************************************
* Copyright(c) 2011
* All rights reserved.
* File: MOGExtractForeground.cpp
* Brief: 基于混合高斯模型的前景检测
* Version: 1.0
* Author: Yang Xian
* Email: xyang2011@
* History:
************************************************************************/
#include &opencv2/core/core.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/video/video.hpp&
#include &iostream&
int slider_
int slider_
void on_tracker(int ,void *);
int main()
capture = VideoCapture(&(1-2).握拍.wmv&);
if (!capture.isOpened())
slider_max=capture.get(CV_CAP_PROP_FRAME_COUNT);
namedWindow(&player&);
createTrackbar(&进度&, &player&, &slider_now, slider_max, on_tracker);
if(frame.data)
if (slider_now==slider_max-1)
createTrackbar(&进度&, &player&, &slider_max-1, slider_max, on_tracker);
imshow(&player&,frame);
waitKey(0);
on_tracker(slider_now,0);
slider_now++;
createTrackbar(&进度&, &player&, &slider_now, slider_max, on_tracker);
on_tracker(slider_now,0);
imshow(&player&,frame);
if(waitKey(10)&=10)
return 0 ;
void on_tracker(int ,void *)
capture.set(CV_CAP_PROP_POS_FRAMES,slider_now);
int slider_
int slider_
void on_tracker(int ,void *);
int main()
capture = VideoCapture(&(1-2).握拍.wmv&);
if (!capture.isOpened())
slider_max=capture.get(CV_CAP_PROP_FRAME_COUNT);
& & namedWindow(&player&);
& & createTrackbar(&进度&, &player&, &slider_now, slider_max, on_tracker);
if(frame.data)
if (slider_now==slider_max-1)
& & & & & & & & & createTrackbar(&进度&, &player&, &slider_max-1, slider_max, on_tracker);
&imshow(&player&,frame);
&waitKey(0);
&on_tracker(slider_now,0);
slider_now++;
createTrackbar(&进度&, &player&, &slider_now, slider_max, on_tracker);
on_tracker(slider_now,0);
imshow(&player&,frame);
if(waitKey(10)&=10)
return 0 ;
void on_tracker(int ,void *)
& & &capture.set(CV_CAP_PROP_POS_FRAMES,slider_now);
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便。首先大家要记住,它往往会和一个回调函数配合起来使用。先看下他的函数原型:
第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是是由该变量当前的值。第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
这个createTrackbar函数,为我们创建一个具有特定名称和范围的轨迹条(Trackbar,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量。而且要指定回调函数onChange(第五个参数),在轨迹条位置改变的时候来调用这个回调函数。并且我们知道,创建的轨迹条显示在指定的winname(第二个参数)所代表的窗口上。
看完函数讲解,先给大家一个函数使用小示例:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8112次
排名:千里之外
转载:10篇
(1)(2)(1)(1)(2)(2)(2)(2)(2)(2)5341人阅读
OpenCV(5)
int cvCreateTrackbar(
const char* trackbar_name, //滑动条的名称
const char* window_name, //窗口的名称,滑动条不会遮挡图像
int* value, //当滑动条被拖到时,OpenCV会自动将当前位置所代表的值传给指针指向的整数
int count, //滑动条所能达到的最大值
CvTrackbarCallback on_change //可选的回调函数,回调函数可参见http://wapedia.mobi/zhtrad/回调函数
其中openCV的highgui库提供了两个函数来读取和设置滚动条的value值
//读取value值
int cvGetTrackbarPos(
const char* trackbar_name,
cosnt char* window_name
//设置value值
void cvSetTrackbarPos(
const char* trackbar_name,
const char* window_name,
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:232088次
积分:3149
积分:3149
排名:第10676名
原创:69篇
转载:65篇
评论:26条
(3)(2)(1)(1)(1)(3)(1)(3)(3)(2)(6)(5)(7)(1)(2)(2)(1)(2)(1)(2)(1)(6)(9)(3)(5)(14)(12)(1)(2)(1)(5)(15)(1)(2)(4)(3)(1)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
《学习OpenCV》第4章 细说HighGUI.pptx 56页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:350 &&
你可能关注的文档:
··········
··········
第4章细说HighGUI本章各小节目录一个可移植的图形工具包创建窗口载入图像显示图像视频的处理ConvertImage函数练习一个可移植的图形工具包OpenCV将与操作系统、文件系统和摄像机之类的硬件进行交互的一些函数纳入HighGUI(high-levelgraphicaluserinterface)库中。有了HighGUI,我们可以方便地打开窗口、显示图像、读出或者写入图像相关的文件(包含图像与视频)、处理简单的鼠标、光标和键盘事件。我们也可以使用HighGUI创建其他一些很有用的空间,比如滑动条,并把它们加入窗口。如果对自己所使用的系统的图形用户界面非常熟悉,也许会认为HighGUI提供的很多功能是没有必要的,但即使如此,HighGUI的跨平台性对你也会有很大帮助。我们最初的观点是,OpenCV中的HighGUI可以分为3个部分:硬件相关部分、文件部分以及图形用户界面部分。在仔细研究HighGUI之前,我们先用一些时间分别浏览一下每部分的内容。硬件部分最主要的就是对于摄像机的操作,在大多操作系统下,与摄像机交互是一件很复杂并且很痛苦的工作。HighGUI提供了一种从摄像机中获取图像的简单方法,所有繁琐的工作都在HighGUI内部完成了,这让我们很开心。文件系统部分的主要工作就是载入与保存图像文件。HighGUI一个很好的特点就是可以用与读取摄像机视频相同的方法读入视频文件。这使得我们可以省去处理从各种特定设备中读入数据的麻烦,而专心于我们感兴趣的代码部分。同样地,HighGUI为我们提供了一对函数来读入与保存图像,这两个函数根据文件名的后缀,自动处理所有编码和解码工作。HighGUI的第三部分是窗口系统(或者称为GUI)。HighGUI提供了一些简单的函数用来打开窗口以及将图像显示在窗口中。它同时给我们提供了为窗口加入鼠标、键盘响应的方法。这些函数为我们快速建立一个简单的应用程序提供了很大的帮助。一种变通的方法,我们可以用滑动条实现切换功能。我们发现使用HighGUI可以实现很多实用的程序。在本章后面的具体讲解中,我们不会对HighGUI的三个部分分别介绍;而是通过实现一些功能来讲解HighGUI。在这种方式下,你会以最快的速度了解到如何使用HighGUI。创建窗口首先,我们要做的是利用HighGUI将一幅图像显示到屏幕上。我们使用cvNameWindow()来实现这个功能。这个函数接受两个参数,第一个参数用来表示新窗口的名称,这个名称显示在窗口的顶部,同时用作HighGUI中其他函数调用窗口的句柄。第二个参数是一个标志,用来表示是否需要使窗口大小自动适应读入的图像大小。下面是这个函数的定义:intcvNamedWindow(constchar*name,intflags=CV_WINDOW_AUTOSIZE);需要留意的是参数flags,到目前为止,唯一有效的设置是0或者保持默认设置CV_WINDOW_AUTOSIZE。如果使用CV_WINDOW_AUTOSIZE,HighGUI会根据图像的大小调整窗口大小。这样,窗口大小会随着图像的载入而根据图像大小调整,用户没办法手动调整窗口大小。当然,如果不想窗口大小自动调整,也可以将参数值设置为0,这样的话,用户就可以随意调整窗口的大小了。当窗口被创建以后,我们通常是想加入一些东西到里面。不要着急,在做这些事情之前,我们先看看当不需要这些窗口时,如何释放它们。为了释放窗口,我们需要使用cvDestroryWindow(),这个函数接收一个字符串参数,这个字符串是窗口创建时所指定的名字。在OpenCV中,窗口根据名称来引用(操作系统独立的)而不是一些“不友好”的句柄。句柄与窗口名称之间的转换都由HighGUI在后台处理,我们不用为这些问题操心。话虽如此,还是有些人担心HighGUI内部的处理,那没关系。HighGUI提供了以下函数:void*cvGetWindowHandle(constchar*name);constchar*cvGetWindowName(void*window_handle);这些函数允许我们在OpenCV所使用的窗口名称与各个窗口系统所使用的窗口句柄之间进行转换。HighGUI提供了cvResizeWindow()用来调整窗口的大小:voidcvResizeWindow(constchar*name,intwidth,intheight);这里在宽度与高度是以像素为单位的,指定了窗口中可以显示部分(这部分的大小可能才是真正关心的)的大小。载入图像为了在窗口中显示图像,我们需要了解如何从磁盘中载入图像。OpenCV为我们提供了cvLoadImage(),如下所示:IplImage*cvLoadImage(constchar*filename,intiscol
正在加载中,请稍后...2078人阅读
OpenCV学习(5)
在以前的几个例子里面,我们并没有实现与计算机的交互。在OpenCV中,我们可以使用TrackBar来进行交互,调整一些参数的大小。这篇文章主要介绍了如何使用TrackBar。
举一个均值滤波blur的例子。我们已经知道,卷积核影响了均值滤波的效果。卷积核越大,图像的模糊化越严重。我们可以使用TrackBar动态地调整卷积核的大小,这样可以使得实验效果更加直观。
首先,来看一下参考手册中的描述。我们可以使用createTrackbar函数来创建一个TrackBar。这个函数的原型如下:
其中,参数的意义为:
int createTrackbar (const string& trackbarName,const string& winName,
int *value,int count,
TrackbarCallback onChange=0,void *userdata=0);
trackbarName为创建的TrackBar的名字,
winName为创建的TrackBar所依附的窗体名字,
*value指针指向的是TrackBar当前的值,可以通过设置它改变游标的位置,
count为TrackBar的量程,注意一般情况下bar的最小值都是0,
TrackbarCallback为一个函数指针,这个函数必须有下面的原型:
void onChangeTrackbar(int ,void* );
其中第一个参数是trackerbar的值,第二个参数是一个无类型的指针,指向userdata(参数的意义见下面)这个函数作为回调函数,在TrackBar的值发生改变的时候被调用。如果这个参数被传进去一个空指针NULL,那么当TrackBar值发生改变的时候什么也不做。
userdata是指向我们想传给回调函数onChangeTrackbar的数据的一个指针。有了这个指针,我们可以不用设置太多的全局变量。在回调函数中,需要将这个指针强制类型转换为我们的实际数据类型指针,然后用*运算符取出数据。
下面就是例程:
#include &iostream&
#include &opencv/cv.hpp&
#include &opencv2/core/core.hpp&
#include &opencv2/highgui/highgui.hpp&
//定义了窗体名
string winName=&Blur Filter&;
//TrackBar发生改变的回调函数
void onChangeTrackBar(int poi,void* usrdata);
int main ()
//trackbar名
string trackBarName=&Size&;
//图像文件名
string imgName=&image.tif&;
//trackbar的值
int poiTrackBar=0;
//trackbar的最大值
int maxValue=35;
img=imread (imgName,CV_LOAD_IMAGE_COLOR);
//读入图像
namedWindow(winName);
//新建窗口
imshow (winName,img);
//创建trackbar,我们把img作为数据传进回调函数中
createTrackbar (trackBarName,winName,&poiTrackBar,maxValue,
onChangeTrackBar ,&img);
waitKey ();
//回调函数
void onChangeTrackBar (int poi,void* usrdata)
Mat img=*(Mat*)(usrdata);
//强制类型转换
if (poi%2==0)
//poi是偶数,把它减1变为奇数
if (poi&0)
//poi是奇数
//改变矩阵核
Size blurSize=Size(poi,poi);
blur (img,dst,blurSize);
imshow (winName,dst);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:65747次
排名:千里之外
原创:29篇
评论:12条
(1)(3)(1)(2)(2)(5)(1)(1)(1)(4)(1)(1)(1)(1)(1)(1)(6)

我要回帖

更多关于 opencv 鼠标回调函数 的文章

 

随机推荐