其实关于调色板就两个主要的函数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()
这里最下面的开关控制画小圆还是矩形,很不错吧。
明天开始核心的图像处理啦。