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 练习题

  1. 使用轨迹栏创建颜色和画笔半径可调的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竟然可以这样学!成神之路终将不远的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

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