版权声明:本文为博主原创文章,未经博主允许不得转载。
网上有很多关于setMouseCallback的参数列表和使用方法,但是都是借助全局变量来使用的。并且有人说函数形参没有用。这里使用了opencv的两个参数来实现函数形参的数据传递。
OpenCV中的鼠标响应的函数是setMouseCallback(),可以实现画图的功能。
c++: void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0)
- winname:窗口的名字
- onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标时间发生的时候,被调用的函数指针。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* param);
- userdate:传给回调函数的参数
void on_Mouse(int event, int x, int y, int flags, void* param);
- event是 CV_EVENT_*变量之一
- x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系)
- flags是CV_EVENT_FLAG的组合,
- param是用户定义的传递到setMouseCallback函数调用的参数。
我的理解是param和userdata是相互赋值的,是沟通setMousecallback和on_Mouse的桥梁,不过需要注意的是,这个桥梁是一个viod类型的指针,所以在on_Mouse中需要强制类型转换一下。下面是我使用它传递字符串的一个例子。
#include<opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;void leftClick(int event, int x, int y, int flag, void* param)
{
if (event != EVENT_LBUTTONDOWN)
{
return;
}string * ptr =(string *) param;
cout << *ptr;
*ptr = "textFromCallback";
}int main()
{
string p_click ="textFromMain";//最好加static, 避免有时数据赋值后被释放
cout << p_click;
//读取图片
const char* imagename = "C:/Capture001.png";
Mat img = cv::imread(imagename);
if (img.empty())
{
fprintf(stderr,"Can not load image %s\n",imagename);
}
if (!img.data)
//显示窗口
namedWindow("image");//不能省略,否则setMouseCallback不运行
imshow("image",img);
waitKey(30);
setMouseCallback("image", leftClick, &p_click);
waitKey();}
附event:
#defineCV_EVENT_MOUSEMOVE 0
#defineCV_EVENT_LBUTTONDOWN 1
#defineCV_EVENT_RBUTTONDOWN 2
#defineCV_EVENT_MBUTTONDOWN 3
#defineCV_EVENT_LBUTTONUP 4
#defineCV_EVENT_RBUTTONUP 5
#defineCV_EVENT_MBUTTONUP 6
#defineCV_EVENT_LBUTTONDBLCLK 7
#defineCV_EVENT_RBUTTONDBLCLK 8
#defineCV_EVENT_MBUTTONDBLCLK 9
#defineCV_EVENT_FLAG_LBUTTON 1
#defineCV_EVENT_FLAG_RBUTTON 2
#defineCV_EVENT_FLAG_MBUTTON 4
#defineCV_EVENT_FLAG_CTRLKEY 8
#defineCV_EVENT_FLAG_SHIFTKEY 16
#defineCV_EVENT_FLAG_ALTKEY 32
opencv 鼠标操作 setMouseCallback
最新推荐文章于 2023-12-04 01:35:57 发布