You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCV鼠标事件开发:点击画圆、半径调整及顺序标号实现疑问

解决动态调整圆半径和顺序编号的问题

我来帮你搞定这两个需求——让圆形半径能通过鼠标滚轮或键盘调整,同时每次点击按顺序标注编号。咱们直接修改你的代码,同时解释关键改动:

完整修改后的代码

import cv2
import numpy as np

windowName = 'Drawing'
img = cv2.imread('000025.png', cv2.IMREAD_COLOR)
# 初始化全局变量:控制半径和编号计数器
current_radius = 30
click_counter = 0

cv2.namedWindow(windowName)

# mouse callback function
def draw_circle(event, x, y, flags, param):
    global current_radius, click_counter
    if event == cv2.EVENT_LBUTTONDOWN:
        # 递增计数器,绘制带编号的圆
        click_counter += 1
        cv2.circle(img, (x, y), current_radius, (255, 0, 0), 1)
        font = cv2.FONT_HERSHEY_SIMPLEX
        # 使用计数器作为标签文本,调整位置避免被圆遮挡
        cv2.putText(img, str(click_counter), (x + current_radius + 10, y), font, 1, (200, 255, 155), 1, cv2.LINE_AA)
    elif event == cv2.EVENT_MOUSEWHEEL:
        # 处理鼠标滚轮:向上滚增大半径,向下滚减小
        if flags > 0:
            current_radius = min(current_radius + 5, 200)  # 限制最大半径200
        else:
            current_radius = max(current_radius - 5, 5)    # 限制最小半径5

# bind the callback function to window
cv2.setMouseCallback(windowName, draw_circle)

def main():
    global current_radius
    while (True):
        cv2.imshow(windowName, img)
        # 处理键盘输入:+/-键调整半径
        key = cv2.waitKey(20) & 0xFF
        if key == 27:  # ESC键退出
            break
        elif key == ord('+') or key == ord('='):  # 兼容部分键盘的=键
            current_radius = min(current_radius + 5, 200)
        elif key == ord('-'):
            current_radius = max(current_radius - 5, 5)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()

关键改动解释

1. 动态调整半径

  • 全局变量current_radius:替代原代码中固定的30,用来实时存储当前的圆半径。
  • 鼠标滚轮事件处理:在回调函数中捕获cv2.EVENT_MOUSEWHEEL事件,通过flags判断滚轮方向(正数为向上滚,负数为向下滚),每次增减5个像素;同时用min和max限制半径范围在5到200之间,避免半径过大或过小影响显示。
  • 键盘控制补充:在主循环中捕获键盘按键,按下+(或部分键盘的=键)增大半径,按下-减小半径,同样做范围限制,给你两种调整半径的方式。

2. 顺序编号标注

  • 全局计数器click_counter:每次左键点击时自动递增,从1开始计数。
  • 动态文本标签:把putText的固定文本'label'替换为str(click_counter),同时调整标签位置到圆的右侧(x + current_radius + 10),避免被圆形遮挡,让编号更清晰。

这样修改后,你就能实现:

  • 左键点击图片任意位置,绘制当前半径的圆,并标注递增的编号
  • 鼠标滚轮上下滚动,实时调整下一个圆的半径
  • 按下+/-键,也能调整半径
  • ESC键退出程序

内容的提问来源于stack exchange,提问作者Abrar Sayeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:20:53