OpenCV竟然可以这样学!成神之路终将不远(五)

简介: OpenCV竟然可以这样学!成神之路终将不远(五)


返回目录

目录

5 轨迹栏作为调色板

5 轨迹栏作为调色板
5.1 学习目标
了解将轨迹栏固定到OpenCV窗口
这里所要用到的函数有cv.getTrackbarPos、cv.createTrackbar等。
5.2 代码演示
在这里,我们将创建一个简单的应用程序,以显示您指定的颜色。您有一个显示颜色的窗口,以及三个用于指定B、G、R颜色的跟踪栏。滑动轨迹栏,并相应地更改窗口颜色。默认情况下,初始颜色将设置为黑色。

对于cv.getTrackbarPos() 函数,第一个参数是轨迹栏名称,第二个参数是它附加到的窗口名称,第三个参数是默认值(也就是打开窗口的初始值),第四个参数是最大值,第五个是执行的回调函数每次跟踪栏值更改。回调函数始终具有默认参数,即轨迹栏位置。在我们的例子中,函数什么都不做,所以我们简单地通过。

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

代码如下:

import numpy as np
import cv2 as cv

def nothing(x):
pass

创建一个黑色的图像,一个窗口

img = np.zeros((250, 520, 3), np.uint8)
cv.namedWindow('image', cv.WINDOW_NORMAL) # cv.WINDOW_NORMAL表示窗口可以拉伸

创建颜色变化的轨迹栏

cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('B', 'image', 0, 255, nothing)

为ON/OFF功能创建开关

switch = '0 : OFF\n1 : ON'
cv.createTrackbar(switch, 'image', 0, 1, nothing)

while True:
cv.imshow('image', img)
if cv.waitKey(1) & 0xFF == 27:
break

# 得到四条轨迹的当前位置
r = cv.getTrackbarPos('R', 'image')
g = cv.getTrackbarPos('G', 'image')
b = cv.getTrackbarPos('B', 'image')
s = cv.getTrackbarPos(switch, 'image')
if s == 0:  # 如果switch为0,全部像素设为0
    img[:] = 0
else:  # 如果switch为1,则根据四条轨迹指定的像素上色
    img[:] = [b, g, r]

cv.destroyAllWindows()
运行结果如下:

5.3 练习题
使用轨迹栏创建颜色和画笔半径可调的Paint应用程序。有关绘制的信息,请参阅有关鼠标处理的先前教程。具体代码如下(可以先自己回忆上一节内容,然后手动自己练一练,不会了再看代码):
import numpy as np
import cv2 as cv

ix, iy = -1, -1

drawing初始值设为False,否则一开始移动鼠标就会画圆

drawing = False # 如果按下鼠标,则为真
color = [0, 0, 0]
radius = 3

鼠标回调函数

def draw_image(event, x, y, flags, param):
global ix, iy, drawing, color, radius
if event == cv.EVENT_LBUTTONDOWN: # 如果接收到按下左键的事件,就将drawing置为True
drawing = True
ix, iy = x, y

elif event == cv.EVENT_MOUSEMOVE:  # 判断是否接收到鼠标移动的事件
    if drawing:  # 如果鼠标按下了,将会画圆
        cv.circle(img=img, center=(x, y), radius=radius, color=color, thickness=-1, lineType=cv.LINE_AA)

elif event == cv.EVENT_LBUTTONUP:  # 如果检测到松开左键,那么将drawing置为False
    drawing = False
    print('你松开了鼠标!')

def nothing(x):
pass

创建一个全黑的模板

img = np.full((300, 520, 3), 255, np.uint8)
img_b, img_g, img_r = cv.split(img)

创建一个可拉伸的名为image的窗口

cv.namedWindow('image')
cv.imshow('image', img)

创建颜色变化的轨迹栏

"""
方法内部不要写xxx=这种形式,原因是因为Python底层由C来写,调用底层C语言在编译时无法解析这个参数的名称,
而目前Python的底层设计无法解决这个问题,所以直接传入参数即可,不要加入xxx=,这里语法没问题。
"""

cv.createTrackbar(trackbarName='B', windowName='image', value=0, count=255, onChange=nothing)

cv.createTrackbar('B', 'image', 0, 255, nothing)
cv.createTrackbar('G', 'image', 0, 255, nothing)
cv.createTrackbar('R', 'image', 0, 255, nothing)
cv.createTrackbar('Radius', 'image', 0, 10, nothing)

为ON/OFF功能创建开关

switch = '0:OFF\n1:ON'
cv.createTrackbar(switch, 'image', 0, 1, nothing)

设置鼠标回调函数

cv.setMouseCallback('image', draw_image, (0, 0, 0))

while True:
cv.imshow('image', img)
if cv.waitKey(1) & 0xFF == 27:
break

# 得到四条轨迹的当前位置
b = cv.getTrackbarPos('B', 'image')
g = cv.getTrackbarPos('G', 'image')
r = cv.getTrackbarPos('R', 'image')
s = cv.getTrackbarPos(switch, 'image')
radius = cv.getTrackbarPos('Radius', 'image')

if s == 0:
    color = 0
    img[:] = 0
else:
    color = [b, g, r]

cv.destroyAllWindows()
运行结果如下:

欢迎评论区留言,一起探讨OpenCV成神之路的奥秘。

顺便给我加个关注,点个赞,加个收藏,让我们一起登上神坛。

相关文章
|
9月前
|
机器学习/深度学习 编解码 计算机视觉
OpenCV竟然可以这样学!成神之路终将不远(十六)
OpenCV竟然可以这样学!成神之路终将不远(十六)
|
9月前
|
计算机视觉 Python
OpenCV竟然可以这样学!成神之路终将不远(十)
OpenCV竟然可以这样学!成神之路终将不远(十)
|
9月前
|
算法 计算机视觉 Python
OpenCV竟然可以这样学!成神之路终将不远(二十六)
OpenCV竟然可以这样学!成神之路终将不远(二十六)
|
9月前
|
算法 计算机视觉 索引
OpenCV竟然可以这样学!成神之路终将不远(二十五)
OpenCV竟然可以这样学!成神之路终将不远(二十五)
|
9月前
|
计算机视觉 Python
OpenCV竟然可以这样学!成神之路终将不远(二十四)
OpenCV竟然可以这样学!成神之路终将不远(二十四)
|
9月前
|
计算机视觉 Python
OpenCV竟然可以这样学!成神之路终将不远(二十三)
OpenCV竟然可以这样学!成神之路终将不远(二十三)
|
9月前
|
计算机视觉 索引 Python
OpenCV竟然可以这样学!成神之路终将不远(二十二)
OpenCV竟然可以这样学!成神之路终将不远(二十二)
|
9月前
|
安全 计算机视觉 索引
OpenCV竟然可以这样学!成神之路终将不远(二十一)
OpenCV竟然可以这样学!成神之路终将不远(二十一)
|
9月前
|
文字识别 计算机视觉 索引
OpenCV竟然可以这样学!成神之路终将不远(二十)
OpenCV竟然可以这样学!成神之路终将不远(二十)
|
9月前
|
定位技术 计算机视觉 Python
OpenCV竟然可以这样学!成神之路终将不远(十九)
OpenCV竟然可以这样学!成神之路终将不远(十九)