OpenCV高级图形用户界面(1)创建滑动条函数createTrackbar()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

创建一个滑动条并将其附加到指定的窗口。

该函数 createTrackbar 创建一个具有指定名称和范围的滑动条(滑块或范围控制),将变量 value 分配为与滑动条位置同步的位置,并指定回调函数 onChange 在滑动条位置改变时被调用。创建的滑动条将显示在指定的窗口 winname 中。

cv::createTrackbar() 函数用于在 OpenCV 的窗口中创建一个滑动条(trackbar),可以用来调整一些参数,并实时反映在图像处理的效果中。

注释

仅 Qt 后端 如果滑动条应附加到控制面板,则 winname 可以为空。

点击每个滑动条的标签可以手动编辑滑动条的值。

函数原型

cpp 复制代码
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 指向每次滑块位置改变时将被调用的函数的指针。此函数应该原型化为 void Foo(int, void*);,其中第一个参数是滑块的位置,第二个参数是用户数据(参见下一个参数)。如果回调是指向 NULL 的指针,则不调用回调,但只会更新 value
  • 参数userdata 作为参数原样传递给回调的用户数据。它可以用来在不使用全局变量的情况下处理滑块事件。

返回值

返回一个整数值,表示操作的结果或状态。具体含义取决于 OpenCV 实现。

代码示例:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

// 回调函数
void onTrackbarSlide( int pos, void* userData )
{
    cv::Mat img = *( cv::Mat* )userData;
    cv::Mat thresholdImg;
    cv::threshold( img, thresholdImg, pos, 255, cv::THRESH_BINARY );
    cv::imshow( "Threshold Image", thresholdImg );
}

int main()
{
    // 加载图像
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_GRAYSCALE );
    if ( img.empty() )
    {
        std::cerr << "Error: Image not found!" << std::endl;
        return -1;
    }

    // 创建窗口
    cv::namedWindow( "Threshold Image" );

    // 创建滑动条
    int thresholdValue = 128;
    int result         = cv::createTrackbar( "Threshold Value", "Threshold Image", &thresholdValue, 255, onTrackbarSlide, &img );

    if ( result < 0 )
    {
        std::cerr << "Failed to create trackbar." << std::endl;
        return -1;
    }

    // 初始显示
    cv::Mat thresholdImg;
    cv::threshold( img, thresholdImg, thresholdValue, 255, cv::THRESH_BINARY );
    cv::imshow( "Threshold Image", thresholdImg );

    // 主循环
    while ( true )
    {
        int key = cv::waitKey( 1 );
        if ( key == 27 )
        {  // ESC 键
            break;
        }
    }

    // 释放资源
    cv::destroyAllWindows();

    return 0;
}

运行结果

相关推荐
AI多Agent协作实战派6 小时前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能
airobotcn6 小时前
智能巡检平台容器化部署:Docker+K8s在工业边缘的实践
人工智能·docker·容器·kubernetes·机器人·自动化
weixin_446260856 小时前
Vero基准:AI智能体能否构建形式化验证软件仓库
人工智能
hiahiahia1237 小时前
AI Web 项目的文件到底应该怎么放?
前端·人工智能
AIyy8667 小时前
PPT找不到合适配图?输入文字描述直接AI生成,2026AI绘图工具怎么选
人工智能
xiongmaogeo7 小时前
外贸企业如何利用GEO优化,抢占海外AI平台的搜索流量
人工智能·chatgpt·facebook
大模型搬砖师7 小时前
高校科研管理上 AI:科研处、课题组、信息中心的三方分歧怎么调和
人工智能·安全
小沈同学呀7 小时前
【Agent开发第五期】Tool Use 工具调用,给 Agent 装上“手“
人工智能·工具调用·functioncalling·agent开发·tooluse·从零开发ai助手
tianxuanjg7 小时前
机器人精密零件:为何样品合格,批量却频频超差?
人工智能·经验分享·机器人·无人机·制造·材质