Почему для кругов, отображаемых с одной и той же функцией и входными значениями, появляются разные цвета? - PullRequest
0 голосов
/ 03 июля 2019

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

Код запускается, однако, когда я пытаюсь нарисовать в окне изображения, есть 2 нежелательных поведения:

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

Как это исправить?

Это одно из упражнений OpenCV: https://opencv -python-tutroals.readthedocs.io / en / latest / py_tutorials / py_gui / py_trackbar / py_trackbar.html # trackbar

import numpy as np
import cv2
drawing = False
def nothing(x):
    pass

# Create a black image, a window
img = np.zeros((768,1024,3), np.uint8)
cv2.namedWindow('image')

# create trackbars for color change
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
cv2.createTrackbar('W','image',0,50,nothing)

def draw_brush(event,x,y,flags,param):
    global drawing, b, g, r, w
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        cv2.circle(img,(x,y),w,(b,g,r),-1)
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            a, b = x, y
            if a!=x & b!=y:
                cv2.circle(img,(x,y),w,(b,g,r),-1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
# Create a window and bind the function to window
cv2.setMouseCallback('image',draw_brush)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

    # get current positions of four trackbars
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    w = cv2.getTrackbarPos('W','image')

cv2.destroyAllWindows()

screenshot

1 Ответ

0 голосов
/ 03 июля 2019

Ошибка здесь

a, b = x, y
if a!=x & b!=y:
    cv2.circle(img,(x,y),w,(b,g,r),-1)

Вы используете две переменные "b".Один как значение координаты и один как значение синего цвета.Таким образом, ваш синий цвет получает значение координаты "у" там.Используйте другое имя переменной для координатной переменной "b".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...