【转载】OpenCV+Python使用轨迹栏作为调色板(九)

相信接触过java的人都知道轨迹栏,它在java里被称为滑动条控件,今天我们也将在OpenCV里实现它,将其作为基础的学习。

在这里,我们将创建一个简单的应用程序,以显示指定的颜色。我们将创建一个显示颜色的窗口,以及三个用于指定B,G,R颜色的跟踪栏。滑动轨迹栏,并相应地更改窗口颜色。默认情况下,初始颜色将设置为黑色。

我们需要了解几个函数:

createTrackbar(const string& trackbarname, const string&winname, int* value, int count ,TrackbarCallback onChange = 0, void* userdata = 0)

对于cv.createTrackbar()函数,其参数定义为:

参数1:轨迹条名字

参数2:窗口名字

参数3:滑块初始位置

参数4:表示滑块达到最大位置的值

参数5:默认值为0,指向回调函数

参数6:默认值为0,用户传给回调函数的数据值

getTrackbarPos(const string& trackbarname, const string& winname)

函数作用:

获取滑动条的位置的值

参数1:进度条名称

参数2:窗口名称

返回值:进度条位置

getTrackbarPos( trackbarname,winname )

参数定义:

trackbarname – 跟踪栏的名称。

winname – 跟踪栏的父窗口的名称。

该函数返回指定轨迹栏的当前位置。

轨迹栏的另一个重要应用是将其用作按钮或开关。默认情况下,OpenCV不具有按钮功能。因此,我们可以使用轨迹栏来获得此类功能。在应用程序中,我们创建了一个开关,只有在该开关为ON的情况下该应用程序才能运行,否则屏幕始终为黑色。

现在来看代码:

	view plaincopy to clipboardprint?
1. import numpy as np  
2. import cv2 as cv  
3. def nothing(x):  
4.     pass  
5. # Create a black image, a window  
6. img = np.zeros((300,512,3), np.uint8)  
7. cv.namedWindow('image')  
8. # create trackbars for color change  
9. cv.createTrackbar('R','image',0,255,nothing)  
10.cv.createTrackbar('G','image',0,255,nothing)  
11.cv.createTrackbar('B','image',0,255,nothing)  
12.# create switch for ON/OFF functionality  
13.switch = '0 : OFF \n1 : ON'  
14.cv.createTrackbar(switch, 'image',0,1,nothing)  
15.while(1):  
16.    cv.imshow('image',img)  
17.    k = cv.waitKey(1) & 0xFF  
18.    if k == 27:  
19.        break  
20.    # get current positions of four trackbars  
21.    r = cv.getTrackbarPos('R','image')  
22.    g = cv.getTrackbarPos('G','image')  
23.    b = cv.getTrackbarPos('B','image')  
24.    s = cv.getTrackbarPos(switch,'image')  
25.    if s == 0:  
26.        img[:] = 0  
27.    else:  
28.        img[:] = [b,g,r]  
29.cv.destroyAllWindows()  

我们可以看到效果:
在这里插入图片描述

当然了,这目前还只是个可以调色的色板,我们上此已经讲过OpenCV中关于鼠标用作画笔的功能,现在我们来创建一个画板,然后用轨迹栏来改变画笔的颜色,类似于我们电脑的“画图”软件一样。

在上个教程中,我们使用EVENT_FLAG_LBUTTON用来表示当前鼠标左键按下,用EVENT_MOUSEMOVE表示鼠标移动,采用cv2.circle当作画笔。上个教程中我们默认画笔颜色为红色,倒数第二个参数为颜色表示,其代码为:

cv2.circle(img, (x, y), 1, [0, 0, 255], 1)

但在此教程中,为了随时改变画笔的颜色,我们需要传入动态的变量;

cv2.circle(img, (x, y), 1, [b, g, r], 1)

b,g,r则由轨迹栏确定:

cv2.createTrackbar(‘R’, ‘image’, 0, 255, callback)

cv2.createTrackbar(‘B’, ‘image’, 0, 255, callback)

cv2.createTrackbar(‘G’, ‘image’, 0, 255, callback)

我们必须还要注意,对于OpenCV而言,它的颜色格式为BGR,并非是RGB,所以我们需要正确的传入参数。

现在我们来看代码:

	view plaincopy to clipboardprint?
