Проблема в том, что вы зафиксировали точку прямоугольника, а другая точка следует за мышью.В вашем коде это будет здесь:
cv2.rectangle(frame,(200,cy),(cx,128),(0,0,255),0)
Теперь, это будет зависеть от того, каким будет прямоугольник, это точка, где вы нажимаете верхнюю левую точку?если это так, то это должно быть что-то вроде:
cv2.rectangle(frame,(cx,cy),(cx + 80, cy +80),(0,0,255),0)
Этот пример будет для прямоугольника 80 x 80 .... В вашем коде это произойдет, когда вы нажмете.
Однако в вашем коде много неиспользуемого кода ... Я бы сделал что-то вроде этого:
import numpy as np
import cv2
drawing = False
point = (0,0)
def mouse_drawing(event, x, y, flags, params):
global point, drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
point= (x, y)
cap = cv2.VideoCapture(0)
cv2.namedWindow("Frame")
cv2.setMouseCallback("Frame", mouse_drawing)
while True:
_, frame = cap.read()
if drawing :
cv2.rectangle(frame,point,(point[0]+80, point[1]+80),(0,0,255),0)
cv2.imshow("Frame", frame)
key = cv2.waitKey(25)
if key== 13:
print('done')
elif key == 27:
break
cap.release()
cv2.destroyAllWindows()
Если вы хотите, чтобы прямоугольник следовал за вашей мышью после нажатия и остановилсяпосле того, как вы отпустите кнопку, измените код, который я предоставил перед функцией mouse_drawing
, следующим образом:
def mouse_drawing(event, x, y, flags, params):
global point, drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
point = (x, y)
elif event == cv2.EVENT_MOUSEMOVE:
if drawing is True:
point = (x, y)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
point = (x, y)