Я хотел бы контролировать размытие изображения с помощью трекбара. Данное MWE импортирует изображение с трекбаром, который устанавливает линейный размер апертуры (ksize
), который должен быть одним или положительным нечетным числом. Странно, getTrackbarPos
возвращает отрицательное число, из-за чего необходимо умножить ksize
на -2 и вычесть 1. Внутри бесконечного цикла изображение размыто и отображается.
import cv2
# Callback function for trackbar
def on_change(self):
pass
# Reads image with 0 as GRAY and 1 as BGR
img = cv2.imread('example.JPG', 0)
# Creates window
cv2.namedWindow('Image')
# Creates Trackbar with slider position and callback function
low_k = 1 # slider start position
high_k = 21 # maximal slider position
cv2.createTrackbar('Blur', 'Image', low_k, high_k, on_change)
# Infinite loop
while(True):
ksize = cv2.getTrackbarPos('ksize', 'Image') # returns trackbar position
ksize = -2*ksize-1 # medianBlur allows only odd ksize values
# Blures input image
median = cv2.medianBlur(img, ksize) # source, kernel size
cv2.imshow('Image', median) # displays image 'median' in window
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
При запуске этого кода открывается окно с желаемой трекбаром поверх входного изображения. Начальная позиция ползунка - одна по желанию, но при изменении положения затира нет размытия или каких-либо существенных изменений отображаемого изображения.
Основной вопрос - почему возвращаемая позиция трекбара не влияет на medianBlur()
. Моя первая мысль предполагает ошибку либо внутри цикла while
, либо в функции обратного вызова.
Кроме того, я хотел бы знать, почему getTrackbarPos
возвращает отрицательные числа.
Я использую Python 3.6 с Anaconda 1.9.2. Спасибо за любую помощь!