opencv 2.x学习笔记(八)滚动条、混合图像

滚动条

在之前的文章中,我们已经了解了如何去利用OpenCV的highgui模块去创建一个窗口,并且加载显示图像,那么如何在窗口上显示一个滚动条呢?OpenCV同样为我们封装了一个简单的滚动条,我们可以通过createTrackbar()来启动它。creatTrackbar()的原型如下所示:

CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

  • trackbarname:创建的滚动条的名称。
  • winname:加载滚动条窗口的名称。
  • value:一个int类型的指针,反映了滚动条的位置。滚动条的位置被这个变量所定义。
  • count:滚动条的最大位置,最小位置总是0。
  • onChange:当滚动条位置发生改变时,调用该函数。这个函数的原型是 void Foo(int , void * ),第一个参数代表滚动条的位置,第二个参数是用户数据(最后一个参数所指向的)。
  • userdata:传递给回调函数的用户数据。
我们在程序中可以这样来调用:

	createTrackbar( "Alpha 100", "blend image", &alpha_slider, alpha_slider_max, on_trackbar );

这样我们就可以创建一个名为“Alpha 100”,回调函数为on_trackbar,并在“blend image”窗口上的一个滚动条了。

混合图像

在我们看到的视频中,经常有画面逐渐消退,另一个画面逐渐显示的过程。那么怎么才能使用OpenCV来显示这种画面叠加的效果呢?在这里,我们接着介绍另一个函数:addWeighted。addWeighted函数可以帮助我们完成这种操作,它的原理是:


addWeighted()的原型为:

//! computes weighted sum of two arrays (dst = alpha*src1 + beta*src2 + gamma)
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype=-1);

从上面的参数名称中,不难看出他们所代表的含义,其中dtype表示输出图像的深度,当两个输入图像有相同的深度时,dtype通常被设为-1,表示输出图像和第一个输入图像有相同的深度。

所以我们可以这样使用,来完成图像的混合:

	alpha = (double) alpha_slider / alpha_slider_max;
	beta = 1.0 - alpha;

	addWeighted( src1, alpha, src2, beta, 0.0, dst );

其中alpha_slider表示当前滚动条的位置,alpha_slider_max为滚动条的最大位置,在我们的程序中alpha的值可以通过滚动条的位置来改变。

需要注意的是,因为我们需要对两个图像进行求和,所以,src1和src2需要有相同的尺寸(高度和宽度)和类型。否则会引起中断。

完整程序

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;
using namespace cv;

/* 全局变量 */
const int alpha_slider_max  = 100;

double alpha, beta;

Mat src1, src2, dst;

void on_trackbar( int, void * );

int main( int argc, char * argv[] )
{
	int alpha_slider = 0;
	if( argc < 3 )
	{
		cout << "请输入正确的参数!" << endl;
		return -1;
	}

	src1 = imread( argv[1], CV_LOAD_IMAGE_COLOR );
	src2 = imread( argv[2], CV_LOAD_IMAGE_COLOR );
	if( !src1.data )
	{
		cout << "图像1没有被正确加载!" << endl;
		return -1;
	}
	if( !src2.data )
	{
		cout << "图像2没有被正确加载!" << endl;
		return -1;
	}

	namedWindow( "blend image", CV_WINDOW_NORMAL );

	createTrackbar( "Alpha 100", "blend image", &alpha_slider, alpha_slider_max, on_trackbar );

	waitKey(0);
	return 0;
}

void on_trackbar(int alpha_slider, void *)
{
	alpha = (double) alpha_slider / alpha_slider_max;
	beta = 1.0 - alpha;

	addWeighted( src1, alpha, src2, beta, 0.0, dst );
	imshow( "blend image", dst );
}

运行结果:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值