本次实验是针对两幅图片的线性混合以及滑动窗口建立的实验,所谓的线性混合既是对两张相同类型相同大小的图片进行像素的加权(就是用0-1之间的一个值进行相乘)叠加;创建滑动窗只需要用到三行代码即可
//在新建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf(TrackbarName,"透明度%d",g_nMaxAlphaValue);
createTrackbar(TrackbarName,WINDOW_NAME,&g_nAlphaTrackbarValue,g_nMaxAlphaValue,on_Trackbar);
createTrackbar();函数的形参具体解释如下:
1、TrackbarName:即滑动条的名字;
2、WINDOW_NAME:在宏定义中已经给出定义,即所依附的窗口名称;
3、&g_nAlphaTrackbarValue:这是获取当前滑动条的地址变量;
4、g_nMaxAlphaValue:滑动条的最大值;
5、on_Trackbar:回调函数;这里需要注意的是形参中的void*不能丢,虽在后面的代码中并没有用到这个形参;主要是为了与createTrackbar中的形参表形式进行相对应。
混合函数使用的是Opencv3.0库中的addWeighted(),只需要用一下一行代码即可轻松搞定:
addWeighted(g_srcImage1,g_dAlphaValue,g_srcImage2,g_dBetaValue,0.0,g_srcImage3);
1、g_srcImage1:这个参数既是第一幅需要混合的图片Mat类型;
2、g_dAlphaValue:是第一幅图片对应像素的权重值;
3、g_srcImage2:第二幅图片;
4、g_dBetaValue:第二幅图片对应像素的权重值
5、第五个参数即是一个加到权重总和上的标量值,即根据dst=src1[I]*alpha+src2[I]*beta+gamma式子来的;这个一般情况下填写0.0即可;
6、g_srcImage3:即是最后混合输出后的图像矩阵;
还有其他参数,一般情况下只需要填写这些参数,其他保持默认即可。在本实验中大家可能都还没怎么感觉到C++的代码形式,之前看过其他的代码,对C++的功底要求还是挺高的。这是第一篇Opencv3.0计算机视觉的博客,后期有时间会经常抽空写一下最近的进展情况,也算是对自己学习的一个回顾,整个计算机视觉体系才走了万里长征的第一步,路漫漫其修远兮!
代码如下所示:
Code:
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "【线性混合图片】"
//全局变量声明
const int g_nMaxAlphaValue = 100;
int g_nAlphaTrackbarValue;
double g_dAlphaValue;
double g_dBetaValue;
//定义三幅图像变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_srcImage3;
//回调函数
void on_Trackbar(int,void*) //回调函数的形式参数必须写成这样,不然后面在创建Trackbar时会出现形参与入口参数的形式不符
{
//求出当前Alpha值相对于最大值的比例
g_dAlphaValue = (double)g_nAlphaTrackbarValue/g_nMaxAlphaValue;
//求出另外一个beta的值所占比例 线性混合后总的比例为1
g_dBetaValue = (1.0 - g_dAlphaValue);
//进行线性混合 所谓线性即为两幅图像幅值的不同比例之和
addWeighted(g_srcImage1,g_dAlphaValue,g_srcImage2,g_dBetaValue,0.0,g_srcImage3);
//addWeighted(g_srcImage1,0.5,g_srcImage2,0.5,0.0,g_srcImage3); //addWeighted()函数即是将两个图像矩阵按一定的比例进行线性叠加形成的
//显示图像
imshow(WINDOW_NAME,g_srcImage3);
}
int main(int argc, char** argv[])
{
//加载两幅图像
//Mat Image = imread("21.jpg");
//imshow("【原图片】",Image);
g_srcImage1 = imread("1.jpg");
g_srcImage2 = imread("2.jpg");
if((!g_srcImage1.data)|(!g_srcImage2.data))
{
printf("error:打开失败,请查看原工程下是否存在1.jpg或者2.jpg");
}
// for(;;);
//设置滑动条值为初始值70
g_nAlphaTrackbarValue = 70;
//创建窗体
namedWindow(WINDOW_NAME,1);
//在新建的窗体中创建一个滑动条控件
char TrackbarName[50];
sprintf(TrackbarName,"透明度%d",g_nMaxAlphaValue);
createTrackbar(TrackbarName,WINDOW_NAME,&g_nAlphaTrackbarValue,g_nMaxAlphaValue,on_Trackbar);
//结果在回调函数中显示
on_Trackbar(g_nAlphaTrackbarValue,0);
waitKey(0);
return 0;
}
/*int main(int argc,char** argv)
{
Mat srcImage;
srcImage = imread("1.jpg");
imshow("【原图片】",srcImage);
waitKey(0);
return 0;
}
*/
Output:
两张图片权重分别为0.5的时候输出。