博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
鼠标操作[OpenCV 笔记10]
阅读量:6673 次
发布时间:2019-06-25

本文共 3135 字,大约阅读时间需要 10 分钟。

void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0)

winname

窗口名字

onMouse

指定窗口每次鼠标事件发生的时候,被调用的函数指针。函数的原型应为void Foo(int event, int x, int y, int flags, void* param)。

  • event: 变量EVENT_XXX,例如
    • EVNET_MOUSEMOVE: 鼠标移动消息
    • EVENT_LBUTTONDOWN: 鼠标左键按下消息
  • x, y: 鼠标指针在图像坐标系中的坐标值(不是窗口坐标系)
  • flags: EVENT_FLAG的组合
  • param: 用户定义的传到SetMouseCallback函数调用的参数

userdata

用户定义的传递到回调函数的参数

示例

用鼠标在画框中华矩形,MouseEvent.cxx:

#include 
#include
#define WINDOW_NAME "Painting Window"// global function declarationvoid on_MouseHandle( int event, int x, int y, int flags, void* param );void DrawRectangle( cv::Mat& img, cv::Rect box );void ShowHelpText();// global variablescv::Rect g_rectangle;bool g_bDrawingBox = false; // draw or notcv::RNG g_rng(12345);// mainint main( int argc, char** argv ){ // initialize parameters g_rectangle = cv::Rect( -1, -1, 0, 0 ); cv::Mat srcImage( 600, 800, CV_8UC3 ), tempImage; srcImage.copyTo( tempImage ); g_rectangle = cv::Rect( -1, -1, 0, 0 ); srcImage = cv::Scalar::all(0); // create window cv::namedWindow(WINDOW_NAME); // set call back function cvSetMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage); while(1) { srcImage.copyTo(tempImage); // show rectangle while the mouse moves if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle); cv::imshow(WINDOW_NAME, tempImage); if (cvWaitKey(10)==27) { cv::imwrite("result.jpg", tempImage); break; // Press ECS to exit. } } return 0;}// mouse call back functionvoid on_MouseHandle( int event, int x, int y, int flags, void* param ){ cv::Mat& image = *(cv::Mat*) param; switch (event) { case cv::EVENT_MOUSEMOVE: // if mouse moved and drawing flag is true, update the rectangle size if (g_bDrawingBox) { g_rectangle.width = x-g_rectangle.x; g_rectangle.height = y-g_rectangle.y; } break; case cv::EVENT_LBUTTONDOWN: // if left button was clicked, prepare to draw rectangle // (set the flag as true and mark the start position) { g_bDrawingBox = true; g_rectangle = cv::Rect( x, y, 0, 0 ); // mark the start point } break; case cv::EVENT_LBUTTONUP: { g_bDrawingBox = false; 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; } // draw DrawRectangle(image, g_rectangle); } break; }}// user defined function to draw rectanglevoid DrawRectangle( cv::Mat& img, cv::Rect box ){ // random color cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));}

结果图

 

转载于:https://www.cnblogs.com/Xiaoyan-Li/p/5677289.html

你可能感兴趣的文章
手把手教你启用RemoteFX以及Hyper-V GPU卸载
查看>>
《交互式程序设计 第2版》一3.10 更进一步
查看>>
英伟达发布Tesla P4&P40两款基于Pascal架构的深度学习芯片
查看>>
《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
查看>>
《代码整洁之道:程序员的职业素养》一一1.3 首先,不行损害之事
查看>>
intellij 创建java web项目(maven管理的SSH)
查看>>
spring-java项目中连接redis数据库
查看>>
UML介绍--用例图
查看>>
阿里云DTS VS MySQLdump
查看>>
为android封装的百度定位组件
查看>>
我的友情链接
查看>>
Linux系统新手学习的11点建议
查看>>
Android SDK:构建一个购物中心搜索的应用(二)-Points of Interest
查看>>
查询oracle数据库编码
查看>>
分发系统-expect-批量同步文件、批量执行命令
查看>>
activiti相关配置
查看>>
Exchange 2010邮件收发信大小限制
查看>>
js闭包浅了解
查看>>
c++中const引用传值
查看>>
【微软面试智力题】12个球,3次称量,找重量不同的那个球。
查看>>