python 实现用鼠标选取圆形ROI区域,并可以用鼠标拖动ROI区域
时间: 2024-02-20 10:00:02 浏览: 172
图片感兴趣区域ROI获取-鼠标选择矩阵区域+不规则多边形区域(anoconda3.4+spyder+python3.5+opencv3.4)
实现鼠标选取圆形ROI区域并拖动,可以使用 Python 的 OpenCV 库。下面是一个简单的示例代码:
```python
import cv2
import numpy as np
# 定义全局变量
drawing = False # 是否正在绘制ROI区域
ix, iy = -1, -1 # 鼠标起始位置
# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, radius, center
# 鼠标左键按下,开始绘制ROI区域
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
# 鼠标移动,更新ROI区域大小
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
radius = int(np.sqrt((x - ix)**2 + (y - iy)**2))
center = (ix, iy)
# 鼠标左键释放,绘制ROI区域结束
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
radius = int(np.sqrt((x - ix)**2 + (y - iy)**2))
center = (ix, iy)
# 创建窗口并绑定鼠标回调函数
img = cv2.imread('test.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while True:
# 显示原图
cv2.imshow('image', img)
# 绘制ROI区域
if drawing == True:
cv2.circle(img, center, radius, (0, 0, 255), 2)
# 检测键盘按键
k = cv2.waitKey(1) & 0xFF
if k == ord('q'):
break
cv2.destroyAllWindows()
```
在这个示例中,我们首先定义了一个全局变量 `drawing`,用来判断是否正在绘制ROI区域。然后,我们定义了一个鼠标回调函数 `draw_circle`,处理鼠标事件。在鼠标左键按下时,我们设置 `drawing` 为 True,记录起始位置 `ix` 和 `iy`。在鼠标移动时,如果 `drawing` 为 True,我们计算出当前鼠标位置与起始位置的距离,更新半径 `radius` 和圆心位置 `center`。在鼠标左键释放时,我们设置 `drawing` 为 False,计算出最终的半径和圆心位置。
在主程序中,我们读入一张图片,并创建一个窗口,并将鼠标回调函数 `draw_circle` 绑定到窗口上。然后,我们不断显示原图,并根据 `drawing` 的状态来绘制ROI区域。最后,我们检测键盘按键,如果按下了 'q' 键,则退出程序并销毁窗口。
阅读全文