內容來自OpenCV-Python Tutorials 自己翻譯整理
目標:
使用捲軸綁定視窗
學習如下函數 cv2.getTrackbarPos(), cv2.createTrackbar()
範例代碼:
這裡建立了一個簡單的範例來現實使用者指定的顏色。使用者使用三個捲軸來指定B,G,R值,同時使用者選擇的顏色會顯示在視窗當中。使用者拖動捲軸會關聯到視窗中顏色的改變。初始預設的顏色會被設定為黑色。
對於cv2.getTrackbarPos()函數,第一個參數是捲軸的名稱,第二個個參數是關聯的視窗名稱,第三個參數是預設值,第四個參數是是最大值,第五個參數是執行所有改變值的回呼函數。回呼函數總是有一個預設參數,這個參數是捲軸的位置。在本例子當中,函數該函數不做任何事情,簡單略過即可。
捲軸另外一個重要的應用是用來作為按鈕或者開關。預設情況下,opencv裡面沒有按鈕功能。所以使用者需要使用捲軸來實現這樣的一個功能。在本例子當中,我們建立了一個開關,這個開關控制這個應用程式的顏色變化功能是否開啟,如果開關功能關閉,那麼螢幕一直都是黑色的。
import cv2import numpy as npdef nothing(x): pass# 建立一個黑色背景的視窗img = np.zeros((300,512,3), np.uint8)cv2.namedWindow('image')# 建立改變顏色的捲軸cv2.createTrackbar('R','image',0,255,nothing)cv2.createTrackbar('G','image',0,255,nothing)cv2.createTrackbar('B','image',0,255,nothing)# 建立控制函數的開關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: 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()
練習:
建立一個畫圖程式,這個程式可以調整顏色和畫刷的半徑。使用捲軸調整。
import cv2import numpy as np# mouse callback functiondef nothing(x): passdef draw_circle(event,x,y,flags,param): s=cv2.getTrackbarPos('size','image') b=cv2.getTrackbarPos('B','image') r=cv2.getTrackbarPos('R','image') g=cv2.getTrackbarPos('G','image') if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),s,(b,g,r),-1)# Create a black image, a window and bind the function to windowimg = np.zeros((512,512,3), np.uint8)cv2.namedWindow('image')cv2.createTrackbar('R','image',0,255,nothing)cv2.createTrackbar('G','image',0,255,nothing)cv2.createTrackbar('B','image',0,255,nothing)cv2.createTrackbar('size','image',1,255,nothing)cv2.setMouseCallback('image',draw_circle)while(1): cv2.imshow('image',img) if cv2.waitKey(20) & 0xFF == 27: breakcv2.destroyAllWindows()
雙擊畫圈