python opencv在窗体上绘制带有角度的矩形ROI并将ROI裁剪
时间: 2024-06-15 20:06:05 浏览: 21
在Python中使用OpenCV库实现在窗体上绘制带有角度的矩形ROI并将ROI裁剪的方法如下[^1]:
```python
import cv2
def draw_rotated_rectangle(event, x, y, flags, param):
global drawing, top_left_pt, bottom_right_pt, angle
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
top_left_pt = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
bottom_right_pt = (x, y)
cv2.rectangle(img, top_left_pt, bottom_right_pt, (0, 255, 0), 2)
cv2.imshow("Image", img)
def rotate_image(image, angle):
height, width = image.shape[:2]
rotation_matrix = cv2.getRotationMatrix2D((width/2, height/2), angle, 1)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))
return rotated_image
def crop_roi(image, top_left_pt, bottom_right_pt, angle):
cropped_image = image[top_left_pt[1]:bottom_right_pt[1], top_left_pt[0]:bottom_right_pt[0]]
cropped_image = rotate_image(cropped_image, angle)
return cropped_image
drawing = False
top_left_pt = ()
bottom_right_pt = ()
angle = 0
img = cv2.imread("image.jpg")
cv2.namedWindow("Image")
cv2.setMouseCallback("Image", draw_rotated_rectangle)
while True:
cv2.imshow("Image", img)
key = cv2.waitKey(1) & 0xFF
if key == ord("r"):
img = cv2.imread("image.jpg")
elif key == ord("c"):
if top_left_pt and bottom_right_pt:
cropped_image = crop_roi(img, top_left_pt, bottom_right_pt, angle)
cv2.imshow("Cropped Image", cropped_image)
elif key == ord("q"):
break
cv2.destroyAllWindows()
```
这段代码实现了以下功能:
1. 通过鼠标在窗体上选择感兴趣的矩形区域(ROI)。
2. 绘制带有角度的矩形ROI,并在窗体上显示。
3. 按下键盘上的 "c" 键将裁剪出的ROI显示在新窗口中。
4. 按下键盘上的 "r" 键可以重置图像。
5. 按下键盘上的 "q" 键可以退出程序。
请注意,你需要将代码中的 "image.jpg" 替换为你自己的图像路径。