(12条消息) 基于OpencvSharp实现的setMouseBack

    • 背景

    • SetMouseCallback

    • CvMouseCallback

    • 代码实现

    • 参考文档

背景

由于是使用C#编写程序界面,因此选择了Opencvsharp作为opencv替代品。最近需要使用鼠标画图功能,了解到opencv自带的setMouseBack函数具备相应功能,通过上网查找相应代码,发现大部分都是基于Python和C++的,没有基于C#的现成代码,所以在C++代码基础上进行改写,分享出基于OPencvSharp的SetMouseBack实现代码。

SetMouseCallback

函数原型SetMouseCallback:
void SetMouseCallback(string windowName, CvMouseCallback onMouse, IntPtr userdata = default);
参数:
// windowName:
// 窗口名称,即使用该函数之前需通过Cv2.ImShow()函数打开一个图像显示窗口,并命名。
//
// onMouse:
// 相应函数,一旦在图片上捕捉到任何鼠标事件,就调用该函数。可以在此函数内实现具体功能,如鼠标画线,画圆等。
//
// userdata:传给onMouse的用户数据。

CvMouseCallback

函数原型CvMouseCallback:
void CvMouseCallback(MouseEvent @event, int x, int y, MouseEvent flags, IntPtr userdata);
// 参数:
// event:
// 鼠标事件,如左键落下,移动等。
//
// x:
// x-coordinates of mouse pointer in image coordinates
//
// y:
// y-coordinates of mouse pointer in image coordinates
//
// flags:
// 也是鼠标事件,与event配合工作,具体可看代码。
//
// userdata:与上面userdata一致。

代码实现

SetMouseBack()实现鼠标画直线功能

Cv2.ImShow("窗口", image);Cv2.SetMouseCallback("窗口", MyMouseCallback);public OpenCvSharp.Point lineP1;public  void MyMouseCallback(MouseEvent me01, int x, int y, MouseEvent me02,IntPtr Data){if (me01 == MouseEvent.LButtonDown){//Console.WriteLine("X: " + x.ToString() + " ; Y: " + y.ToString());lineP1 = new OpenCvSharp.Point(x, y);}else if (me01 == MouseEvent.MouseMove && (me02 == MouseEvent.FlagLButton)){OpenCvSharp.Point tmpp2 = new OpenCvSharp.Point(x, y);Cv2.Line(image, lineP1, tmpp2, Scalar.Black, 2);//lineP1 = tmpp2;Cv2.ImShow("窗口", image);}}

参考文档

Opencv之鼠标响应setMouseCallback()的用法
非托管代码调用托管应用程序的委托
关于opencv2中鼠标响应操作
how to use SetMouseCallback? question #681

(0)

相关推荐