1. 程式人生 > >opencv教程(基於python)----關於滑條

opencv教程(基於python)----關於滑條

其實關於調色盤就兩個主要的函式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()

這裡最下面的開關控制畫小圓還是矩形,很不錯吧。

明天開始核心的影象處理啦。