Еще один шикарный пример вопроса не по теме. В заголвоке вопроса лаги, а по делу
Как сделать чтобы он рисовал один прямоугольник до отпускания, а не рисовал кучу?
Потому что ты рисуешь множество прямоугольников, не стирая их.
Когда ты рисуешь прямоугольник - ты изменяешь изображение. И следующий рисуешь уже на изменённом изображении. Вот и получается множество прямоугольников.
Тебе нужно делать копию оригинального изображения, рисовать на ней, и показывать эту изменённую копию.
import cv2
import sys
import matplotlib.pyplot as plt
original = cv2.imread(sys.argv[1])
ix = -1
iy = -1
drawing = False
def draw_reactangle_with_drag(event, x, y, flags, param):
global ix, iy, drawing, original
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix = x
iy = y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
cv2.imshow("Title of Popup Window", img)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = original.copy()
cv2.rectangle(img, pt1=(ix,iy), pt2=(x, y),color=(0,255,255),thickness=10)
print(ix, iy, x, y)
cv2.imshow("Title of Popup Window", img)
cv2.namedWindow(winname= "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_reactangle_with_drag)
cv2.imshow("Title of Popup Window", original)
while True:
if cv2.waitKey(10) == 27:
break
cv2.destroyAllWindows()
А вообще, если ты хочешь сделать выделение области рамкой,
cv2.selectROI() в помощь.