OpenCV学习(8)

OpenCV学习(8),第1张

OpenCV学习(8)

HighGUI图形用户界面初步:创建滑动条(createTrackbar函数)【两幅图像的Alpha混合】

滑动条是opencv动态调节参数特别好用的一种工具,它依附于窗口而存在。

createTrackbar函数用于创建一个可以调整数值的滑动条(常常也被称作轨迹条),并将滑动条附加到指定的窗口上,使用起来很方便。需要记住,它往往会和一个回调函数配合起来使用。先看下它的函数原型,如下:
C++: int createTrackbar (conststring& trackbarname,conststring& winname,int* value, int count,TrackbarCallback onChange=0 , void* userdata=0) ;

第一个参数,const string&类型的 trackbarname,轨迹条的名字,用来代表我们创建的轨迹条。
第二个参数,const string&类型的winname,窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
第三个参数,int*类型的value,一个指向整型的指针,表示滑块的位置。在创建时,滑块的初始位置就是该变量当前的值。
第四个参数,int类型的count,表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0。
第五个参数,TrackbarCallback类型的onChange,它有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XxXX(int,void*);,其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,则表示没有回调函数的调用,仅第三个参数value有变化。

第六个参数,void*类型的userdata,也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。
在函数讲解之后,给大家一个createTrackbar 函数使用的小例子作为参照。

创建轨迹条
createTrackbar("对比度: ","【效果图窗口】", &g_ncontrastvalue,
300, on_Change) ;

其中:g_nContrastvalue为全局的整型变量,on_Change为回调函数的函数名(在C/C++中,函数名为指向函数地址的指针)
示例程序:两幅图像的Alpha混合

代码如下:

#include
#include//opencv highgui 头文件
#include//opencv 图像处理头文件
#include 
#include
#include
using namespace cv;
#define WINDOW_NAME "[线性混合示例]"  //为窗口标题定义的宏
//全局变量的声明
const int g_nMaxAlphaValue = 100;//Alpha值得最大值
int g_nAlphaValueS1ider;//滑动条对应的变量
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_nAlphaValueS1ider /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()
{
	cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
	//加载图像(两图像的尺寸需相同)
	g_srcImage1 = imread ( "E:/pictures/slg1.png");
	g_srcImage2 = imread ( "E:/pictures/slg2.png");
	
	if (!g_srcImage1.data)
	   {
		printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~n");
		return -1;
        }
     if (!g_srcImage2.data)
	 {
		 printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~n");
		 return -1;
	 }
	 imshow("无畏1", g_srcImage1);
	 imshow("无畏2", g_srcImage2);
	 
//设置滑动条初值为70
     g_nAlphaValueS1ider = 70;
//创建窗体
     namedWindow(WINDOW_NAME, 1);
//在创建的窗体中创建一个滑动条控件
	 char TrackbarName [50] ;
     sprintf_s(TrackbarName, "透明值%d", g_nMaxAlphaValue);
    createTrackbar(TrackbarName,WINDOW_NAME, &g_nAlphaValueS1ider, g_nMaxAlphaValue, on_Trackbar);
//结果在回调函数中显示
     on_Trackbar(g_nAlphaValueS1ider, 0);
//按任意键退出
	waitKey(0);
	return 0;
}

运行此程序,我们可以通过调节滑动条的位置,来得到不同的混合效果,如图:

 其中:

1是:控制台

2是:图一

3是:图二

4是:有滑动条的混合图

5是:滑动条(控制透明度)

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5702960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存