1. import cv2  
2. import numpy as np  
3.   
4. def callback(object):  
5.    pass  
6.  
7. img = np.zeros((400, 400, 3), np.uint8)  
cv2.namedWindow('image')  
8.  
9. switch = '0:OFF\n1:ON'  
10.cv2.createTrackbar(switch, 'image', 0, 1, callback)  
11.  
12.cv2.createTrackbar('R', 'image', 0, 255, callback)  
13.cv2.createTrackbar('B', 'image', 0, 255, callback)  
14.cv2.createTrackbar('G', 'image', 0, 255, callback)  
15.  
16.def Mouseback(event, x, y, flags, param):  
17.    if flags == cv2.EVENT_FLAG_LBUTTON and event == cv2.EVENT_MOUSEMOVE:  
18.        cv2.circle(img, (x, y), 1, [b, g, r], 1)  
19.  
20.img[:] = [255, 255, 255]  
21.  
22.while(True):  
23.    r = cv2.getTrackbarPos('R', 'image')  
24.    g = cv2.getTrackbarPos('G', 'image')  
25.    b = cv2.getTrackbarPos('B', 'image')  
26.    if cv2.getTrackbarPos(switch, 'image') == 1:  
27.        cv2.setMouseCallback('image', Mouseback)  
28.    else:  
29.        img[:] = [255, 255, 255]  
30.    if cv2.waitKey(10) & 0xFF == ord('q'):  
31.        break  
32.    cv2.imshow('image', img)  
33.cv2.destroyAllWindows()  

实验效果:
在这里插入图片描述

按下Q键退出,我们可以看到,画笔的颜色随时都可以被更改。

现在我们来进行一些更高级的操作,我们将上一个教程的代码与轨迹栏完全结合起来,在上一个教程中,我们创建了一个画板,用Q键进行切换画笔,默认时为画矩形,按下Q为画线。现在我们将改变画笔的颜色,从而完成更高级的操作。thin拖动条可以用来调节画线的粗细程度,我们仍将其参数传入:

cv2.circle(img, (x, y), thin, color, -1)

同时,为了方便,我们也加入橡皮擦功能,其实际上就是将画板清空为白色。

我们来看代码:

	view plaincopy to clipboardprint?
1. import cv2  
2. import numpy as np  
3.   
4. drawing = False  
5. mode = True  
6. ix, iy = -1, -1  

7. def nothing(x):  
8.     pass  
9.     
10.def draw_circle(event, x, y, flags, param):  
11.    r = cv2.getTrackbarPos('R', 'image')  
12.    g = cv2.getTrackbarPos('G', 'image')  
13.    b = cv2.getTrackbarPos('B', 'image')  
14.    color = (b, g, r)  
15.    s = cv2.getTrackbarPos('eraser', 'image')  
16.    if s == 1:  
17.        color = (255, 255, 255)  
18.    thin = cv2.getTrackbarPos('thin', 'image')  
19.  
20.    global ix, iy, drawing, mode  
21.    if event == cv2.EVENT_LBUTTONDOWN:  
22.        drawing = True  
23.        ix, iy = x, y  
24.    elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:  
25.        if drawing:  
26.            if mode:  
27.                cv2.rectangle(img, (ix, iy), (x, y), color, -1)  
28.            else:  
29.                cv2.circle(img, (x, y), thin, color, -1)  
30.    elif event == cv2.EVENT_LBUTTONUP:  
31.        drawing == False  
32.    
33.img = np.zeros((512, 512, 3), np.uint8)  
34.img[:] = 255  
35.cv2.namedWindow('image')  
36.cv2.createTrackbar('R', 'image', 0, 255, nothing)  
37.cv2.createTrackbar('G', 'image', 0, 255, nothing)  
38.cv2.createTrackbar('B', 'image', 0, 255, nothing)   
39.cv2.createTrackbar('eraser', 'image', 0, 1, nothing)  
40.cv2.createTrackbar('thin', 'image', 1, 50, nothing)  
41.  
42.cv2.setMouseCallback('image', draw_circle)  
43.  
44.while (1):  
45.    cv2.imshow('image', img)  
46.    k = cv2.waitKey(1) & 0xFF  
47.    if k == ord('q'):  
48.        mode = not mode  
49.    elif k == 27:  
50.        break  

实验效果:
在这里插入图片描述

是不是相当的漂亮!按下esc退出,按下q进行画矩形和画线切换。我们也可以简单的完成一个画图操作。

那么本此教程到此结束,大家平时还要多练练,看不如练。

查看文章汇总页https://blog.csdn.net/weixin_44237705/article/details/107864965
更多openvino技术信息可以入群交流~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值