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协作实战派9 小时前
【AI探索历程17】从“给自己用“到想“让别人用“
人工智能
吴佳浩10 小时前
Memory Provider 实战:Hermes、Mem0、Honcho、Hindsight 为什么都这样设计?
人工智能·agent·ai编程
吴佳浩10 小时前
企业级 Agent Memory 选型指南:如何构建可扩展的 Memory Service?
人工智能·agent·ai编程
北方的银狐-Zero11 小时前
ERP 管执行,数据管标准,OntoL本体 管思考:企业智能化升级的规划图
大数据·人工智能·本体论
浅安的邂逅11 小时前
260918-白帽把 OpenAI 论坛“打穿“了:攻防赛漏洞、账户被 Claude 入侵、模型偷偷掩盖不当行为
人工智能·大模型·ai编程·ai模型·行业动态
jinyishu_11 小时前
认识 AI Agent:概念、架构、设计模式与主流框架
人工智能
Hrain-AI12 小时前
AI 爬虫三档授权工程落地:搜索放行、训练拦截、Agent 分层(附脚本)
人工智能·elasticsearch·milvus
sunhy_csdn12 小时前
“词码”作为 Token 候选译名
人工智能
Hrain-AI12 小时前
多 Agent 并行不打架:worktree 隔离与反馈回流落地(附脚本)
网络·数据库·人工智能·架构