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
- opencv 2.x学习笔记(八)滚动条、混合图像
- Opencv多通道图像混合-滚动条
- opencv 2.x学习笔记(六) 扫描、遍历图像
- OpenCV学习笔记(03) :图像ROI以及线性混合
- OpenCV Python 学习笔记(四) 图像混合
- opencv学习笔记-3,图像混合
- 我的OPENCV学习笔记-图像混合
- OpenCv学习笔记(八)---细说HighGUI(图像用户界面)之滑动条createTrackbar()详解
- OpenCV学习笔记02--利用滚动条控制视频;高斯滤波处理图像。
- OpenCV学习笔记(八):图像的离散傅里叶变换
- opencv学习(八)之ROI区域和图像混合叠加
- opencv 图像叠加滚动条
- OpenCV学习笔记(四):ROI区域图像叠加和图像线性混合
- OpenCV学习笔记(二)ROI区域图像叠加&初级图像混合
- OpenCV学习笔记(7)ROI区域图像叠加&初级图像混合 全剖析
- opencv学习笔记10 使用OpenCV对两幅图像求和(求混合(blending))¶
- 根据滚动条位置缩放图像(学习OpenCV课后题 2.5)
- 【OpenCV学习笔记】2.1图像混合和叠加
- make uImage(uImage生成过程)
- Servlet API
- 经典算法4之最长递增子序列
- Oracle性能优化4-索引
- sencha touch call controller function from view class in sencha touch
- opencv 2.x学习笔记(八)滚动条、混合图像
- 全面了解hive
- 程序员的奋斗史(四十二)——大学断代史(六)——我与图书馆
- dom4j 解析 xml文件
- java中的移位 <<<
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition
- django学习笔记(模板)
- [LeetCode]Copy List with Random Pointer
- Java属性类:Properties的常用方法