OpenCV竟然可以这样学!成神之路终将不远
Posted 满目星辰wwq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV竟然可以这样学!成神之路终将不远相关的知识,希望对你有一定的参考价值。
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竟然可以这样学!成神之路终将不远的主要内容,如果未能解决你的问题,请参考以下文章