1.目的

读取一张图片,在该图片上截取一个ROI区域,将截取的图像在新窗口显示,并可以保存至工程目录下。

2.实现环境

C++、VS2017、opencv

3.回调函数原理

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。(来自百度百科)

4.实现代码

#include <opencv2/opencv.hpp>
#include <Windows.h>using namespace cv;#define WINDOW "程序窗口"void on_MouseHandle(int event, int x, int y, int flags, void*param);
void DrawRectangle(Mat& _img, Rect& _box);
void shotScreen(Mat& _img);Rect g_rectangle;//截图位置信息
bool g_drawingBox = false;//绘图标识
Mat srcROI;//截图int main()
{g_rectangle = Rect(-1, -1, 0, 0);Mat srcImg, tempImg;srcImg = imread("../Leana.png");//读取图片srcImg.copyTo(tempImg);namedWindow(WINDOW);//定义一个窗口setMouseCallback(WINDOW, on_MouseHandle, (void*)&srcImg);//对WINDOW窗口进行鼠标检测//不断更新while (1){srcImg.copyTo(tempImg);if (g_drawingBox)DrawRectangle(tempImg, g_rectangle);//画出矩形g_rectangleimshow(WINDOW, tempImg);if (waitKey(10) == 27)//按下esc结束break;}return 0;
}//@event:鼠标事件标志(不需要自己传参)
//@x:鼠标在窗口中的x坐标
//@y:鼠标在窗口中的y坐标
//@flags:自定义的宏,做标记符,Ture时开始绘制矩形,false时不绘制
//@* param:传入的图像
void on_MouseHandle(int event, int x, int y, int flags, void*param)
{Mat& img = *(Mat*)param;switch (event)//检测鼠标事件{case EVENT_MOUSEMOVE://鼠标移动事件{if (g_drawingBox)//如果鼠标左键按下,则计算当前位置g_rectangle的宽高{g_rectangle.width = x - g_rectangle.x;g_rectangle.height = y - g_rectangle.y;}}break;case EVENT_LBUTTONDOWN://鼠标左键按下事件{g_drawingBox = true;//将绘图标识设为真,准备绘图g_rectangle = Rect(x, y, 0, 0);//保存起点}break;case EVENT_LBUTTONUP://鼠标左键抬起事件{g_drawingBox = 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);}//若截图区域面积为0,则不进行截图if (g_rectangle.width != 0 || g_rectangle.height != 0){srcROI = img(g_rectangle);shotScreen(srcROI);}}break;}
}void DrawRectangle(Mat& _img, Rect& _box)
{rectangle(_img, _box.tl(), _box.br(), Scalar(0, 0, 255));
}//@_img:截取的图片
void shotScreen(Mat& _img)
{imshow("截图", _img);UINT ret = MessageBox(NULL, "是否保存当前截图", "提示", MB_YESNO);if (ret == IDYES)imwrite("../截图.png", _img);elsedestroyWindow("截图");
}

完整项目链接

Opencv鼠标回调函数相关推荐

  1. Python Opencv 实现鼠标事件(包含一个练习)——事件触发讲解·以及鼠标回调函数的实现

    文章目录 鼠标事件概述 鼠标事件发生的结构 鼠标回调函数的标准格式 opencv下包含的所有事件--包含flag和event(可以看一下,熟悉常见事件范围) 鼠标事件的实现函数 一个完整的鼠标事件由一 ...

  2. 【opencv系列05】OpenCV4.X鼠标回调函数

    点击上方"AI搞事情"关注我们 一.回调函数 setMouseCallback(windowName, onMouse, param=None) windowName:窗口名称 o ...

  3. OpenCV:回调函数

    我们创建了一个trackbar,如下: createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackB ...

  4. OPENCV回调函数

    OPENCV回调函数 回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...

  5. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  6. opencv画框显示python_python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框...

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  7. Python,OpenCV鼠标事件进行矩形、圆形的绘制(随机颜色、随机半径)

    Python,OpenCV鼠标事件进行矩形.圆形的绘制(随机颜色.随机半径) 1. 效果图 2. 源码 参考 这篇博客将介绍鼠标事件,并介绍鼠标事件矩形.圆形的绘制: 所有的鼠标事件(左键按下.左键释 ...

  8. opencv鼠标操作,画矩形

    opencv鼠标操作,画矩形 效果图 主要两个函数在作用 //-------------------全局函数声明部分------------------------- //描述:全局函数的声明 //- ...

  9. [548]OpenCV之cv2函数

    1.主要函数 1. cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片,包括 cv2.IMREAD_COLOR:读入一副彩色图片:cv2.IMRE ...

最新文章

  1. 从人工“智障”到人工智能,AI交互还缺什么?
  2. 编写python高质量python代码的59个有效方法
  3. Spring中的事件机制
  4. 结尾的单词_22个以“ez”结尾的西语单词,你掌握了吗?
  5. Android实现分享代码,Android 分享功能的实现代码
  6. 狮子鱼社区团购独立版V15.3.0源码
  7. mysqlinsert触发器的创建
  8. 北京Uber优步司机奖励政策(4月7日)
  9. Android日志Log的封装以及每个级别的意义
  10. 怎样在接口地址中添加请求头参数_jmeter5.3做soap接口性能测试配置
  11. [转]详细解说:简单CSS3实现炫酷读者墙
  12. linux 系统启动级别,LINUX系统启动级别介绍与解释
  13. 数据中心机房建设方案
  14. 生成器模式及C++代码实现
  15. ActiveX图片控件,图片处理基于Internet的程序
  16. [转载]WiFi有死角? 巧用旧无线路由器扩展覆盖
  17. python工具-截图自动保存
  18. protobuf如何使用Protogen工具生成CS代码详细教学篇
  19. 埃夫特机器人回零偏差太大_艰难的差异化竞争,埃夫特前途渺茫
  20. Maya菜单中英文对照表(一)

热门文章

  1. laravel中的集合collect第三篇
  2. 普普通通,我的三年大专
  3. Java模拟保皇游戏开始的发牌过程。
  4. ryzen运行matlab,关于Ryzen 2700运行SOLIDWORKS提速的办法
  5. 2. Transformer相关的原理(2.2. 图解transformer)
  6. 2021年最新大厂php+go面试题集(四)
  7. 2021,“韭零后”的智商税涌向了哪里?
  8. 漂亮的css文字效果
  9. 以太坊绝地求生之战!
  10. [Android分享] Android ListPreference的用法