python 用鼠标在图片上选取 圆形roi
时间: 2023-12-22 16:05:30 浏览: 166
要在图片上选取圆形ROI,可以使用 Python 的 OpenCV 库。下面是一个简单的示例代码:
```python
import cv2
import numpy as np
# 定义全局变量
ix, iy = -1, -1 # 鼠标起始位置
drawing = False # 是否正在绘制ROI区域
# 鼠标回调函数
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)
cv2.circle(img, center, radius, (255, 0, 0), 2)
# 读入图片并创建窗口
img = cv2.imread('test.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while True:
# 显示图片
cv2.imshow('image', img)
# 检测键盘按键
k = cv2.waitKey(1) & 0xFF
if k == 27: # ESC键退出
break
cv2.destroyAllWindows()
```
在这个示例中,我们首先定义了一个全局变量 `drawing`,用来判断是否正在绘制ROI区域。然后,我们定义了一个鼠标回调函数 `draw_circle`,处理鼠标事件。在鼠标左键按下时,我们设置 `drawing` 为 True,记录起始位置 `ix` 和 `iy`。在鼠标移动时,如果 `drawing` 为 True,我们计算出当前鼠标位置与起始位置的距离,更新半径 `radius` 和圆心位置 `center`。在鼠标左键释放时,我们设置 `drawing` 为 False,计算出最终的半径和圆心位置,并在图片上绘制出圆形ROI。
在主程序中,我们读入一张图片,并创建一个窗口,并将鼠标回调函数 `draw_circle` 绑定到窗口上。然后,我们不断显示图片,并根据 `drawing` 的状态来更新圆形ROI。最后,我们检测键盘按键,如果按下了 ESC 键,则退出程序并销毁窗口。
阅读全文