昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 6911|回复: 0
收起左侧

详解OpenCV的窗口滑动条创建控制函数createTrackbar()

[复制链接]

251

主题

254

帖子

1147

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1147
昊虹君 发表于 2022-11-6 16:49 | 显示全部楼层 |阅读模式
详解OpenCV的窗口滑动条创建控制函数createTrackbar()

函数createTrackbar()可实现创建窗口滑动条,通过鼠标拖动滑动条控制某个参数的值,从而观察不同参数情况下窗口的图像输出结果。

函数createTrackbar()的原型如下:
  1. int cv::createTrackbar(const String & trackbarname,
  2.                        const String & winname,
  3.                        int * value,
  4.                        int count,
  5.                        TrackbarCallback onChange = 0,
  6.                        void * userdata = 0)
复制代码

各参数意义如下:
trackbarname—滑动条显示在窗口中的名字;
winname—滑动条所在窗口的名字;
value—滑动条初始值;
count—滑动条最大值,值得注意的是滑动条的最小值总为0;
onChange—回调函数名;
userdata—如果用户想传一些自定义的数据给回调函数,可以放在userdata中。

回调函数的格式要求如下:
  1. void  onChangeTrackBar(int pos, void * data)
  2. {
  3.         .......
  4. }
复制代码

第一个参数pos为滑动条的当前位置;
第二个参数为函数createTrackbar()中的参数userdata。

C++示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;


void  onChangeTrackBar(int pos, void * data)
{
	Mat A1_copy = *(Mat*)(data);

	A1_copy = 0;
	A1_copy = A1_copy + pos;

	imshow("dyn_gray_value", A1_copy);

}

int main()
{
	//创建两行三列的零矩阵
	Mat A1 = Mat::zeros(200, 300, CV_8UC1);

	namedWindow("dyn_gray_value"); 

	imshow("dyn_gray_value", A1);

	int value = 20;

	createTrackbar("pos", "dyn_gray_value", & value, 255, onChangeTrackBar, &A1);

	waitKey();
	return(0);


	return(0);
}

该代码通过滑动条调整图像的灰度值。
代码运行结果如下:

可以拉动滑动条调整图像的灰度值,比如把滑动条的值拖动到143的结果如下:                                          



Python示例代码如下:
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术

# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询

# OpenCV的版本为4.4.0

import cv2 as cv
import numpy as np


def on_change_trackbar(x):
    global A1_copy, value

    A1_copy[:, :] = 0
    value = cv.getTrackbarPos('pos', 'dyn_gray_value')
    A1_copy = A1_copy + value

    cv.imshow("dyn_gray_value", A1_copy)


A1 = np.zeros((200, 300), dtype='uint8')
cv.namedWindow('dyn_gray_value')
cv.imshow("dyn_gray_value", A1)

value = 20

A1_copy = A1.copy()

cv.createTrackbar('pos', 'dyn_gray_value', value, 255, on_change_trackbar)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果和C++版的代码一模一样,这里就不贴运行结果了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2025-11-15 07:31 , Processed in 0.025572 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表