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

79 篇文章 0 订阅
78 篇文章 0 订阅
 返回:OpenCV系列文章目录(持续更新中......)
上一篇:OpenCV的周期性噪声去除滤波器(70)
下一篇 :OpenCV如何使用 GDAL 读取地理空间栅格文件(72)

  • 在前面的教程中(关于使用 OpenCV 添加(混合)两个图像更改图像的对比度和亮度!),您可能已经注意到我们需要为我们的程序提供一些输入,例如\alpha\beta。我们通过使用终端输入此数据来实现这一点。
  • 好吧,是时候使用一些花哨的 GUI 工具了。OpenCV 为您提供了一些 GUI 实用程序(highgui 模块)。这方面的一个例子是 Trackbar

  • 在本教程中,我们将修改之前的两个程序,以便它们从跟踪栏获取输入信息。

目标

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

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

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

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

- 滑动条名称:用于描述该滑动条的基本功能。
- 窗口名称:用于定义滑动条所属的窗口名称。
- 触发函数指针:是一个函数指针,表示滑动条改变时需要调用的回调函数。
- 最大值:滑动条的最大取值。
- 回调函数中的userData参数:一个指针,传递给回调函数的参数。

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

C++代码

让我们修改教程中使用 OpenCV 添加(混合)两个图像中制作的程序。我们将让用户使用 Trackbar 输入\alpha值。

本教程代码如下所示。您也可以从这里下载

#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 相关的代码:

  • 首先,我们加载两个图像,它们将被混合。
 src1 = imread( samples::findFile("LinuxLogo.jpg") );
 src2 = imread( samples::findFile("WindowsLogo.jpg") );
  • 要创建跟踪栏,首先我们必须创建要位于其中的窗口。所以:
 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 );

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

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

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

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_slider 和 beta 定义为全局变量,因此它们可以在任何地方使用。

结果

  • 我们的程序产生以下输出:

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

参考文献:

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚梦者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值