Параметр cv2.createTrackbar не обновляется в функции обратного вызова - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь реализовать трекбар, который позволяет увеличивать и уменьшать изображение. В этом упражнении есть две трекбары: первая трекбар работает с масштабным коэффициентом, а вторая - с увеличением или уменьшением масштаба изображения. Первый трекбар, кажется, работает, так как я могу поиграть с увеличением размера изображения (scaleFactor). Однако второй трекбар не обновляет значение (scaleType) внутри функции и, следовательно, не меняет режим для уменьшения масштаба изображения.

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

Это код:

import cv2


maxScaleUp = 100
scaleFactor = 1
scaleType = 0
maxType = 1

windowName = "Resize Image"
trackbarValue = "Scale"
trackbarType = "Type: \n 0: Scale Up \n 1: Scale Down"


# load an image
im = cv2.imread("truth.png")

# Create a window to display results
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)

# Callback functions
def scaleImage(*args):
    global scaleFactor
    global scaleType


    if scaleType == 0:

        scaleFactor = 1+ args[0]/100.0
        if scaleFactor == 0:
            scaleFactor = 1
        scaledImage = cv2.resize(im, None, fx=scaleFactor,\
                fy = scaleFactor, interpolation = cv2.INTER_LINEAR)

    else:       
        scaleFactor = 1 - args[0]/100.0
        if scaleFactor == 0:
            scaleFactor = 1
        scaledImage = cv2.resize(im, None, fx=scaleFactor,\
                fy = scaleFactor, interpolation = cv2.INTER_LINEAR)
    print(scaleType)
    cv2.imshow(windowName, scaledImage)

def functionType( *args):
    return 0



cv2.createTrackbar(trackbarValue, windowName, scaleFactor, maxScaleUp, scaleImage)
cv2.createTrackbar(trackbarType, windowName, scaleType, maxType, functionType)


scaleImage(25)

while True:
    c = cv2.waitKey(20)

    if c==27:
        break

cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 25 января 2020

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

import cv2


maxScaleUp = 100
scaleFactor = 1
scaleType = 0
maxType = 1

windowName = "Resize Image"
trackbarValue = "Scale"
trackbarType = "Type: \n 0: Scale Up \n 1: Scale Down"


# load an image
im = cv2.imread("truth.png")

# Create a window to display results
cv2.namedWindow(windowName, cv2.WINDOW_AUTOSIZE)

# Callback functions
def scaleImage(*args):
    global scaleFactor
    global scaleType


    if scaleType == 0:

        scaleFactor = 1+ args[0]/100.0
        if scaleFactor == 0:
            scaleFactor = 1
        scaledImage = cv2.resize(im, None, fx=scaleFactor,\
                fy = scaleFactor, interpolation = cv2.INTER_LINEAR)

    else:       
        scaleFactor = 1 - args[0]/100.0
        if scaleFactor == 0:
            scaleFactor = 1
        scaledImage = cv2.resize(im, None, fx=scaleFactor,\
                fy = scaleFactor, interpolation = cv2.INTER_LINEAR)
    print(scaleType)
    cv2.imshow(windowName, scaledImage)

def functionType( *args):
    global scaleType
    global scaleFactor
    scaleType = args[0]
    scaleFactor = 1 + scaleFactor/100.0
    if scaleFactor ==0:
        scaleFactor = 1
    scaledImage = cv2.resize(im, None, fx=scaleFactor,\
            fy = scaleFactor, interpolation = cv2.INTER_LINEAR)
    cv2.imshow(windowName, scaledImage)


cv2.createTrackbar(trackbarValue, windowName, scaleFactor, maxScaleUp, scaleImage)
cv2.createTrackbar(trackbarType, windowName, scaleType, maxType, functionType)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...