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

相关推荐
baiduopenmap9 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
小任同学Alex13 分钟前
浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)
人工智能·自然语言处理·大模型
新加坡内哥谈技术19 分钟前
微软 Ignite 2024 大会
人工智能
怀澈12223 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
江瀚视野1 小时前
Q3净利增长超预期,文心大模型调用量大增,百度未来如何分析?
人工智能
chnming19871 小时前
STL关联式容器之set
开发语言·c++
陪学1 小时前
百度遭初创企业指控抄袭,维权还是碰瓷?
人工智能·百度·面试·职场和发展·产品运营
QCN_1 小时前
湘潭大学人工智能考试复习1(软件工程)
人工智能
威桑1 小时前
MinGW 与 MSVC 的区别与联系及相关特性分析
c++·mingw·msvc
Landy_Jay1 小时前
深度学习:GPT-1的MindSpore实践
人工智能·gpt·深度学习