原文:Trackbar as the Color Palette
轨迹栏绑定到OpenCV窗口
- cv2.getTrackbarPos()
- cv2.createTrackbar()
我们将创建一个简单的应用程序,显示您指定的颜色。您有一个显示颜色的窗口和三个轨道栏,用于指定B,G,R各颜色。您可以滑动轨迹栏并相应地窗口颜色更改。默认情况下,初始颜色将设置为黑色。
cv2.getTrackbarPos()& cv2.createTrackbar()
第一个参数是轨迹栏名称
第二个参数是它所属的窗口名称,
第三个参数是默认值,
第四个参数是最大值,
第五个参数是执行的回调函数每次轨迹栏值都会发生变化。
回调函数始终具有默认参数,即轨迹栏位置。在我们的例子中,函数什么都不做,所以我们简单地通过。
轨迹栏的另一个重要应用是将其用作按钮或开关。默认情况下,OpenCV没有按钮功能。因此,您可以使用跟踪栏来获得此类功能。在我们的应用程序中,我们创建了一个开关,其中应用程序仅在开关打开时有效,否则屏幕始终为黑色。
import cv2
import numpy as np
#创建回调函数
def nothing(*arg):
pass
#创建一个黑色窗口
window = np.zeros((300,512,3), np.uint8)
cv2.namedWindow('What tea is black tea plus green tea?')
#创建改变颜色的滑动条
cv2.createTrackbar('BlackTea','What tea is black tea plus green tea?',0,255,nothing)
cv2.createTrackbar('GreenTea','What tea is black tea plus green tea?',0,255,nothing)
cv2.createTrackbar('BlueTea','What tea is black tea plus green tea?',0,255,nothing)
#创建控制函数的开关
cv2.createTrackbar('Show Tea', 'What tea is black tea plus green tea?',0,1,nothing)
while True:
cv2.imshow('What tea is black tea plus green tea?', window)
#获取四个滑动条的位置
r = cv2.getTrackbarPos('BlackTea','What tea is black tea plus green tea?')
g = cv2.getTrackbarPos('GreenTea','What tea is black tea plus green tea?')
b = cv2.getTrackbarPos('BlueTea','What tea is black tea plus green tea?')
s = cv2.getTrackbarPos('Show Tea','What tea is black tea plus green tea?')
if s == 0 :
window[:] = 0
else:
window[:] = [b,g,r]
ch = cv2.waitKey(1) & 0xFF
if ch == 27:
break
cv2.destroyAllWindows()
结果:
图画板
创建一个图画板,默认绘制矩形,按下'm'键变为绘制线条。
import cv2
def nothing(x):
pass
#创建鼠标事件
def draw_circle(event,x,y,flags,param):
#获取四个滑动条的位置
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
color = (b,g,r)
global position, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
position = (x, y) #当按下左键是返回起始位置坐标
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON: #鼠标左键拖拽
if drawing == True:
if mode == True:
cv2.rectangle(img,position,(x,y),color,-1) #绘制矩形
else:
cv2.circle(img,(x,y),2,color,-1) #绘制圆圈,小圆点连在一起就成了线,3代表了笔画的粗细
elif event == cv2.EVENT_LBUTTONUP: #鼠标松开停止绘画
drawing = False
#当按下鼠标时变为True
drawing = False
#如果mode为true时候绘制矩形,按下m变成绘制曲线
mode = True
img = cv2.imread(r'C:\Users\x\Desktop\12.jpg', cv2.IMREAD_ANYCOLOR)
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.setMouseCallback('image',draw_circle)
while (1):
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
结果: