《OpenCV3编程入门》第3章-学习笔记3-SetMouseCallback-鼠标操作

举报
王博Kings 发表于 2020/12/29 23:31:41 2020/12/29
3.2k+ 0 0
【摘要】 void setMouseCallback(conststring& winname, MouseCallback onMouse,void* userdata=0) 第一个参数:窗口名 第二个参数:被调用的函数指针。                      函数原型:void Foo(int event,int x,int y,int flags, voi...
void setMouseCallback(conststring& winname, MouseCallback onMouse,void* userdata=0)
 

第一个参数:窗口名

第二个参数:被调用的函数指针。

                     函数原型:void Foo(int event,int x,int y,int flags, void *param)

第三个参数:用户 定义的传递到回调函数的参数,默认0

第二个参数可能不很理解,其实第二个参数最关键:它是我们对鼠标操作的反应,当鼠标有哪些操作,我们可以出现不同的响应。 如果我们没有设定这些操作,那么就不会有反应

举例:设定了单击左键就跳出窗口,设定单击右键无任何操作。那么程序就会根据你的指令进行选择。


      //----------------【】-----------------------
      //
      //-------------------------------------------
      //----------------【头文件、命名空间包含范围】-----------------------
      // 包含的命名空间和头文件
      //---------------------------------------------------------------
      #include<opencv2\opencv.hpp>
      using namespace cv;
      #define WINDOW_NAME "【程序窗口】" //为窗口标题定义宏
      //----------------【全局函数声明】-----------------------
      // 提示帮助ShowHlepText
      //-------------------------------------------
      void on_MouseHandle(int event, int x, int y ,int flags, void* param);
      void DrawRectangle(cv::Mat& img, cv::Rect box);
      void ShowHlepText();
      //----------------【全局变量声明的部分】-----------------------
      //
      //-------------------------------------------
      Rect g_rectangle;//长方形
      bool g_bDrawingBox = false;//是否进行绘制
      RNG g_rng(12345);
      //----------------【main()函数】-----------------------
      //
      //-------------------------------------------
      int main()
      {
     	//【1】准备参数
      	g_rectangle = Rect(-1,-1,0,0);
     	Mat srcImage(600, 800, CV_8UC3), tempImage;//生成一个600x800的窗口
      	srcImage.copyTo(tempImage);
      	g_rectangle = Rect(-1, -1, 0, 0);
      	srcImage = Scalar::all(0);
     	//【2】设置鼠标回调函数
      	namedWindow(WINDOW_NAME);
      	setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//为指定窗口设定回调函数,也就是自己设定判断鼠标操作
     	//【3】程序的主循环,当绘制标识符为真,进行绘制
     	while (1)
      	{
      		srcImage.copyTo(tempImage); //复制到临时变量
     		if (g_bDrawingBox) //标识符为真,就绘制
      			DrawRectangle(tempImage, g_rectangle);
      		imshow(WINDOW_NAME, tempImage);
     		if (waitKey(10) == 27) break; //按下Esc键,程序退出
      	}
     	return 0;
      }
      //----------------【on_MouseHandle()函数】-----------------------
      // 记录鼠标的信息,比如鼠标移动、左键按键
      //-------------------------------------------
      void on_MouseHandle(int event, int x, int y, int flags, void* param)
      {
      	Mat& image = *(cv::Mat*) param;
     	switch (event)
      	{
     		//鼠标移动
     		case EVENT_MOUSEMOVE:
      		{
      if (g_bDrawingBox)
       {
       g_rectangle.width = x - g_rectangle.x;
       g_rectangle.height = y - g_rectangle.y;
       }
      		}
      break;
     		//左键按下消息
     		case EVENT_LBUTTONDOWN:
      		{
       g_bDrawingBox = true;
       g_rectangle = Rect(x, y, 0, 0);//记录起始点
      		}
     			break;
     		//左键抬起消息
     		case EVENT_LBUTTONUP:
      		{
       g_bDrawingBox = false;
      //对宽、高小于0如何处理
      if (g_rectangle.width < 0)
       {
       g_rectangle.x + g_rectangle.width;
       g_rectangle.width *= -1;
       }
      if (g_rectangle.height < 0)
       {
       g_rectangle.y += g_rectangle.height;
       g_rectangle.height *= -1;
       }
      //调用函数绘制
       DrawRectangle(image, g_rectangle);
      		}
     			break;
      	}
      }
      //----------------【DrawRectangle()函数】-----------------------
      //
      //-------------------------------------------
      void DrawRectangle(cv::Mat& img, cv::Rect box)
      {
      	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色,(左上角+右下角顶点)
      }
  
 

文章来源: kings.blog.csdn.net,作者:人工智能博士,版权归原作者所有,如需转载,请联系作者。

原文链接:kings.blog.csdn.net/article/details/83903908

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。