opencv3学习笔记——滑动条的创建与使用

1.几个不懂的地方

(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);

2.完整代码

#include<opencv2/opencv.hpp>
#include<stdio.h>
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;
}

3.注意事项

代码运行不了的原因:
1.sprintf有问题
VS会报错C4996
原因好像是因为国际c语言标准修改过,但是编译器需要sprintf所有参数才能运行,具体原因可自行百度。
修改方法:打开项目属性——c/c++——预处理器——预处理器定义——点击下拉编辑——添加下面代码_CRT_SECURE_NO_WARNINGS
_CRT_NON_CONFORMING_SWPRINTFS
再运行之后就可以成功了
2.加载的两张图片尺寸大小一定要一样
如果尺寸不一样,代码可以编译通过,但是运行不了,会出现弹窗,什么abort()has been called
我一开始的时候图片大小不一样 ,就出现了这个错误,后来将图片尺寸修改一致后,运行成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值