使用Python的cv2.createTrackbar控制面板

时间:2018-06-06 12:47:57

标签: python opencv

我无法为我的跟踪栏创建控制面板。该文档仅给出了C ++代码的解释。

它指出,如果轨迹栏应该连接到控制面板,那么" winname可以为空(或NULL)。" See the Doc

我尝试使用NULL和' NULL'但在Python中,这将输出错误。 我可能不会理解这里的基本原则,所以如果你能帮助我,谢谢你。

当我使用Jeru Luke的代码时,这是我得到的输出:

Paint application with the unwanted black windows above the control panel

J.S

2 个答案:

答案 0 :(得分:0)

为了创建一个轨迹栏,建议一起创建一个单独的窗口。创建与图像具有相同窗口的轨迹栏会限制要显示的图像的空间。

在下面的示例中,我创建了一个演示,用户可以在其中执行以下操作:

  1. 在平面上绘图,就像在Windows上使用Paint应用程序一样。
  2. 调整画笔的厚度
  3. 从三个轨道栏中选择一种颜色,即R,G和B.
  4. 在下面的代码中,我使用了4个轨道栏:

    • 一个用于画笔的厚度
    • 其余三个为每个颜色通道。

    <强>代码:

    '''
    PAINT APPLICATION
    can draw using a paint brush with varied sizes
    '''
    
    import cv2
    import numpy as np
    
    drawing = False # true if mouse is pressed
    mode = True 
    ix, iy = -1, -1
    
    def nothing(x):
        pass
    
    cv2.namedWindow('Controls', cv2.WINDOW_NORMAL)  #--- window to have all the controls
    
    cv2.createTrackbar("R", "Controls", 0, 255, nothing)
    cv2.createTrackbar("G", "Controls", 0, 255, nothing)
    cv2.createTrackbar("B", "Controls", 0, 255, nothing)
    
    cv2.createTrackbar("Paint brush thickness", "Controls",0, 30, nothing)
    
    def draw_circle(event,x,y,flags,param):
        global ix,iy,drawing,mode
    
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix, iy = x, y
    
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing == True:
                cv2.circle(img, (x, y), pb_thick, (r, g, b), -1)
    
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            cv2.circle(img, (x, y), pb_thick, (r, g, b), -1)
    
    
    img = np.zeros((512, 512, 3), np.uint8)
    cv2.namedWindow('image')
    cv2.setMouseCallback('image', draw_circle)
    
    while(1):
        cv2.imshow('image',img)
    
        r = cv2.getTrackbarPos("R", "Controls")
        g = cv2.getTrackbarPos("G", "Controls")
        b = cv2.getTrackbarPos("B", "Controls")
    
        pb_thick = cv2.getTrackbarPos("Paint brush thickness", "Controls")
    
        k = cv2.waitKey(1) & 0xFF
        if k == ord('m'):
            mode = not mode
        elif k == 27:
            break
    
    cv2.destroyAllWindows()
    

    注意我已经为轨迹栏使用了一个名为Controls的窗口,为图像使用了另一个名为image的窗口。我传入了一组类似黑板的黑色像素。您可以使用相同或传递图像。

    示例输出

    如果你运行它会是这样的:

    enter image description here

答案 1 :(得分:0)

(经过测试,可以正常使用)
使用空字符串""。像这样:

cv2.createTrackbar("bar_name", "", 0, 255, some_callback_func)

这将与您在C ++中所期望的一样。跟踪栏(或按钮,如果需要)将显示在控制面板上。

您需要按ctl+p(或单击控制面板图标)以弹出并显示控制面板窗口。

文档为here。它指出,如果将跟踪栏连接到控制面板,则 Note [仅Qt后端] winname可以为空(或NULL)。关键字 empty 是关键。希望对您有所帮助。我已经测试过,它可以正常工作。