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

来源:互联网 发布:支付宝知托付 广告 编辑:程序博客网 时间:2024/05/18 03:12

滚动条

在之前的文章中,我们已经了解了如何去利用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