滚动条
在之前的文章中,我们已经了解了如何去利用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 );
}
运行结果: