OpenCV Python:使用滑动条模糊图像

4

我想通过使用轨迹条来控制图像的模糊程度。给定的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()

通过运行此代码,会打开一个窗口,在输入图像上方显示所需的轨道栏。滑块的起始位置是1,但通过改变滑块的位置,显示的图像没有模糊或任何明显的变化。
主要问题是为什么返回的轨道栏位置没有影响medianBlur()。我的第一个想法是在while循环或回调函数内出现了错误。 此外,我想知道为什么getTrackbarPos返回负数。
我正在使用Python 3.6和Anaconda 1.9.2。谢谢您的帮助!

1
通常情况下,您会在传递给createTrackbar的回调函数中更改变量...但无论如何,cv2.getTrackbarPos('ksize', 'Image') 应该是:cv2.getTrackbarPos('Blur', 'Image'),以匹配您在createTrackbar部分提供的参数。 - api55
1个回答

5

getTrackbarPos函数需要两个参数,分别为滑动条的名称和窗口的名称。你创建了一个名为Blur的滑动条,并将其读作ksize,请更改。

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

to

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

或者反过来改变(使用createTrackbar方法)。
另外,正如在评论中提到的那样,您还可以在on_change回调中更新ksize
顺便提一下,如果轨迹条位置为1,则需要调整处理奇数值的方式,ksize最终会变成-3。

1
这解决了问题!我知道你的附注只是为了测试。非常感谢! - Philipp
我很高兴能够帮忙! - Rodolfo Donã Hosp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接