OpenCV滑动条事件

《OpenCV计算机视觉开发实践:基于Python(人工智能技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书

在OpenCV中,滑动条设计的主要目的是在视频播放帧中选择特定帧。在和父窗口使用时,需要给滑动条赋予一个特别的名字(通常是一个字符串),接下来直接通过那个名字进行引用。

创建滑动条的函数是createTrackbar,函数声明如下:

复制代码
CreateTrackbar(trackbarName, windowName, value, count, onChange) -> None

其中,参数trackbarName是滑动条的名称;windowName是滑动条将要添加到父窗口的名称,一旦滑动条创建好,它就将被添加到窗口的顶部或底部,滑动条不会挡住任何已经在窗口中的图像,只会让窗口变大,窗口的名称将作为一个窗口的标记,至于滑动条上滑动钮的确切位置则由操作系统决定,一般都是最左边;参数value是一个指向整数的指针,这个整数值会随着滑动钮的移动自动变化;参数count是滑动条可以滑动的最大值;参数onChange是一个指向回调函数的指针,当滑动钮移动时回调函数就会自动调用。

回调函数类型TrackbarCallback的定义如下:

复制代码
def TrackbarCallback(pos,userdata)

其中,参数pos表示滚动块的当前位置;userdata是传给回调函数的可选参数。这个回调函数不是必需的,如果不需要直接赋值为NULL就没有回调函数,移动滑动钮的唯一响应就是createTrackbar的参数value指向的变量值的变化。

除了创建滑动条的函数外,OpenCV还提供了函数getTrackbarPos(用于获取滑动块的位置)和函数setTrackbarPos(用于设置滑动条的位置)。

getTrackbarPos的函数声明如下:

复制代码
GetTrackbarPos(trackbarName, windowName) -> retval

其中,参数trackbarName是滑动条的名称;windowName是滑动条将要添加到父窗口的名称。函数返回滑动块的当前位置。

setTrackbarPos的函数声明如下:

复制代码
SetTrackbarPos(trackbarName, windowName, pos) -> None

其中,参数trackName表示滚动条的名称;windowName是滑动条将要添加到父窗口的名称;pos表示要设置的滑动块位置。下面我们看一个专业的例子,利用滑动块调节设置参数。

【例3.12】 利用滑动块控制图片的亮度

复制代码
import cv2 as cv
import numpy as np

import cv2
import numpy as np
alpha = 0.3
beta = 80
img_path = "test.jpg"
img = cv2.imread(img_path)
img2 = cv2.imread(img_path)

def updateAlpha(x):
    global alpha, img, img2
    # 得到数值
    alpha = cv2.getTrackbarPos('Alpha', 'image')
    alpha = alpha * 0.01
    img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))

def updateBeta(x):
    global beta, img, img2
    beta = cv2.getTrackbarPos('Beta', 'image')
    img = np.uint8(np.clip((alpha * img2 + beta), 0, 255))

# 创建窗口
cv2.namedWindow('image')

cv2.createTrackbar('Alpha', 'image', 0, 300, updateAlpha)
cv2.createTrackbar('Beta', 'image', 0, 255, updateBeta)
# 设置默认值
cv2.setTrackbarPos('Alpha', 'image', 100)
cv2.setTrackbarPos('Beta', 'image', 10)
while (True):
    cv2.imshow('image', img)
    if cv2.waitKey(1) == ord('q'):
        break
cv2.destroyAllWindows()

在上述代码中,首先读取test.jpg,然后定义滑动块的两个回调函数updateAlpha和updateBeta,接着利用函数namedWindow创建1个窗口,并利用函数createTrackbar创建2个滑动条,这样窗口上就有了2个滑动条。updateAlpha和updateBeta都是滑动条的回调函数,用于响应用户滑动滑块这个事件。最后一个while循环,等待用户按键q退出。在回调函数中,np.uint8是专门用于存储各种图像的(包括RGB、灰度图像等),范围是0~255。该函数接收的参数是一个数组,需要注意的是,clip函数的返回值是uint8的参数,但是这个函数仅仅是对原数据和0xff相与(和最低2字节数据相与),这就容易导致如果原数据是大于255的,那么在直接使用np.uint8()后,比第八位更大的数据都被截断了。clip这个函数将数组中的元素限制在a_min、a_max之间,大于a_max的就使得它等于a_max,小于a_min的就使得它等于a_min,它的原型是numpy.clip(a, a_min, a_max, out=None)。其中,a是一个数组,后面两个参数分别表示最小值和最大值。代码中的uint8和clip函数,我们在后面章节还会详细讲到。

运行工程,结果如图3-12所示。

图3‑12

相关推荐
bingbingyihao3 分钟前
AI绘制流程图
人工智能·流程图
努力犯错玩AI5 分钟前
全球第二!中国17B开源图像模型HiDream-I1登顶榜单,比肩GPT-4o
人工智能·后端·开源
Elastic 中国社区官方博客1 小时前
Elasticsearch:AI 助理 - 从通才到专才
大数据·数据库·人工智能·神经网络·elasticsearch·搜索引擎·全文检索
newxtc1 小时前
【北交互联-注册/登录安全分析报告】
人工智能·安全·网易易盾·政务·极验
梓羽玩Python1 小时前
这个开源神器终结了AI数据整合的噩梦!一键聚合网页、代码、论文到剪贴板!
人工智能·python·github
3DVisionary1 小时前
3D-DIC技术:煤层开采瓦斯防治的精准监测解决方案
人工智能·计算机视觉·3d·安全生产·3d-dic技术 煤层开采·瓦斯防治 裂隙演化·物理模拟实验 数字图像相关算法
柯西梦回黄鹤楼1 小时前
《Training Language Models to Self-Correct via Reinforcement Learning》全文翻译
人工智能·语言模型·自然语言处理
洛水微寒1 小时前
大型语言模型中中医知识的多模态基准数据集
人工智能·语言模型·自然语言处理
2401_878624791 小时前
opencv 灰度实验
人工智能·opencv·计算机视觉
知来者逆2 小时前
计算机视觉——基于 Yolov8 目标检测与 OpenCV 光流实现目标追踪
深度学习·yolo·目标检测·计算机视觉·yolov8·目标追踪