Opencv 学习笔记:滑块(Trackbar)实现动态调整二值化阈值

OpenCV 的 Trackbar(滑块)可实现参数的动态调节,无需反复修改代码重启程序。本文以二值化阈值调整为例,演示滑块的创建、回调函数绑定及动态更新图像的完整流程。

核心代码实现

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

# 1. 读取图像并转灰度
src = cv.imread(".\image\1.bmp")
if src is None:
    print('could not load image')
    exit()
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)

# 2. 定义全局变量存储处理后图像
threshmin = 0
threshmax = 0
imges = np.zeros_like(gray)

# 3. 滑块回调函数:调整正向二值化阈值
def threshold_min(threshmin):
    ret, img = cv.threshold(gray, threshmin, 255, cv.THRESH_BINARY)
    global imges
    imges = img

# 4. 滑块回调函数:调整反向二值化阈值
def threshold_max(threshmax):
    ret, img1 = cv.threshold(gray, threshmax, 255, cv.THRESH_BINARY_INV)
    global imges
    imges = img1

# 5. 创建窗口和滑块
cv.namedWindow('image')
# 参数:滑块名、绑定窗口、初始值、最大值、回调函数
cv.createTrackbar('threshold min', 'image', 130, 255, threshold_min)
cv.createTrackbar('threshold max', 'image', 130, 255, threshold_max)

# 6. 初始化图像(触发一次回调)
threshold_max(threshmax)
threshold_min(threshmin)

# 7. 循环显示,支持动态更新
while True:
    cv.imshow('image', imges)
    # 50ms检测按键,任意按键按下退出
    if cv.waitKey(50) > 0:
        break

cv.destroyAllWindows()

关键知识点解析

  1. 滑块创建核心 API :cv.createTrackbar(滑块名, 绑定窗口, 初始值, 最大值, 回调函数)

    • 滑块值范围固定为0~最大值,适配二值化阈值(0~255)场景;
    • 滑动滑块时自动触发绑定的回调函数,实时更新参数。
  2. 回调函数设计:

    • 函数参数为滑块当前值(无需手动传参,OpenCV 自动传递);
    • 使用global声明全局变量,实现回调函数内外图像数据共享。
  3. 动态更新逻辑:

    • while循环持续显示图像,cv.waitKey(50)保证刷新率(数值越小更新越快);
    • 两个滑块共用一个显示图像变量,滑动时会覆盖彼此效果(可扩展为分窗口显示)。
  4. 易错点修正:

    • 原代码thrshold_min存在拼写错误,修正为threshold_min避免回调失效;
    • 补全np.zeros_like(gray)初始化全局图像,避免首次显示空值。

总结

  1. 滑块核心是 "创建 Trackbar + 绑定回调函数 + 循环更新显示",实现参数动态调节;
  2. 回调函数需通过全局变量传递处理后图像,保证循环显示的数据源更新;
  3. 滑块适用于阈值、滤波核大小、亮度对比度等需手动调参的场景,提升调试效率。
相关推荐
myaijarvis10 分钟前
【图像增强】Restormer 模型详解 笔记 CVPR2022
笔记
晨间晓11 分钟前
一张图片主要是什么颜色?用 OpenCV 做图片主色提取工具
人工智能·opencv·计算机视觉
xier_ran18 分钟前
【infra之路】AI 编译器学习笔记(七):Linalg 与 Tiling——把迭代空间切成块
人工智能·笔记·学习
承渊政道29 分钟前
Linux网络学习【应用层自定义协议与序列化实战:从手写序列化与反序列化到深入理解进程间关系与守护进程】
linux·网络·学习·ubuntu·json·序列化与反序列化
你想知道什么?36 分钟前
标准化与归一化-学习笔记
笔记·学习
星恒随风41 分钟前
Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理
linux·c语言·笔记·学习·状态模式
2603_969579281 小时前
怎样取消电脑上的自动备份?不同来源的关闭方法
学习
CV@CV1 小时前
世界模型环境预测与内在表征基础原理
人工智能·学习·边缘计算·量子计算·具身智能
知识分享小能手1 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法
卿卿的产品经理日记1 小时前
【AI产品经理实战】Day 34|计算机科学速成②:从水流开关到 Unicode,把整个电脑拆成一长串 0 和 1
人工智能·笔记·科技·学习·产品经理