Как создать трекбары, которые не вызывают никаких функций? OpenCV 3.1 с Python 2.7

Я пытаюсь установить порог изображения. Я использовал функцию cv2.createTrackbar как-
cv2.createTrackbar('High H','image',0,179, None).
Теперь у меня возникли проблемы с последней частью. Далее в моем коде я использую highH = cv2.getTrackbarPos('High H','image'), чтобы получить значение трекбара и использовать его в функции cv2.inRange. Таким образом, становится довольно очевидным, что мне не нужно вызывать функцию в качестве последнего аргумента функции. Теперь проблема в том, что я не могу ввести функцию. Я попытался удалить последнюю часть, я получил ошибку-

cv2.createTrackbar работает только с 5 аргументами. Дано всего 4.

Хм, ладно, кажется, я не могу пропустить часть.
Затем я попробовал обратный вызов, и ничего. Я получил эту ошибку: -

Когда ничего не используется:- NameError: имя "ничего" не определено
При использовании обратного вызова:- NameError: имя "обратный вызов" не определено

Хорошо, через некоторое время я попытался использовать None. Получил эту ошибку: -

TypeError: on_change должен быть вызываемым

Итак, как мне использовать функцию cv2.createTrackbar без вызова функции?

Спасибо!


person Community    schedule 29.03.2016    source источник


Ответы (2)


Почему бы просто не создать простую функцию, как и ожидалось?

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

import cv2
def f(x): return x
win = cv2.namedWindow("MyImage")
tb = cv2.createTrackbar("MyTrackbar","MyImage",0,179,f)
#assume you have some cv2 image already loaded
cv2.imshow("MyImage", img)

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

import cv2
win = cv2.namedWindow("MyImage")
tb = cv2.createTrackbar("MyTrackbar","MyImage",0,179,lambda x:x)
#assume you have some cv2 image already loaded
cv2.imshow("MyImage", img)
person svohara    schedule 29.03.2016
comment
Кроме того, вы можете просто использовать def f(x): return. Нет необходимости иметь возвращаемое значение, так как в этом случае оно нигде не будет использоваться. - person svohara; 29.03.2016
comment
вы хотите создать пустую функцию, которая ничего не делает, но вызывается при перемещении положения трекбара? И если я сделаю какую-то функцию, то нужно ли мне делать и основную функцию? Потому что вся моя программа не в функции - person ; 29.03.2016
comment
Благодаря тонну! Работал как шарм! - person ; 29.03.2016

def f():
    pass
cv2.createTrackbar('thing', 'other thing', 0, 179, f)

Это также работает.

person Ev C    schedule 10.06.2019