(1)addweighted()线性混合函数
addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
/* 这个函数需要6个参数。
1、第1个参数,输入图片1,
2、第2个参数,图片1的融合比
3、第3个参数,输入图片2
4、第4个参数,图片2的融合比例
5、第5个参数,偏差值
6、第6个参数,输出图片
*/
//这个函数可以将两个图片进行融合
(2)创建滑动条以及回调显示
creatureTrackbar函数为我们创建了一个具有特定名称和范围的轨迹条(Trackbar,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量,并且要有回调函数onchange,在轨迹条位置改变的时候来调用这个回调函数。
g_nAlphaValueSlider = 70; //设置滑动条初值为70
cvNamedWindow(WINDOW_NAME, 1); //创建窗口
//在已经创建的窗口中创建一个滑动条控件
char TrackbarName[50];
sprintf (TrackbarName, "透明值%d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
//TrackbarName 为滑动条名称
// WINDOW_NAME 滑动条所依附的窗口的名字
//&g_nAlphaValueSlider 滑动条的变量值
// g_nMaxAlphaValue 滑动条的最大值
//滑动条的变量值 回调函数
//结果在回调函数中显示
on_Trackbar(g_nAlphaValueSlider, 0);
#include
#include
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()
{
//加载图像
//注意:两图像进行混合时尺寸大小要一样,不然会进行报错
g_srcImage1 = imread("1.png");
g_srcImage2 = imread("3.png");
if (!g_srcImage1.data)
{
printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n");
return -1;
}
if (!g_srcImage2.data)
{
printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n");
return -1;
}
g_nAlphaValueSlider = 70; //设置滑动条初值为70
cvNamedWindow(WINDOW_NAME, 1); //创建窗口
//在已经创建的窗口中创建一个滑动条控件
char TrackbarName[50];
sprintf (TrackbarName, "透明值%d", g_nMaxAlphaValue);
createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_nAlphaValueSlider, 0);
//按任意键退出
waitKey(0);
return 0;
}
代码运行不了的原因:
1.sprintf有问题
VS会报错C4996
原因好像是因为国际c语言标准修改过,但是编译器需要sprintf所有参数才能运行,具体原因可自行百度。
修改方法:打开项目属性——c/c++——预处理器——预处理器定义——点击下拉编辑——添加下面代码_CRT_SECURE_NO_WARNINGS
_CRT_NON_CONFORMING_SWPRINTFS
再运行之后就可以成功了
2.加载的两张图片尺寸大小一定要一样
如果尺寸不一样,代码可以编译通过,但是运行不了,会出现弹窗,什么abort()has been called
我一开始的时候图片大小不一样 ,就出现了这个错误,后来将图片尺寸修改一致后,运行成功。