OpenCV I_07鼠标画笔 setMouseCallback()

本文介绍了如何使用OpenCV的setMouseCallback()实现鼠标事件监听,包括鼠标滑动、点击等,并给出了双击左键画圆圈及通过模式切换绘制矩形或圆圈的实例,展示了在图像处理中的人机交互应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标

• 学习使用 OpenCV 处理鼠标事件

• 你将要学习的函数是:cv2.setMouseCallback()


鼠标事件 :cv2.setMouseCallback()

cv2_EVENT_MOUSEMOVE 0 滑动 
cv2_EVENT_LBUTTONDOWN 1 左键点击 
cv2_EVENT_RBUTTONDOWN 2 右键点击 
cv2_EVENT_MBUTTONDOWN 3 中间点击 
cv2_EVENT_LBUTTONUP 4 左键释放 
cv2_EVENT_RBUTTONUP 5 右键释放 
cv2_EVENT_MBUTTONUP 6 中间释放 
cv2_EVENT_LBUTTONDBLCLK 7 左键双击 
cv2_EVENT_RBUTTONDBLCLK 8 右键双击 
cv2_EVENT_MBUTTONDBLCLK 9 中间释放

cv2_EVENT_FLAG_LBUTTON
### 使用 OpenCV 实现画笔功能或绘制线条 在 OpenCV 中,可以通过 `cv.line()` 函数实现基本的线条绘制功能[^1]。此函数允许指定起点、终点、颜色和粗细等参数来绘制一条直线。如果希望实现更复杂的画笔功能,则可以结合鼠标事件回调函数 `cv2.setMouseCallback()` 来动态捕获用户的输入并实时绘制线条[^5]。 #### 基础线条绘制 以下是使用 `cv.line()` 绘制静态线条的一个简单例子: ```python import cv2 import numpy as np # 创建一个黑色背景图像 image = np.zeros((512, 512, 3), dtype=np.uint8) # 定义线条属性 start_point = (50, 50) # 起始点坐标 end_point = (400, 400) # 结束点坐标 color = (255, 0, 0) # BGR 颜色格式,这里是蓝色 thickness = 2 # 线条宽度 # 绘制线条 cv2.line(image, start_point, end_point, color, thickness) # 显示结果 cv2.imshow('Line Drawing', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码展示了如何在一个空白图像上绘制一条从 `(50, 50)` 到 `(400, 400)` 的蓝色线条。 --- #### 动态画笔功能 为了实现类似于真实画笔的效果,通常会利用鼠标的拖动动作来连续记录多个点,并将它们连接成平滑的路径。这需要借助 `cv2.setMouseCallback()` 设置鼠标事件监听器。 下面是一个完整的动态画笔示例: ```python import cv2 import numpy as np drawing = False # 表明是否正在绘画 ix, iy = -1, -1 # 初始化起始位置 def draw_circle(event, x, y, flags, param): global ix, iy, drawing if event == cv2.EVENT_LBUTTONDOWN: # 当按下左键时启动绘画模式 drawing = True ix, iy = x, y elif event == cv2.EVENT_MOUSEMOVE and drawing: # 移动过程中持续更新线条 cv2.circle(img, (x, y), 5, (0, 0, 255), -1) # 圆圈模拟画笔痕迹 elif event == cv2.EVENT_LBUTTONUP: # 抬起左键结束绘画 drawing = False cv2.circle(img, (x, y), 5, (0, 0, 255), -1) img = np.zeros((512, 512, 3), dtype=np.uint8) # 黑底图片初始化 cv2.namedWindow('Paint') cv2.setMouseCallback('Paint', draw_circle) # 注册鼠标回调函数 while True: cv2.imshow('Paint', img) if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 键退出程序 break cv2.destroyAllWindows() ``` 在这个脚本中,`draw_circle` 函数负责响应不同类型的鼠标事件(如点击、移动和释放)。当检测到鼠标左键被按下的时候,开始记录当前的位置;随着鼠标的移动,在屏幕上不断绘制小圆圈以形成连贯的轨迹[^4]。 --- #### 扩展功能 除了简单的线条外,还可以扩展其他图形绘制能力,比如矩形、椭圆或者文字标注等功能。具体可使用的函数包括但不限于以下几种: - **`cv.rectangle()`**: 绘制矩形框。 - **`cv.circle()`**: 绘制圆形区域。 - **`cv.putText()`**: 添加文本标签至图像之上[^2]。 例如,向上面的例子加入键盘快捷方式切换工具类型的功能将会使应用更加灵活实用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值