鼠标截图

在图上做标记时,opencv主要用setMouseCallback()这个函数,下面来讲解:

一、setMouseCallback()

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

winname:窗口的名字;userdate:传给回调函数的参数;
 onMouse:鼠标响应函数,回调函数。指定窗口里每次鼠标事件发生的时候,被调用的函数指针。 这个函数的原型为:

void on_Mouse(int event, int x, int y, int flags, void* param);

event是 CV_EVENT_*变量之一
x和y是鼠标指针在图像坐标系的坐标(不是窗口坐标系) 
flags是CV_EVENT_FLAG的组合, param是用户定义的传递到setMouseCallback函数调用的参数。

//常用的event:
#define CV_EVENT_MOUSEMOVE//移动
#define CV_EVENT_LBUTTONDOWN //左键按下
#define CV_EVENT_RBUTTONDOWN   //右键按下
#define CV_EVENT_LBUTTONUP    //左键抬起
#define CV_EVENT_RBUTTONUP   //右键抬起

例程:

#include<opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv; //不需要每次都输入 cv::Mat ROI; Point pt;//鼠标截取图像的一部分
bool flag = false;
Mat img = imread("121.jpg");
Mat img_copy = img.clone();//clone 是完全的深拷贝,在内存中申请新的空间,与A独立
void onMouse(int event, int x, int y, int flag, void*) {switch (event){case CV_EVENT_LBUTTONDOWN://左键按下flag = true;pt.x = x;pt.y = y;break;case CV_EVENT_MOUSEMOVE://鼠标移动if (flag) { //只有在点击鼠标左键的情况下移动鼠标才执行img_copy.copyTo(img);//以便永远只有一个矩形(否则许多矩形会重叠在一起),清除之前在img图像上,鼠标移动产生的矩形框,只保留最终的一个矩形框rectangle(img, pt, Point(x, y), Scalar(255, 0, 0), 2, 8);//定义一个矩形框,pt表示起始点(按下左键时的鼠标左标);Point表示实时变化的坐标点;颜色;线宽;线型}break;case CV_EVENT_LBUTTONUP://左键抬起flag = false;ROI = img_copy(Rect(pt.x, pt.y, x - pt.x, y - pt.y));//x,y,宽,高imshow("ROI", ROI);//imwrite("filename",ROI);break;default:break;}
}
void main(){namedWindow("mouse", CV_WINDOW_AUTOSIZE);setMouseCallback("mouse", onMouse, 0);  //每次鼠标放在图中区域,就会触发onMouse函数while (1) {imshow("mouse", img);if (27 == waitKey(20))//按ESC键退出(esc键对应的ascall码是27)break;}
}

结果: 

from:https://www.cnblogs.com/little-monkey/p/7197115.html

OpenCV3学习(2.3)——图像读取与鼠标截图相关推荐

  1. youcans 的 OpenCV 学习课—2.图像读取与显示

    youcans 的 OpenCV 学习课-2.图像读取与显示 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的读取.保存和显示.除基本方法和例程外,还给出了从 ...

  2. matlab 图像读取长宽_计算机视觉学习笔记1 图像读取显示和尺寸变换

    第一天,图像的读取,显示和尺寸变换 c++,python,MATLAB各实现一遍,以这个头骨图像为例吧 c++调用OpenCv实现图像显示和尺寸变换 c++用的编译器为clion,因此需要先配置cma ...

  3. MATLAB图像图像处理学习笔记(图像读取、图像显示)

    安装包下载地址:链接:https://pan.baidu.com/s/1GpLOgkOFC0Dq_ZTV0fz_gQ  提取码:tif5 我安装的是2016版的,老师说有图像处理工具包就可以,安装这块 ...

  4. opencv 学习第一课 图像读取、显示、写入 代码注释版 保证你每一行都能读懂

    import numpy as np import cv2 as cvimg = cv.imread('cat.jpg',0) #读入图片 cv.imshow('image1',img) #显示图片 ...

  5. youcans 的 OpenCV 学习课—3.图像的创建与修改

    youcans 的 OpenCV 学习课-3.图像的创建与修改 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. OpenCV 中图像的数据结构是 ndarray 多维数组, ...

  6. youcans 的 OpenCV 学习课—5.图像的几何变换

    youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...

  7. youcans 的 OpenCV 学习课—4.图像的叠加与混合

    youcans 的 OpenCV 学习课-4.图像的叠加与混合 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的加法.叠加与混合,提供完整例程和运行结果:加法 ...

  8. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  9. OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪

    OpenCV高版本已经把粒子滤波的CV方面的condensation算法给去掉了,以前学的condensation算法不能用C++开发还是只能用C版本,(OpenCV3学习(12.4) 粒子滤波Con ...

最新文章

  1. NGUI的技能冷却实现
  2. Shell---for循环
  3. Java assert
  4. 2020\Simulation_2\1.12.5MB
  5. dapper使用时性能优化
  6. java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...
  7. Java多线程学习十二: synchronized的工作原理 以及背后的“monitor 锁”
  8. linux系统的总父目录,Linux虚拟文件系统-资料路径名的解析(2)-回退父目录
  9. java毕业设计——基于java+JSP+J2EE的户籍管理系统设计与实现(毕业论文+程序源码)——户籍管理系统
  10. catia制作物料明细_CATIA课时:符合GB的物料清单模板设置视频教程_翼狐网
  11. 房产经纪龙头居安思危孵化「贝壳」,如何用数字化解找房之痛?
  12. 摩托车结构与维修视频教程
  13. linux下的串口编程
  14. 用python爬取全国和全球疫情数据,并进行可视化分析(过程详细代码可运行)
  15. 建立区域经济大脑,驱动产业创新发展
  16. 说一下如何下载各论坛免费文档
  17. IDEA中单元测试@Test使用
  18. 一款发动机爆震检测分析仪解决方案:英国 phormula 爆震检测分析仪+PICO
  19. 怎么用python制作随机点名软件_python写一个随机点名软件的实例
  20. (带手机版数据同步)新闻文章资讯博客网站源码织梦模板

热门文章

  1. 最详细的YOLOv3论文笔记
  2. 鸿蒙(HarmonyOS)刷机指南
  3. 信安教程第二版-第14章恶意代码防范技术原理
  4. Java概述标识符 、常量、关键字、数据类型
  5. UOJ#218. 【UNR #1】火车管理 线段树 主席树
  6. 接口测试基础一--HTTP请求
  7. 微信公众账号 token 验证失败 解决办法
  8. 【转载】利用压缩网页来提升网站浏览速度
  9. Prism4文档翻译(第九章 第二部分)
  10. 通用客户端表单验证函数修正版(zz)