返回: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**都会更新。
- 我们将 src1 、src2 、dist 、alpha 、alpha_slider 和 beta 定义为全局变量,因此它们可以在任何地方使用。
结果
- 我们的程序产生以下输出:
- 作为一种练习方式,您还可以为更改图像的对比度和亮度!中的程序添加两个跟踪栏。一个跟踪栏用于设置,另一个用于设置。输出可能如下所示:
参考文献:
1《Adding a Trackbar to our applications!》------Ana Huamán