void setMouseCallback(const String& winname , MouseCallback onMouse,void* userdata = 0);
/*
winname: 监听窗口名字
onMouse:鼠标事件回调函数
userdata:递给回调函数可选参数
*/
typedef void (*MouseCallback)(int event,int x,int y,int flags,void* userdata);
//MouseCallback onMouse
void onMouse(int event,int x,int y,int flag,void* param)
/*
event 事件类型
x: 鼠标所造图像坐标
y:
flags:代表拖拽事件
param: 代表定义的onMouse的事件的ID
*/
enum MouseEventType
{
EVENT_MOUSEMOVE = 0, //!< 表示鼠标指针已移动到窗口上方。
EVENT_LBUTTONDOWN = 1, //!< 表示鼠标左键被按下。
EVENT_RBUTTONDOWN = 2, //!< 表示鼠标右键被按下。
EVENT_MBUTTONDOWN = 3, //!< 表示鼠标中键被按下。
EVENT_LBUTTONUP = 4, //!< 表示释放鼠标左键。
EVENT_RBUTTONUP = 5, //!< 表示释放鼠标右键。
EVENT_MBUTTONUP = 6, //!< 表示鼠标中键释放。
EVENT_LBUTTONDBLCLK = 7, //!< 表示双击鼠标左键。
EVENT_RBUTTONDBLCLK = 8, //!< 表示双击鼠标右键。
EVENT_MBUTTONDBLCLK = 9, //!< 表示双击鼠标中键。
EVENT_MOUSEWHEEL = 10,//!< 正值和负值分别表示向前和向后滚动。
EVENT_MOUSEHWHEEL = 11 //!< 正值和负值分别表示向右和向左滚动。
}
enum MouseEventFlags {
EVENT_FLAG_LBUTTON = 1, //!< 表示鼠标左键未按下。
EVENT_FLAG_RBUTTON = 2, //!<表示鼠标右键未按下。
EVENT_FLAG_MBUTTON = 4, //!< 表示鼠标中键未按下。
EVENT_FLAG_CTRLKEY = 8, //!< 表示按下“CTRL”
EVENT_FLAG_SHIFTKEY = 16,//!< 表示按下SHIFT键。
EVENT_FLAG_ALTKEY = 32 //!< 表示按下ALT键。
};
已经看了这么的函数与枚举,该写写代码了
#include
#include
#include
#include
using namespace cv;
using namespace std;
class DrawShape
{
public:
DrawShape()
:mat(imread("1.jpg")){}
void Show(string wName = "drawShape")
{
imshow(wName, mat);
}
void DrawCircle(int x = 300, int y = 300, int r = 10) //画圆函数,如果记不住自己去看看
{
circle(mat, Point(x, y), r, Scalar(0, 244, 0));
}
void DrawRecagnle(int x = 200, int y = 200, int w = 40, int h = 40) //画矩形函数
{
rectangle(mat, Rect(x, y, w, h), Scalar(25, 0, 0, 0));
}
static void OnMouse(int event, int x, int y, int flag, void* param); //鼠标
protected:
Mat mat;
};
void DrawShape::OnMouse(int event, int x, int y, int flag, void* param)
{
DrawShape* pShape = (DrawShape*)param;
switch (event)
{
case EVENT_LBUTTONDOWN:
cout << "左键按下" << endl;
pShape->DrawCircle(x,y,10);
break;
case EVENT_RBUTTONDOWN:
cout << "右键按下" << endl;
pShape->DrawRecagnle(x, y, 10, 10);
break;
}
}
int main()
{
DrawShape* pshape = new DrawShape;
//t.DrawCircle();
//t.Show();
namedWindow("drawShape");
setMouseCallback("drawShape", &DrawShape::OnMouse, pshape);
//主循环
while (1)
{
pshape->Show();
if (waitKey(10) == 27)
{
break;
}
}
delete[] pshape;
pshape = nullptr;
return 0;
}
注:2023.2.28