Я пробовал этот код, где у меня есть изображение, затем я могу нарисовать прямоугольник, когда я щелкаю и перетаскиваю мышь. В событии Mouse Down я отмечаю координаты x и y как начальный угол прямоугольника. При перемещении мыши я рисую прямоугольник из старых координат x и y, которые я сохранил, в новый, где находится мышь. Наконец, на Mouse Up я рисую прямоугольник как окончательный.
Вот код, который я использую:
import cv2
import numpy as np
drawing = False # True if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix, iy = -1, -1
# mouse callback function
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode, overlay, output, alpha
overlay = img.copy()
output = img.copy()
alpha = 0.5
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv2.rectangle(overlay, (ix, iy), (x, y), (0, 255, 0), -1)
cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, img)
cv2.imshow('image', img)
else:
cv2.circle(overlay, (x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(overlay, (ix, iy), (x, y), (0, 255, 0), -1)
cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, img)
else:
cv2.circle(overlay, (x, y), 5, (0, 0, 255), -1)
##img = np.zeros((512, 512, 3), np.uint8)
# Get our image
img = cv2.imread("bed_cv.jpg", 1)
#make cv2 windows, set mouse callback
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(1):
cv2.imshow('image', img)
# This is where we get the keyboard input
# Then check if it's "m" (if so, toggle the drawing mode)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
Конечно, проблема здесь в том, что если я начну с центра, затем перетащу в правый нижний угол, а затем вернусь в левый нижний угол, первый прямоугольник не сотрется. Конечно, это происходит потому, что я на самом деле рисую прямоугольник на изображении, а не очищаю его, поэтому каждый прямоугольник, созданный в событии Mouse Move, рисуется.
Эффект, которого я хочу добиться, подобен тому, когда вы рисуете прямоугольник на рабочем столе, и вы можете менять направление, не создавая прямоугольник.
Мой вопрос: можно ли визуально нарисовать прямоугольник, но еще не записать его на изображение?