OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)

这篇具有很好参考价值的文章主要介绍了OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 学习目标

  1. 学习如何在OpenCV中处理鼠标事件;
  2. 学习鼠标事件与回调;
  3. 学习鼠标事件回调函数的基本流程。

2. Callback 基本流程

OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)

3. 鼠标事件 cv.setMouseCallback 函数说明

3.1 cv.setMouseCallback() 函数使用
cv.setMouseCallback(winname,onMouse,userdata)
3.2 参数说明
参数 说明
winname 表示监听鼠标事件的窗口。
onMouse 表示响应函数,即当鼠标事件触发时调用的函数。
userdata 表示默认值0。这个参数是用户传递给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value是全局变量,完全可以不去管这个userdata参数。传给回调函数的参数!!!
3.3 返回参数
typedef void(*cv::MouseCallback)(int event, int x, int y, int flags, void *userdata)
3.4 返回参数说明
参数 说明
event 表示当前鼠标执行的事件。
x 表示当前鼠标坐标值x。
y 表示当前鼠标坐标值y。
flags 表示鼠标状态。
userdata 表示用户定义的传递到setMouseCallback函数调用的参数。
3.5 event 参数说明
说明
EVENT_MOUSEMOVE (0) 表示滑动事件。
EVENT_LBUTTONDOWN (1) 表示左键点击事件。
EVENT_RBUTTONDOWN (2) 表示右键点击事件。
EVENT_MBUTTONDOWN (3) 表示中键点击事件。
EVENT_LBUTTONUP (4) 表示左键放开事件。
EVENT_RBUTTONUP (5) 表示右键放开事件。
EVENT_MBUTTONUP (6) 表示中键放开事件。
EVENT_LBUTTONDBLCLK (7) 表示左键双击事件。
EVENT_RBUTTONDBLCLK (8) 表示右键双击事件。
EVENT_MBUTTONDBLCLK (9) 表示中键双击事件。
3.6 flags 参数说明
说明
EVENT_FLAG_LBUTTON (1) 表示左键拖曳事件。
EVENT_FLAG_RBUTTON (2) 表示右键拖曳事件。
EVENT_FLAG_MBUTTON (4) 表示中键拖曳事件。
EVENT_FLAG_CTRLKEY (8) 表示(8~15)按 Ctrl 不放。
EVENT_FLAG_SHIFTKEY (16) 表示(16~31)按 Shift 不放。
EVENT_FLAG_ALTKEY (32) 表示(32~39)按 Alt 不放。

4. 【通过鼠标绘制随机颜色矩形】实例

4.1 实例代码
import cv2 as cv
import numpy as np

flagMove = False
oldImg = None
startX,startY = -1,-1
endX,endY = -1,-1
b,g,r = 0,0,0

def create_demo():
  global oldImg
  # 创建一个500*500的白色背景图片
  img = np.ones((500,500,3), dtype=np.uint8)*255
  # 复制一个一样大小的白色背景图
  oldImg = np.ones_like(img) * 255
  # 创建一个窗口
  cv.namedWindow('mouse_img')
  # 监听这个窗口的鼠标事件
  cv.setMouseCallback('mouse_img', draw_rectangle, img)
  # 每10毫秒显示一次图片
  while True:
    cv.imshow("mouse_img", img)
    # 监听每10毫秒是否按退出键
    if cv.waitKey(10) & 0xFF == 27:
      break
  # 销毁所有窗口
  cv.destroyAllWindows()

# 鼠标回调函数,绘制矩形
def draw_rectangle(event,x,y,flags,img):
  global flagMove,startX,startY,endX,endY,oldImg,b,g,r
  # 点击起点
  if event == cv.EVENT_LBUTTONDOWN:
    # 当前次鼠标左键开始坐标
    startX,startY = x,y
    # 开始后允许对移动中坐标进行记录
    flagMove = True
    # 产生随机颜色
    b,g,r = np.random.randint(0,256,size=3)
    b,g,r = int(b),int(g),int(r)
  # 移动终点
  if event == cv.EVENT_MOUSEMOVE and flagMove:
    # 将上次绘制的结果给当前图片,为了将当前次移动过程中产生的绘制清除
    img[:] = oldImg[:]
    # 当前次移动结束的坐标
    endX,endY = x,y
    # 绘制移动中的当前矩形
    cv.rectangle(img, (startX,startY), (endX,endY), (b,g,r), lineType=cv.LINE_AA)
  # 最后终点
  if event == cv.EVENT_LBUTTONUP:
    # 当前次坐标点绘制结束坐标点,结束鼠标移动监听
    endX,endY = x,y
    flagMove = False
    # 绘制当前次鼠标左键按下到放开起点和终点组成的矩形
    cv.rectangle(img, (startX,startY), (endX,endY), (b,g,r), lineType=cv.LINE_AA)
    # 保存当前次绘制的图片
    oldImg[:] = img[:]
    # 坐标点还原
    startX,startY = -1,-1
    endX,endY = -1,-1

if __name__ == "__main__":
  create_demo()
