OpenCV Python:使用轨迹栏模糊图像

OpenCV Python: Blur image using trackbar

我想使用轨迹栏来控制图像的模糊度。给定的 MWE 导入带有轨迹栏的图片,该轨迹栏设置光圈线性大小 (ksize),它必须是一个或正奇数。奇怪的是 getTrackbarPos returns 一个负数,这使得需要将 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()

通过 运行 此代码 window 打开输入图像顶部所需的轨迹栏。滑块的起始位置是所需的位置,但通过更改滑块的位置,显示的图像不会模糊或发生任何重大变化。

主要问题是为什么返回的trackbar位置对medianBlur()没有任何影响。我的第一个想法表明 while 循环或回调函数内部存在错误。 除此之外,我想知道为什么 getTrackbarPos returns 负数。

我正在使用 Python 3.6 和 Anaconda 1.9.2。感谢您的帮助!

getTrackbarPos 参数需要轨迹栏的名称和 window 的名称。您正在创建名称为 Blur 的轨迹栏并读取为 ksize,更改为

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

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

或者换一种方式(createTrackbar 方法)。

此外,如评论中所述,您还可以在 on_change 回调中更新 ksize

作为旁注,您还需要调整处理奇数的方式,如果轨迹栏位置为 1,则 ksize 最终为 -3