2015-03-08 2 views
1

Я пытаюсь сделать следующие движения мыши. Он работает нормально.непрерывный рисунок (opencv)

Когда я медленно двигаю мышью, то, что нарисовано, выглядит непрерывным, но когда я немного ускоряю движение мыши, я получаю прерывистые рисунки.

Как я могу сделать с помощью мыши continusouly

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 

# mouse callback function 
def interactive_drawing(event,x,y,flags,param): 
    global ix,iy,drawing, mode 

    if event==cv2.EVENT_LBUTTONDOWN: 
     drawing=True 
     ix,iy=x,y 

    elif event==cv2.EVENT_MOUSEMOVE: 
     if drawing==True: 
      if mode==True: 
       cv2.circle(img,(x,y),1,(0,0,255),-1) 
       print x,y 
    elif event==cv2.EVENT_LBUTTONUP: 
     drawing=False 
     if mode==True: 
      cv2.circle(img,(x,y),1,(0,0,255),-1) 
      #print x,y 
      #cv2.line(img,(x,y),(x,y),(0,0,255),10) 
    return x,y 




img = np.zeros((512,512,3), np.uint8) 

cv2.namedWindow('begueradj') 
cv2.setMouseCallback('begueradj',interactive_drawing) 
while(1): 
    cv2.imshow('begueradje',img) 
    k=cv2.waitKey(1)&0xFF 
    if k==27: 
     break 
cv2.destroyAllWindows() 

Resulat я получаю:

enter image description here

ответ

4

При перемещении мыши быстро, вы не можете сделать достаточно быстро, чтобы идти в ногу с события мыши. Чтобы подтвердить это, измените свой код, чтобы скопировать координаты мыши без рисования и добавить их в список. Добавьте обработчик нажатия, чтобы нарисовать захваченные точки. Если это так, вы можете нарисовать круг на небольшом прозрачном изображении один раз. Затем вы можете наложить это маленькое изображение вместо рисования круга, который включает слишком много вычислений в пространстве доли секунды. Дайте этому выстрел и посоветуйте.

Edit:

Как я уже сказал в комментарии выше,

Так что вам нужно, чтобы связать отдельные точки с линиями.

Это единственный «живой» рисунок, который вы можете выполнить. Доказательство:

enter image description here

Так что вам нужно следить за каждым пикселем, который вы посещаете, чтобы нарисовать линию между ним и следующим, к которой ваши движения мыши:

cv2.line(img,(ix,iy),(x,y),(0,0,255),10) # draw line between former and present pixel 
ix=x # save former x coordinate 
iy=y # save former y coordinate 
+0

спасибо очень много для объяснения. Я сохраню пункты в списке и нарисую их позже. Это будет работать непрерывно. –

+0

عرفت انك من الجزائر يا أخي في الله :-) – Tarik

+0

yes :) Salam :) –

Смежные вопросы