Создать Eraser Tool в Python, используя OpenCV - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь написать программу на pycharm на python, используя opencv. У меня проблема с использованием функций мыши для удаления изображения.

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

import cv2
screen="Drawing"
img=cv2.imread("12.jpg")
cv2.namedWindow(screen)

ластик = False x_start, y_start, x_end, y_end = 0, 0, 0, 0

 def draw_circle(event,x,y,flags,param):
      if (event==cv2.EVENT_LBUTTONDOWN):
            x_start, y_start, x_end, y_end = x, y, x, y
            eraser=True
      elif (event==cv2.EVENT_MOUSEHWHEEL):
            if eraser==True:
                  x_end, y_end = x, y

      elif event == cv2.EVENT_LBUTTONUP:
            x_end, y_end = x, y
            eraser = False

   cv2.setMouseCallback(screen,draw_circle)
   while True:

    i = img.copy()
    if not eraser:
         cv2.imshow("image", img)

    elif eraser:
         cv2.circle(img, (x, y), 20, (255, 255, 255), -1)
         cv2.imshow(screen,img)

 if cv2.waitKey(1)==13:
     break

cv2.destroyAllWindows()

Программа отображает изображение, но я не могу стереть его, нажимая кнопки мыши

1 Ответ

0 голосов
/ 27 июня 2019

Как сказано в @ api55, eraser необходимо объявить как глобальную переменную.Но то же самое делают координаты x и y круга, который вы хотите «стереть».Ваш текущий код использует неверные переменные для этого и также никогда не обновляет их.Вот почему ластик не работает.

Изменяя код, вы также можете делать с меньшим количеством переменных и без цикла while, делая его более эффективным.Я взял на себя смелость реорганизовать ваш код и реализовать размер ластика.

import cv2
screen="Drawing"
img=cv2.imread("12.jpg")
cv2.namedWindow(screen)
eraser=False 
radius = 20

def draw_circle(x,y):
        # 'erase' circle
        cv2.circle(img, ( x, y), radius, (255, 255, 255), -1)
        cv2.imshow(screen,img)

def handleMouseEvent(event,x,y,flags,param):
      global eraser , radius     
      if (event==cv2.EVENT_MOUSEMOVE):
              # update eraser position
            if eraser==True:
                  draw_circle(x,y)
      elif (event==cv2.EVENT_MOUSEWHEEL):
              # change eraser radius
            if flags > 0:
                radius +=   5
            else:
                    # prevent issues with < 0
                if radius > 10:
                    radius -=   5
      elif event == cv2.EVENT_LBUTTONUP:
              # stop erasing
            eraser = False
      elif (event==cv2.EVENT_LBUTTONDOWN):
              # start erasing
            eraser=True
            draw_circle(x,y)


cv2.setMouseCallback(screen,handleMouseEvent)
# show initial image
cv2.imshow(screen,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...