OpenCV Trackbar,如何在轨迹栏窗口上显示最大值,最小值和当前值

时间:2015-08-31 14:51:25

标签: python opencv

如何在轨迹栏窗口上显示条形图的范围(最大值,最小值)和当前指向值?以下是使用轨迹栏的示例。

# trackbar
import cv2
import numpy as np

def nothing(x):
    pass

img = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('image')

# Create trackbars

cv2.createTrackbar('R', 'image', 255, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)

# Create switch for on/off

switch = '0: OFF \n1: ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)

while(1):
    cv2.imshow('image',img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:   # 27 is Escape
        break
    r = cv2.getTrackbarPos('R','image')
    g = cv2.getTrackbarPos('G','image')
    b = cv2.getTrackbarPos('B','image')
    s = cv2.getTrackbarPos(switch,'image')

    if s == 0:
        img[:] = 0

    else:
        img[:] = [b,g,r]

cv2.destroyAllWindows()

哪些不显示值: enter image description here

2 个答案:

答案 0 :(得分:0)

无法指示与pos = 0不同的最小值,但是由于轨迹栏没有刻度标签,因此有时将第一个刻度重新解释为1(pos + 1)很有用

答案 1 :(得分:0)

我在大学活动中遇到了类似的情况。我做了一个解决方法,我使用 cv.putText 方法将 BGR 轨迹栏的值放在图像窗口上。

我为 R 值所做的步骤(对于 BG 值将相同):

  1. 创建一个函数 update_R_value。将此函数传递给 createTrackBarcv2 方法。

  2. 在图像上放置可以显示 R 值的文本。初始值将为 0(零)。假设我们把它放在 (x, y) 位置。

  3. 然后在 update_R_value 中,每次轨迹栏位置更改时,我都会更改此文本值。

img = np.zeros((512,512,3), np.uint8)
bgr_track = {'B': 0, 'G': 0, 'R': 0}    # Initial values of BGR
    
# Values of trackbar as text on image for R trackbar.
font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.putText(img, "R: ", (10, 330), font, 0.5, (255,255,255), 1)
img = cv2.putText(img, "0", (30, 330), font, 0.5, (255,255,255), 1)
    
def update_R_value(x):
    global font, img, bgr_track
    img = cv2.putText(img, f"{bgr_track['R']}", (30, 330), font, 0.5, (0,0,0), 1)    # Fill previous text pixels with black
    img = cv2.putText(img, f"{x}", (30, 330), font, 0.5, (255,255,255), 1)   # Put new text with color white
    bgr_track['R'] = x

注意:

在 OpenCV 中,当我们在图像上放置文本时,它只是更改该特定位置的像素值以显示文本。它涉及跟踪先前的 BGR 值,因为 cv2.putText 不记录先前更改的像素值。

因此,为了更新新的轨迹栏值,首先我将带有先前值的文本放入黑色,然后将更新后的值放入白色并将新值保存在字典中以重复该过程。

为蓝色和绿色轨迹栏完成后的完整输出是这样的:

Display BGR values

您还可以查看完整代码 here

谢谢。