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

相关推荐
欣慰的三叶草(● ̄(エ) ̄●)18 分钟前
01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型
java·人工智能·chatgpt
小兮风19 分钟前
Forecasting from LiDAR via Future Object Detection
人工智能·目标检测·计算机视觉·端到端检测预测
一尘之中26 分钟前
IT专业入门,高考假期预习指南
人工智能·高考
不掉马甲的NPC29 分钟前
「豆包MarsCode初体验」使用 node.js 搭建图片服务器
人工智能
LewisFung34 分钟前
性能超越 YOLO、GPT-4 的图像自动标注工具:T-Rex Label
人工智能·深度学习·计算机视觉
快乐点吧43 分钟前
【深度学习基础】`view` 和 `reshape` 的参数详解
人工智能·深度学习·自然语言处理
松下J271 小时前
深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)
人工智能·深度学习·神经网络·梯度下降·sgd
LeoLei80601 小时前
新特性之C++17
开发语言·c++
Wen.py.java1 小时前
Python商务数据分析知识专栏(六)——Python数据分析的应用④Python数据分析实训
人工智能·python·数据分析
不要em0啦1 小时前
PyTorch - 神经网络基础
人工智能·pytorch·神经网络