栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

OpenCV学习(8)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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是:滑动条(控制透明度)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702854.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号