2015-02-05 4 views
1

Я изменил простую программу, взятую из документации OpenCV.OpenCV: как рисовать непрерывно с помощью мыши?

Я просто хочу рисовать с помощью указателя мыши непрерывно. На данный момент мне удалось рисовать, но не в непрерывном режиме, если только я слишком медленно двигаю курсором мыши.

Код:

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) 
    elif event==cv2.EVENT_LBUTTONUP: 
     drawing=False 
     if mode==True: 
      cv2.circle(img,(x,y),1,(0,0,255),-1)   


img = np.zeros((512,512,3), np.uint8) 
cv2.namedWindow('Window') 
cv2.setMouseCallback('Window',interactive_drawing) 
while(1): 
    cv2.imshow('Window',img) 
    k=cv2.waitKey(1)&0xFF 
    if k==27: 
     break 
cv2.destroyAllWindows() 

Надеюсь, этот скриншот объясняет мою проблему: маленькая линия выглядит непрерывной, потому что я должен был переместить курсор мыши слишком медленно. Чем длиннее линия, не является непрерывным, так как я должен был переместить курсор с нормальной скоростью:

enter image description here

я ожидаю, чтобы иметь возможность постоянно рисовать, как это:

enter image description here

Любой может показать, как решить эту проблему? Спасибо заранее.

ответ

2

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

1

OpenCV уже реализует такую ​​функцию в своих примерах для python. Это называется Sketcher.

Есть хороший пример, который демонстрирует, как его использовать для inpainting.

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