OpenCV如何为我们的应用程序添加跟踪栏(71)

返回:OpenCV系列文章目录(持续更新中......)
上一篇:OpenCV的周期性噪声去除滤波器(70)
下一篇 :OpenCV如何使用 GDAL 读取地理空间栅格文件(72)
  • 在前面的教程中(关于使用 OpenCV 添加(混合)两个图像更改图像的对比度和亮度!),您可能已经注意到我们需要为我们的程序提供一些输入 ,例如。我们通过使用终端输入此数据来实现这一点。
  • 好吧,是时候使用一些花哨的 GUI 工具了。OpenCV 为您提供了一些 GUI 实用程序(highgui 模块)。这方面的一个例子是 Trackbar
  • 在本教程中,我们将修改之前的两个程序,以便它们从跟踪栏获取输入信息。

目标

在本教程中,您将学习如何:

  • 在前面的教程中(关于使用 OpenCV 添加(混合)两个图像更改图像的对比度和亮度!),您可能已经注意到我们需要为我们的程序提供一些输入 ,例如 。我们通过使用终端输入此数据来实现这一点。
  • 好吧,是时候使用一些花哨的 GUI 工具了。OpenCV 为您提供了一些 GUI 实用程序(highgui 模块)。这方面的一个例子是 Trackbar
  • 在本教程中,我们将修改之前的两个程序,以便它们从跟踪栏获取输入信息。
  • 使用 cv::createTrackbar 在 OpenCV 窗口中添加 Trackbar

在OpenCV中,cv::createTrackbar是一个用于创建滑动条的函数,可以用于在图像处理过程中动态地调整参数。主要用途是在图形用户界面(GUI)中创建滑块,方便用户进行互动式的图像处理。

cv::createTrackbar函数的参数包括了:

  • 滑动条名称:用于描述该滑动条的基本功能。

  • 窗口名称:用于定义滑动条所属的窗口名称。

  • 触发函数指针:是一个函数指针,表示滑动条改变时需要调用的回调函数。

  • 最大值:滑动条的最大取值。

  • 回调函数中的userData参数:一个指针,传递给回调函数的参数。

该函数在所指定的窗口中创建了一个指定的名称和取值范围的滑动条。当滑块被拖动时,回调函数被调用并传递滑块的值和已传递的回调中的userData参数。

C++代码

让我们修改教程中使用 OpenCV 添加(混合)两个图像中制作的程序。我们将让用户使用 Trackbar 输入值。
本教程代码如下所示。您也可以从这里下载

cpp 复制代码
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
 
using namespace cv;
using std::cout;
 
const int alpha_slider_max = 100;
int alpha_slider;
double alpha;
double beta;
 
Mat src1;
Mat src2;
Mat dst;
 
 
static void on_trackbar( int, void* )
{
 alpha = (double) alpha_slider/alpha_slider_max ;
 beta = ( 1.0 - alpha );
 addWeighted( src1, alpha, src2, beta, 0.0, dst);
 imshow( "Linear Blend", dst );
}
 
int main( void )
{
 src1 = imread( samples::findFile("LinuxLogo.jpg") );
 src2 = imread( samples::findFile("WindowsLogo.jpg") );
 
 if( src1.empty() ) { cout << "Error loading src1 \n"; return -1; }
 if( src2.empty() ) { cout << "Error loading src2 \n"; return -1; }
 
 alpha_slider = 0;
 
 namedWindow("Linear Blend", WINDOW_AUTOSIZE); // Create Window
 
 char TrackbarName[50];
 snprintf( TrackbarName, sizeof(TrackbarName), "Alpha x %d", alpha_slider_max );
 createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
 
 on_trackbar( alpha_slider, 0 );
 
 waitKey(0);
 return 0;
}

解释

我们只分析与 Trackbar 相关的代码:

  • 首先,我们加载两个图像,它们将被混合。
cpp 复制代码
 src1 = imread( samples::findFile("LinuxLogo.jpg") );
 src2 = imread( samples::findFile("WindowsLogo.jpg") );
  • 要创建跟踪栏,首先我们必须创建要位于其中的窗口。所以:
cpp 复制代码
 namedWindow("Linear Blend", WINDOW_AUTOSIZE); // Create Window
  • 现在我们可以创建跟踪栏:
cpp 复制代码
 char TrackbarName[50];
 snprintf( TrackbarName, sizeof(TrackbarName), "Alpha x %d", alpha_slider_max );
 createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );

请注意以下内容(C++ 代码):

  • 我们的 Trackbar 有一个标签 TrackbarName
  • 跟踪栏位于名为**"线性混合"(Linear Blend**) 的窗口中
  • Trackbar 值将在 \(0\) 到 跟踪栏值将在 的范围内(最小限制始终为零)。
  • Trackbar 的数值存储在 alpha_slider
  • 每当用户移动 Trackbar 时,都会调用回调函数on_trackbar

最后,我们必须使用 Java 中的匿名内部类侦听器为 C++ 和 Python 代码定义回调函数on_trackbar

cpp 复制代码
static void on_trackbar( int, void* )
{
 alpha = (double) alpha_slider/alpha_slider_max ;
 beta = ( 1.0 - alpha );
 addWeighted( src1, alpha, src2, beta, 0.0, dst);
 imshow( "Linear Blend", dst );
}

请注意(C++ 代码):

  • 我们使用 alpha_slider (整数)的值来获得 alpha 的双精度值。
  • 每次用户置换跟踪栏时**,alpha_slider**都会更新。
  • 我们将 src1src2distalphaalpha_sliderbeta 定义为全局变量,因此它们可以在任何地方使用。

结果

  • 我们的程序产生以下输出:
  • 作为一种练习方式,您还可以为更改图像的对比度和亮度!中的程序添加两个跟踪栏。一个跟踪栏用于设置,另一个用于设置。输出可能如下所示:

参考文献:

1《Adding a Trackbar to our applications!》------Ana Huamán

相关推荐
古希腊掌管学习的神7 分钟前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI35 分钟前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长1 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME2 小时前
知识库管理系统可扩展性深度测评
人工智能
唐诺2 小时前
几种广泛使用的 C++ 编译器
c++·编译器
海棠AI实验室3 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself3 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot
IT古董3 小时前
【机器学习】机器学习的基本分类-强化学习-策略梯度(Policy Gradient,PG)
人工智能·机器学习·分类
centurysee3 小时前
【最佳实践】Anthropic:Agentic系统实践案例
人工智能
mahuifa3 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai