opencv教程(基於python)----關於滑條
阿新 • • 發佈:2019-02-16
其實關於調色盤就兩個主要的函式CV2.getTrackbarPos和CV2.createTrackbar函式。
分別看一下這兩個函式的作用吧,getTrackbarPos是得到滑動條的位置並返回,具體的格式為
cv2.getTrackbarPos('G','image')第一個引數是軌跡條的名稱,第二個引數是畫板的名稱。
createTrackbar函式是建立一個軌跡條可以附加在特定視窗上,通常和回撥函式配合使用。具體的格式為:
cv2.createTrackbar('R','image',0,255,nothing)第一個引數是軌跡條的名稱,第二個引數是視窗的名稱,第三個引數是滑塊的初始位置,第四個是滑塊的最大位置,最後一個是回撥函式。回撥函式的通常格式為
def看起來回調函式有點玄學,沒辦法記住就好了。nothing(x): pass
接著是具體的用法,用滑條做一個調色盤,其中有個是開關,另外三個是控制顏色
import cv2 import numpy as np import matplotlib.pyplot as plt def nothing(x): pass img=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) 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 cv2 import numpy as np import matplotlib.pyplot as plt def nothing(x): pass img=np.zeros((300,512,3),np.uint8) img[:]=255 cv2.namedWindow('image') cv2.createTrackbar('R','image',0,255,nothing) cv2.createTrackbar('G','image',0,255,nothing) cv2.createTrackbar('B','image',0,255,nothing) r=0 g=0 b=0 drawing=False mode=True ix,iy=-1,-1 def draw_circle(event,x,y,flags,param): global ix,iy,drawing,mode,r,g,b if event==cv2.EVENT_LBUTTONDOWN: drawing=True ix,iy=x,y elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON: if drawing==True: if mode==True: cv2.rectangle(img,(ix,iy),(x,y),(b,g,r),-1) else: cv2.circle(img,(x,y),3,(b,g,r),-1) elif event==cv2.EVENT_LBUTTONUP: drawing=False cv2.setMouseCallback('image',draw_circle) switch2='0:CIRCLE\n1:RECTANGLE' cv2.createTrackbar(switch2,'image',0,1,nothing) while(1): cv2.imshow('image',img) k=cv2.waitKey(1)&0xFF r = cv2.getTrackbarPos('R', 'image') g = cv2.getTrackbarPos('G', 'image') b = cv2.getTrackbarPos('B', 'image') if k==27: break h=cv2.getTrackbarPos(switch2,'image') if h==0: mode=not mode cv2.destroyAllWindows()
這裡最下面的開關控制畫小圓還是矩形,很不錯吧。
明天開始核心的影象處理啦。