python 实现用鼠标选取圆形ROI区域,并可以拖动,与图片其他部分调换位置
时间: 2024-02-20 17:59:55 浏览: 24
你可以使用Python中的OpenCV库来实现这个功能。以下是一个简单的示例代码:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('path/to/image')
# 定义绘制状态和ROI区域
drawing = False
roi_rect = None
def mouse_callback(event, x, y, flags, param):
global img, drawing, roi_rect
# 鼠标左键按下开始画ROI
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
roi_rect = (x, y, 0, 0)
# 鼠标移动时更新ROI大小
elif event == cv2.EVENT_MOUSEMOVE and drawing:
roi_rect = (roi_rect[0], roi_rect[1], x - roi_rect[0], y - roi_rect[1])
# 鼠标左键抬起停止画ROI
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
roi_rect = (roi_rect[0], roi_rect[1], x - roi_rect[0], y - roi_rect[1])
# 创建窗口并设置鼠标回调函数
cv2.namedWindow('image')
cv2.setMouseCallback('image', mouse_callback)
while True:
# 绘制ROI矩形
if roi_rect is not None:
img_roi = img[roi_rect[1]:roi_rect[1]+roi_rect[3], roi_rect[0]:roi_rect[0]+roi_rect[2]]
cv2.rectangle(img, (roi_rect[0], roi_rect[1]), (roi_rect[0]+roi_rect[2], roi_rect[1]+roi_rect[3]), (0, 255, 0), 2)
# 显示图片
cv2.imshow('image', img)
# 等待按键操作
key = cv2.waitKey(1)
# 拖动ROI区域
if key == ord('m') and roi_rect is not None:
roi_mask = np.zeros(img.shape[:2], dtype=np.uint8)
roi_mask[roi_rect[1]:roi_rect[1]+roi_rect[3], roi_rect[0]:roi_rect[0]+roi_rect[2]] = 255
bg_mask = cv2.bitwise_not(roi_mask)
bg = cv2.bitwise_and(img, img, mask=bg_mask)
cv2.imshow('background', bg)
cv2.moveWindow('background', 0, 0)
roi_x, roi_y = roi_rect[:2]
while True:
key = cv2.waitKey(1)
if key == ord('q'):
break
elif key == ord('w'):
roi_y -= 1
elif key == ord('s'):
roi_y += 1
elif key == ord('a'):
roi_x -= 1
elif key == ord('d'):
roi_x += 1
img[roi_rect[1]:roi_rect[1]+roi_rect[3], roi_rect[0]:roi_rect[0]+roi_rect[2]] = bg[roi_rect[1]:roi_rect[1]+roi_rect[3], roi_rect[0]:roi_rect[0]+roi_rect[2]]
roi_rect = (roi_x, roi_y, roi_rect[2], roi_rect[3])
cv2.rectangle(img, (roi_rect[0], roi_rect[1]), (roi_rect[0]+roi_rect[2], roi_rect[1]+roi_rect[3]), (0, 255, 0), 2)
cv2.imshow('image', img)
# 退出程序
elif key == ord('q'):
break
# 释放窗口资源
cv2.destroyAllWindows()
```
在这个示例代码中,我们使用OpenCV库来创建一个窗口,并设置鼠标回调函数来检测鼠标事件。当鼠标左键按下时,我们记录下鼠标位置,并设置一个变量来表示正在画ROI。当鼠标移动时,我们根据当前鼠标位置和ROI起点位置计算ROI的大小,并绘制矩形。当鼠标左键抬起时,我们停止画ROI并记录下最终的ROI大小。同时,我们还设置了一个按键操作,可以通过按下'm'键来拖动ROI区域,并通过按下'q'键来退出程序。
你可以根据自己的需求来修改代码,比如改变颜色、线条宽度等。同时,你也可以添加更多的按键操作来实现更多的功能,例如旋转、缩放、翻转等。