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()
opencv教程(基于python)----关于滑条_第1张图片

看起来还算不错,接下来我们试着把滑块与鼠标结合一下。

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()
opencv教程(基于python)----关于滑条_第2张图片

这里最下面的开关控制画小圆还是矩形,很不错吧。

明天开始核心的图像处理啦。

你可能感兴趣的:(opencv教程(基于python)----关于滑条)