#define _CRT_SECURE_NO_WARNINGS //为了消除那个不安全sprintf函数错误警告
//必须写在第一行,也包括在注释的前面,真正的第一行
/**
*Copyright (c) 2018 Young Fan.All Right Reserved.
*Filename: 4 为程序界面添加滑动条
*Author: Young Fan
*Date: 2018.4.5
*OpenCV version: 3.4.1
*IDE: Visual Studio 2017
*Description:为程序界面添加滑动条
*/
#include<opencv2/opencv.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;
//-------------------【on_Trackbar()函数】-----------------
//描述:响应滑动条的回调函数
//---------------------------------------------------------
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()
{
//加载图像(两图像的尺寸需相同)
g_srcImage1 = imread("1.jpg");
g_srcImage2 = imread("2.jpg");
if (!g_srcImage1.data)
{
printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在!\n");
return -1;//返回-1,表示错误,失败
}
if (!g_srcImage2.data)
{
printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在!\n");
return -1;//返回-1,表示错误,失败
}
//设置滑动条初值为70
g_nAlphaValueSlider = 70;
//创建窗体
//第二个参数1,代表WINDOW_AUTOSIZE,即窗口自动调整。
namedWindow(WINDOW_NAME,1);// 不写1,默认是1
//在创建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf(TrackbarName,"透明值 %d",g_nMaxAlphaValue);//这里报了一个不安全的sprintf函数的错误,需要消除
createTrackbar(TrackbarName,WINDOW_NAME,&g_nAlphaValueSlider,g_nMaxAlphaValue,on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_nAlphaValueSlider,0);
//按任意键退出
waitKey(0);
return 0;
}
总结:
sprintf(TrackbarName,”透明值 %d”,g_nMaxAlphaValue);//这里报了一个不安全的sprintf函数的错误,需要消除
#define _CRT_SECURE_NO_WARNINGS //为了消除那个不安全sprintf函数错误警告
//必须写在第一行,也包括在注释的前面,真正的第一行
创建窗体
第二个参数1,代表WINDOW_AUTOSIZE,即窗口自动调整。
namedWindow(WINDOW_NAME,1);// 不写1,默认是1