OpenCV Python: размытие изображения с помощью трекбара - PullRequest
0 голосов
/ 05 ноября 2018

Я хотел бы контролировать размытие изображения с помощью трекбара. Данное 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. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 05 ноября 2018

getTrackbarPos аргументы ожидают имя трекбара и название окна. Вы создаете трекбар с именем Blur и читаете как ksize, измените

ksize = cv2.getTrackbarPos('Blur', 'Image')

до

ksize = cv2.getTrackbarPos('ksize', 'Image')

или измените наоборот (метод createTrackbar).

Кроме того, как уже упоминалось в комментариях, вы также можете обновить ksize в обратном вызове on_change.

В качестве примечания, вам также необходимо настроить способ обработки нечетных значений: если позиция трек-бара равна 1, размер ksize заканчивается как -3

...