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

Phi*_*ipp 3 python opencv trackbar

我想通过使用轨迹栏来控制图像的模糊。给定的MWE导入带有轨迹栏的图片,该轨迹栏设置的光圈线性大小(ksize)必须为1或正奇数。奇怪的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()
Run Code Online (Sandbox Code Playgroud)

通过运行此代码,将打开一个窗口,在输入图像的顶部带有所需的跟踪栏。滑块的起始位置是所需的位置,但是通过更改贴图机的位置,不会对显示的图像造成模糊或任何重大变化。

主要问题是为什么返回的轨迹栏位置对不会产生任何影响medianBlur()。我的第一个想法是建议在while循环或回调函数内部出现错误。除此之外,我想知道为什么getTrackbarPos返回负数。

我正在将Python 3.6与Anaconda 1.9.2一起使用。感谢您的任何帮助!

Rod*_*osp 5

getTrackbarPos参数需要跟踪栏的名称和窗口的名称。您正在使用名称创建轨迹栏,Blur并读为ksize,更改

ksize = cv2.getTrackbarPos('Blur', 'Image')
Run Code Online (Sandbox Code Playgroud)

ksize = cv2.getTrackbarPos('ksize', 'Image')
Run Code Online (Sandbox Code Playgroud)

或更改其他方法(createTrackbar方法)。

此外,如在评论中提到的,你也可以更新ksizeon_change回调。

附带说明,您还需要调整处理奇数值的方式,如果轨迹栏位置为1,则ksize最终为-3