OpenCV createTrackbar() 滑动条创建使用简单线性混合

函数原型:

int createTrackbar(const string & trackbarname, const string & winname, int *value,  int count, TrackbarCallback onChange=0, void *userdata=0);
  1. 第一个参数:轨迹条的名字,用来代表我们创建的轨迹条;
  2. 第二个参数:窗口名字,表示轨迹条会依附到哪个窗口上,即对应 nameWindow()创建的某一个窗口;
  3. 第三个参数:滑块的位置,创建时的初始位置就是其当前值;
  4. 第四个参数:滑块的最大值,最小值始终位 0;
  5. 第五个参数:回调函数指针,每次滑块位置改变时,这个函数都会进行回调,这个函数的原型必须是 void XXXX(int, void*),第一个参数:轨迹条的位置,第二个参数:用户数据(下面的第6个参数);如果位 NULL 指针,表示没有回调函数调用,仅第三个参数 value 有变化;
  6. 第六个参数:这个是用户传给回调函数的参数,如果第三个参数是全局变量的话,可以不用管这个 userdata(函数内部可以直接访问全局变量,不用传值)。

示例代码用的是全局变量:

#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"

using namespace  cv;

#define WINDOW_NAME "线性混合示例" // 窗口标题宏


/***全局变量***/

const int g_nMaxAlphaValue = 100; // Alpha 值最大值
int g_nAlphaValueSlider; // 滑动条对应变量
double g_dAlphaValue;
double g_dBetaValue;

// 声明图像存储变量

Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;


/***响应滑动条回调函数***/
void on_Trackbar(int, void*)
{
    // alpha 值相对于最大值的比例
    g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue; 
    // beta 值为 1 减 alpha 值
    g_dBetaValue = 1.0 - g_dAlphaValue;

    // 根据 alpha 和 beta 值进行线性混合
    addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

    // 显示
    imshow(WINDOW_NAME, g_dstImage);
}

int main(int argc, char** argv)
{
    g_srcImage1 = imread(".//image3_2_1//1.jpg");
    g_srcImage2 = imread(".//image3_2_1//2.jpg");

    if (!g_srcImage1.data) {
        printf("图像1读取错误,请确定路径下是否存在图片!\n");
        return -1;
    }
    if (!g_srcImage2.data) {
        printf("图像2读取错误,请确定路径下是否存在图片!\n");
        return -1;
    }

    g_nAlphaValueSlider = 70; // 设定滑动条初始值 70
    namedWindow(WINDOW_NAME, 1); // 创建窗体

    // 在创建的窗体中创建一个滑动条控件
    char TrackbaName[50];
    sprintf_s(TrackbaName, "透明值 %d", g_nMaxAlphaValue);

    createTrackbar(TrackbaName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);

    // 结果在回调函数中显示
    on_Trackbar(g_nAlphaValueSlider, NULL);

    waitKey(0);
    return 0;
}

▲ 两张图混合在一起

getTrackbarPos() 函数

获取当前轨迹的位置。

原型:

int getTrackbarPos(const string &trackbarname, const string &winname);
  1. 第一个参数: 轨迹条的名字;
  2. 第二个参数: 轨迹条父窗口的名称;




参考:

《OpenCV3 编程入门》 毛星云 P75

posted @   double64  阅读(125)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示