OpenCV
Open Source Computer Vision
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Adding a Trackbar to our applications!

Table of Contents

Next Tutorial: Reading Geospatial Raster files with GDAL

Original author Ana Huamán
Compatibility OpenCV >= 3.0
  • In this tutorial we will just modify our two previous programs so that they get the input information from the trackbar.

Goals

In this tutorial you will learn how to:

Code

Let's modify the program made in the tutorial Adding (blending) two images using OpenCV. We will let the user enter the α value by using the Trackbar.

This tutorial code's is shown lines below. You can also download it from here

#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 pos, void* userdata) {
(void) userdata;
alpha = (double)pos / 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; }
// Initialize trackbar value
alpha_slider = 0;
namedWindow("Linear Blend", WINDOW_AUTOSIZE); //Create Window
char TrackbarName[50];
snprintf(TrackbarName, sizeof(TrackbarName), "Alpha x %d", alpha_slider_max);
// Example userdata: Pass a pointer to an integer as userdata
createTrackbar(TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar);
on_trackbar(alpha_slider, nullptr);
waitKey(0);
return 0;
}
n-dimensional dense array class
Definition mat.hpp:829
bool empty() const
Returns true if the array has no elements.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition core.hpp:107

Explanation

We only analyze the code that is related to Trackbar:

  • First, we load two images, which are going to be blended.
src1 = imread(samples::findFile("LinuxLogo.jpg"));
src2 = imread(samples::findFile("WindowsLogo.jpg"));
  • To create a trackbar, first we have to create the window in which it is going to be located. So:
namedWindow("Linear Blend", WINDOW_AUTOSIZE); //Create Window
  • Now we can create the Trackbar:
char TrackbarName[50];
snprintf(TrackbarName, sizeof(TrackbarName), "Alpha x %d", alpha_slider_max);
// Example userdata: Pass a pointer to an integer as userdata
createTrackbar(TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar);

Note the following (C++ code):

  • Our Trackbar has a label TrackbarName
  • The Trackbar is located in the window named Linear Blend
  • The Trackbar values will be in the range from 0 to alpha_slider_max (the minimum limit is always zero).
  • The numerical value of Trackbar is stored in alpha_slider
  • Whenever the user moves the Trackbar, the callback function on_trackbar is called

Finally, we have to define the callback function on_trackbar for C++ and Python code, using an anonymous inner class listener in Java

static void on_trackbar(int pos, void* userdata) {
(void) userdata;
alpha = (double)pos / alpha_slider_max;
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
imshow("Linear Blend", dst);
}

Note that (C++ code):

  • We use the value of alpha_slider (integer) to get a double value for alpha.
  • alpha_slider is updated each time the trackbar is displaced by the user.
  • We define src1, src2, dist, alpha, alpha_slider and beta as global variables, so they can be used everywhere.

Result

  • Our program produces the following output: