昊虹君 发表于 2022-11-6 16:49

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

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

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

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

回调函数的格式要求如下:
voidonChangeTrackBar(int pos, void * data)
{
        .......
}
第一个参数pos为滑动条的当前位置;
第二个参数为函数createTrackbar()中的参数userdata。

C++示例代码如下:

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

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

//OpenCV版本 OpenCV3.0

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

using namespace std;
using namespace cv;


voidonChangeTrackBar(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);
}

该代码通过滑动条调整图像的灰度值。
代码运行结果如下:
http://pic1.hhai.cc/pic1/2022/2022-11/001/001.png
可以拉动滑动条调整图像的灰度值,比如把滑动条的值拖动到143的结果如下:                                          
http://pic1.hhai.cc/pic1/2022/2022-11/001/002.png


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++版的代码一模一样,这里就不贴运行结果了。
页: [1]
查看完整版本: 详解OpenCV的窗口滑动条创建控制函数createTrackbar()