4.2 代码解析
  1. 创建一个500*500的白色背景图片;
  2. 复制一个一样大小的白色背景图;
  3. 创建一个窗口,监听这个窗口的鼠标事件;
  4. 鼠标回调函数,绘制矩形;
  5. 当前次鼠标左键开始坐标;
  6. 开始后允许对移动中坐标进行记录;
  7. 产生随机颜色;
  8. 将上次绘制的结果给当前图片,为了将当前次移动过程中产生的绘制清除;
  9. 当前次移动结束的坐标,绘制移动中的当前矩形;
  10. 当前次坐标点绘制结束坐标点,结束鼠标移动监听;
  11. 绘制当前次鼠标左键按下到放开起点和终点组成的矩形;
  12. 保存当前次绘制的图片,坐标点还原;
  13. 每10毫秒显示一次图片;
  14. 监听每10毫秒是否按退出键;
  15. 销毁所有窗口。
4.3 实例运行结果

OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)文章来源地址https://www.toymoban.com/news/detail-498339.html

5. 注意

  1. 随机颜色的生成的时候,bgr的值必须是int类型;
  2. 每次绘制完成,必须对当前次绘制图片进行保存;
  3. 在移动过程中必须在绘制开始将上次绘制结果的图片覆盖给当前次,否则会出现移动一次一个矩形绘制;
  4. 可以使用鼠标监听事件方法实现图片截图,下一篇实战实现图片截图功能!

到了这里,关于OpenCV-Python学习(15)—— OpenCV 鼠标操作和响应(cv.setMouseCallback)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

    1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip; 学习 NumPy 矩阵的反转函数 np.flip; 自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像,是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转,垂直镜像是将图像沿水平中轴线进行上下翻转,水平

    2024年02月06日
    浏览(38)
  • OpenCV-Python学习(20)—— OpenCV 图像几何变换之图像旋转(cv.warpAffine、cv.getRotationMatrix2D、cv.rotate、np.rot90)

    1. 学习目标 学习旋转矩阵; 学习使用 OpenCV 的 cv.warpAffine 函数进行图片的旋转; 学习使用 OpenCV 的 cv.getRotationMatrix2D 来计算不同旋转中心的不同角度的 MAR 旋转变换矩阵; 学习使用 OpenCV 的 cv.rotate 进行特殊角度的旋转(90,180,270 度)。 2. 不同中心的旋转矩阵计算 2.1 图像

    2024年02月09日
    浏览(30)
  • 计算机视觉OpenCv学习系列:第四部分、键盘+鼠标响应操作

    键盘响应中有一个函数叫做 waitKey ,所有的获取键盘键值都是通过waitKey函数实现的。 1.键盘响应事件 cv.waitKey( [, delay] ) -- retval delay如果没有声明或者delay=0,表示一直阻塞 delay大于0,表示阻塞指定毫秒数 retval返回的对应键盘键值,注意:在不同的操作系统中可能会有差异! 典

    2024年02月09日
    浏览(35)
  • Python cv2 opencv-python opencv-contrib-python 安装

    老规矩,话不多说,上代码! pip install opencv-python(如果只用主模块,则使用这个命令安装【推荐】) pip install opencv-contrib-python(如果需要用到 contrib 模块,则使用这个命令【本次因自己没有使用 contrib 模块,所以没有尝试】) 首先,讲一下 cv2 这个模块是 opencv 的,所以安

    2024年02月11日
    浏览(30)
  • opencv-python[cv2]读取中文路径图像

    随着AI人工智能的不断发展,图像处理这门技术也越来越重要,很多学校本科都开启了图像处理这门课程,学习图像处理开发,自然就绕不开opencv-python[ cv2 ]这个由intel主导的开源库。 cv2 是指OpenCV的Python接口库。 OpenCV (Open Source Computer Vision Library)是一个开源的计算机视觉库

    2024年02月06日
    浏览(45)
  • 使用opencv-python(cv2)库进行相机标定

    2023年09月11日
    浏览(42)
  • 【Python入门教程】CV2报错:cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\s

             OpenCV作为一个强大计算机视觉库被各个领域广泛应用,今天分享下自己编程遇到的报错信息以及解决办法。         这里包含了一个警告和一个报错信息。          警告信息: OpenCV库在处理TIFF图像时遇到的问题有关。从警告信息来看,你的TIFF图像可能使

    2024年02月08日
    浏览(33)
  • opencv-python3 | cv2.findContours()检测图像中物体轮廓

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 通常,为了提高物体轮廓检测的准确率,首先要将彩色图

    2024年02月05日
    浏览(32)
  • opencv-python 已安装,但是import cv2仍旧失败的原因

    在终端和cmd中输入以下命令pip install opencv-python 都会显示opencv-python已安装 注:用 pip install cv2安装会显示报错 大部分安装失败的原因都是安装命令输入错误  其实是解释器的问题 更换已安装opencv的解释器即可解决问题 本项目使用的解释器位置如图所示:   已安装opencv的解释

    2024年02月11日
    浏览(38)
  • opencv鼠标操作与响应

    2024年02月21日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包