Щелкните мышью и нарисуйте фиксированный прямоугольник в позиции мыши в видео (python_opencv) - PullRequest
0 голосов
/ 21 октября 2018

Так что во время моей веб-камеры / видео я хотел бы, чтобы, когда я щелкаю мышью, в позиции мыши рисуется прямоугольник, и размер прямоугольника фиксирован, напр.80 X 80. В моем текущем коде прямоугольник следует за мышью, но размер всегда отличается.Я хочу фиксированный размер точно в положении мыши, когда я нажимаю на кадр в видео.

Вот мой код.

import os
import numpy as np
import cv2 
from PIL import Image
import re



print('kaishi')
flag=0
drawing = False

point1 = ()
point2 = ()
ref_point = []
xvalues=[];
yvalues=[];
ref_point = []


cx=0;
cy=0;
 def mouse_drawing(event, x, y, flags, params):
     global point1, point2, 
     drawing,ref_point2,flag,refPt,cropping,cx,cy



     if event == cv2.EVENT_LBUTTONDOWN:

        drawing = True
        point1 = (x, y)
        xvalues.append(x)
        yvalues.append(y)
        cx =x;
        cy=y;


elif event == cv2.EVENT_MOUSEMOVE:
    if drawing is True:
        point2 = (x, y)




elif event == cv2.EVENT_LBUTTONUP:
        flag+=1;
        print('finished square')





cap = cv2.VideoCapture(0)

cv2.namedWindow("Frame")
cv2.setMouseCallback("Frame", mouse_drawing)


while True:
   _, frame = cap.read()

      if point1 and point2 :
        cv2.rectangle(frame,(200,cy),(cx,128),(0,0,255),0)
        print(cx,cy)

        flag=0;





    cv2.imshow("Frame", frame)

key = cv2.waitKey(25)
if key== 13:

    print('done')




elif key == 27:
     break



 cap.release()
 cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 22 октября 2018

Проблема в том, что вы зафиксировали точку прямоугольника, а другая точка следует за мышью.В вашем коде это будет здесь:

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)
...