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
我想使用轨迹栏来控制图像的模糊度。给定的 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