OpenCV 轨迹条Trackba应用

简介: OpenCV 轨迹条Trackba应用

Trackbar介绍


opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看到更改这些参数时对于图像处理结果的影响。



Trackbar API


createTrackbar()函数


OpenCV 提供的 GUI 库在(highgui.h)里


createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时需要和一个回调函数配合使用。其原型如下:


CV_EXPORTS int createTrackbar(
  const string& trackbarname, 
  const string& winname,
  int* value, 
  int count,
  TrackbarCallback onChange = 0,
  void* userdata = 0
);


其各个参数含义如下:


  • trackname: 滑动条名字


  • winname: 想要把该滑动条依附到的窗口名字,在程序中可能该窗口名称由namedWindow()声明。


  • value: 创建滑动条时,滑动条的初始值


  • count: 滑动条的最大值,即所有滑动条的数据变动都要在0-count之间,滑动条最小值为0


  • onChange= 0 : 这是指的回调函数,每次滑动条数据变化时都对该函数进行回调


  • userdata= 0 : 这个是用户传给回调函数的数据,用来处理滑动条数值变动。如果在创建滑动条时,输入value实参是全局变量,则本参数userdata可使用默认值0.


Trackbar案例


代码示例1:混合图像透明度变换显示


效果展示:



代码如下:


#include <iostream>
#include <stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
//声明全局变量
const int g_nTrackbarMaxValue = 100;    // 滑动条最大值
int g_nTrackbarValue;           // 滑动条对应的值
double g_dAlphaValue;           // 第一幅图权重
double g_dBetaValue;            // 第二幅图权重
Mat g_srcImage1, g_srcImage2, g_distImage;
//声明回调函数
void on_Trackbar(int, void*);
int main()
{
  g_srcImage1 = imread("./test2.jpg");
  g_srcImage2 = imread("./test.jpg");
  //判断图像是否加载成功
  if (g_srcImage1.data && g_srcImage2.data)
    cout << "图像加载成功!" << endl << endl;
  else
  {
    cout << "图像加载失败!" << endl << endl;
    return -1;
  }
  namedWindow("混合后图像", WINDOW_NORMAL);    // 滑动条依附的窗口
  g_nTrackbarValue = 20;              // 设置滑动条初始值
  //在创建的窗体中创建滑动条控件并命名
  char trackBarName[100];
  /*Linux下使用sprintf需要添加头文件"stdio.h"
   *在Windows下微软一直在推广其安全函数即后缀加上_s
   *否则会有警告出现
   *所以本段代码将有两个版本*/
  sprintf(trackBarName, "透明度 %d", g_nTrackbarMaxValue);     // Linux版本语句
  // sprintf_s(trackBarName, "透明度 %d", g_nTrackbarMaxValue);    // Windows版本语句
  createTrackbar(trackBarName, "混合后图像", &g_nTrackbarValue, g_nTrackbarMaxValue, on_Trackbar);
  on_Trackbar(g_nTrackbarValue, 0);           // 结果在回调函数中显示
  waitKey(0);
  return 0;
}
void on_Trackbar(int, void*)
{
  //图像融合的权重在0-1之间,转换输入值和权重之间的比例
  g_dAlphaValue = (double)g_nTrackbarValue / g_nTrackbarMaxValue;
  g_dBetaValue = 1.0 - g_dAlphaValue;     // 第二幅图像权重
  //使用addWeighted函数对图像进行线性混合
  addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_distImage);
  imshow("混合后图像", g_distImage);
}


代码示例2:图像亮度与对比度滑动调整


效果展示:



代码如下:


#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace cv;
using namespace std;
int g_nContrastValue;   //对比度值
int g_nBrightValue;     //亮度值
Mat g_srcImage, g_dstImage;
static void ContrastAndBright(int, void*);
int main()
{
  //【0】初始化、配置
  // system("color 5F");
  g_srcImage = imread("./test2.jpg");
  if (!g_srcImage.data) 
  {
    printf("Oh,damm,读取g_srcImage图像错误!!!!"); 
    return false;
  }
  g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
  // 设定对比度和亮度的初值
  g_nContrastValue = 80;
  g_nBrightValue = 80;
  namedWindow("【效果图窗口】", 1);
  // 创建轨迹条
  createTrackbar("对比度:",
    "【效果图窗口】",
    &g_nContrastValue,
    300,
    ContrastAndBright);
  createTrackbar("亮  度:",
    "【效果图窗口】",
    &g_nBrightValue,
    200,
    ContrastAndBright);
  // 调用回调函数
  ContrastAndBright(g_nContrastValue, 0);
  ContrastAndBright(g_nBrightValue, 0);
  cout << endl << "嗯,好了,请调整滚动条观察图像效果!!!\n\n"
    << "\t按下“q”键时,程序退出!!!\n"
    << "\n\n\t\t\t\tby";
  waitKey(0);
  return 0;
}
// ContrastAndBright( int, void* ) 描述:改变图像对比度和亮度值的回调函数
static void ContrastAndBright(int, void*)
{
  // 创建窗口
  namedWindow("【原始图窗口】", 1);
  // 三个for循环,执行   g_dsImage(i,j) =  a*g_srcImage(i,j)  +  b
  for (int y = 0; y < g_srcImage.rows; y++)
  {
    for (int x = 0; x < g_srcImage.cols; x++)
    {
      for (int c = 0; c < 3; c++)
      {
        g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
          ((g_nContrastValue*0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
      }
    }
  }
  // 显示图像
  imshow("【原始图窗口】", g_srcImage);
  imshow("【效果图窗口】", g_dstImage);
}
相关文章
|
5月前
|
存储 编解码 算法
OpenCV2 计算机视觉应用编程秘籍:6~10
OpenCV2 计算机视觉应用编程秘籍:6~10
72 0
|
5月前
|
设计模式 算法 开发工具
OpenCV2 计算机视觉应用编程秘籍:1~5
OpenCV2 计算机视觉应用编程秘籍:1~5
69 0
|
5月前
|
存储 Java Android开发
OpenCV3 安卓应用编程:1~6 全
OpenCV3 安卓应用编程:1~6 全
40 0
|
5月前
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
151 0
|
5月前
|
计算机视觉 Python
OpenCV中图像的开、闭运算讲解与实战应用(附Python源码)
OpenCV中图像的开、闭运算讲解与实战应用(附Python源码)
145 0
|
5月前
|
算法 计算机视觉 Python
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
347 0
|
5月前
|
计算机视觉 Python
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
139 0
|
6天前
|
机器学习/深度学习 API 计算机视觉
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(下)
14 2
|
6天前
|
机器学习/深度学习 存储 算法
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
基于Python_opencv人脸录入、识别系统(应用dlib机器学习库)(上)
16 1
|
4月前
|
Ubuntu Linux C语言
【opencv】opencv在windows和linux的应用
【opencv】opencv在windows和linux的应用