前言:
- 創建一個簡單的程序來說明滑動條用法:通過調節滑動條來設定畫板顏色。
- 我們要創建一個窗口來顯示顯色,還有三個滑動條來設置B,G,R 的顏色。
- 當我們滑動滾動條是窗口的顏色也會發生相應改變。
- 默認情況下窗口的起始顏色為黑。
例子:

1 # -*- coding: utf-8 -*- 2 3 import cv2 4 import numpy as np 5 6 def nothing(x): 7 pass 8 9 # 創建一副黑色圖像 10 img=np.zeros((300,512,3),np.uint8) 11 12 #設置滑動條組件 13 cv2.namedWindow('image') 14 cv2.createTrackbar('R','image',0,255,nothing) 15 cv2.createTrackbar('G','image',0,255,nothing) 16 cv2.createTrackbar('B','image',0,255,nothing) 17 # 開關,控制是否啟用滑動條 18 switch='0:OFF\n1:ON' 19 cv2.createTrackbar(switch,'image',0,1,nothing) 20 21 while(1): 22 cv2.imshow('image',img) 23 k=cv2.waitKey(1)&0xFF 24 if k==27: 25 break 26 27 r=cv2.getTrackbarPos('R','image') 28 g=cv2.getTrackbarPos('G','image') 29 b=cv2.getTrackbarPos('B','image') 30 s=cv2.getTrackbarPos(switch,'image') 31 if s==0: 32 img[:]=0 33 else: 34 img[:]=[b,g,r] 35 36 #銷毀窗口 37 cv2.destroyAllWindows()
效果:
- cv2.getTrackbarPos() 函數的一個參數是滑動條的名字,第二個參數是滑動條被放置窗口的名字,第三個參數是滑動條的默認位置。
- 第四個參數是滑動條的最大值,第五個函數是回調函數,每次滑動條的滑動都會調用回調函數。
- 回調函數通常都會含有一個默認參數,就是滑動條的位置。在本例中這個函數不用做任何事情,我們只需要pass 就可以了。
- 滑動條的另外一個重要應用就是用作開關按鈕,如例子中的最后一個就是作為開關,只有為NO的時候其他三個起作用。
例子2:
- 結合繪圖的功能,用滑動條做畫筆顏色選擇器。
- 創建一個畫板,可以自選各種顏色的畫筆繪畫各種圖形。

1 # -*- coding: utf-8 -*- 2 3 import cv2 4 import numpy as np 5 6 def nothing(x): 7 pass 8 9 # 當鼠標按下時變為True 10 drawing=False 11 12 # 如果mode為true繪制矩形。按下'm' 變成繪制曲線。 13 mode=True 14 ix,iy=-1,-1 15 16 # 創建回調函數 17 def draw_circle(event,x,y,flags,param): 18 r=cv2.getTrackbarPos('R','image') 19 g=cv2.getTrackbarPos('G','image') 20 b=cv2.getTrackbarPos('B','image') 21 color=(b,g,r) 22 23 global ix,iy,drawing,mode 24 25 # 當按下左鍵是返回起始位置坐標 26 if event==cv2.EVENT_LBUTTONDOWN: 27 drawing=True 28 ix,iy=x,y 29 # 當鼠標左鍵按下並移動是繪制圖形。event 可以查看移動,flag 查看是否按下 30 elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON: 31 if drawing==True: 32 if mode==True: 33 cv2.rectangle(img,(ix,iy),(x,y),color,-1) 34 else: 35 # 繪制圓圈,小圓點連在一起就成了線,3 代表了筆畫的粗細 36 cv2.circle(img,(x,y),3,color,-1) 37 # 下面注釋掉的代碼是起始點為圓心,起點到終點為半徑的 38 # r=int(np.sqrt((x-ix)**2+(y-iy)**2)) 39 # cv2.circle(img,(x,y),r,(0,0,255),-1) 40 # 當鼠標松開停止繪畫。 41 elif event==cv2.EVENT_LBUTTONUP: 42 drawing==False 43 # if mode==True: 44 # cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) 45 # else: 46 # cv2.circle(img,(x,y),5,(0,0,255),-1) 47 48 img=np.zeros((512,512,3),np.uint8) 49 cv2.namedWindow('image') 50 cv2.createTrackbar('R','image',0,255,nothing) 51 cv2.createTrackbar('G','image',0,255,nothing) 52 cv2.createTrackbar('B','image',0,255,nothing) 53 cv2.setMouseCallback('image',draw_circle) 54 while(1): 55 cv2.imshow('image',img) 56 57 k=cv2.waitKey(1)&0xFF 58 if k==ord('m'): 59 mode=not mode 60 elif k==27: 61 break
效果: