当出现如图所示的错误时,即表明InputArray src1 和 InputArray src2 所拥有的尺寸和通道数不同。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
#define WINDOW_NAME "Linear blending example" //WINDOW_NAME改成中文会出错 Linear blending example
// ^_^ ^_^ ^_^ 【全局变量声明部分】 ^_^ ^_^ ^_^
//全局变量声明
const int g_nMaxAlphaValue = 1000; //Alpha值得最大值
//const:限定符,程序中多个地方使用同一常量时,只需修改一个符号定义即可。
int g_nAlphaValueSlider;
double g_dAlphaValue;
double g_dBetaValue;
//存储图片变量声明
Mat lady;
Mat g_srcImage2;
Mat g_dstImage;
//^_^ ^_^ ^_^ 【响应滑动条的回调函数】 ^_^ ^_^ ^_^
void on_Trackbar( int, void* )
{
//求出当前 Alpha 值相对于最大值的比例
g_dAlphaValue = (double) g_nAlphaValueSlider/g_nMaxAlphaValue;
//强制类型转换 g_nAlphaValueSlider 后再除以 g_nMaxAlphaValue
//则 beta 值为 1 减去 Alpha 值
g_dBetaValue = ( 1.0 - g_dAlphaValue );
//根据 Alpha 和 beta 值进行线性混合
addWeighted( lady, g_dAlphaValue,
g_srcImage2, g_dBetaValue,
0.0, g_dstImage); // g_srcImage1 和 g_srcImage2 原则上必须有相同的图片尺寸和通道数,
// 但是也可以通通过 resize 改变
//显示效果
imshow( WINDOW_NAME, g_dstImage );
}
//^_^ ^_^ ^_^ 【main()函数】 ^_^ ^_^ ^_^
int main()
{
//加载图像
lady = imread( "1.jpg" );
g_srcImage2 = imread( "3.jpg" );
if( !lady.data )
{
printf("Read the first picture error, "
"please make sure that there is an imread function "
"in the directory to specify the image exists!\n");
return -1; //表示返回一个代数值,一般用在子函数结尾,按照程序开发的一般惯例,表示函数失败。
}
if( !g_srcImage2.data )
{
printf("Read the first picture error, "
"please make sure that there is an imread function "
"in the directory to specify the image exists! \n");
return -1;
}
//设置滚动条初始值为 20
g_nAlphaValueSlider = 20;
//强制改变 lady 图像的大小
resize(g_srcImage2, g_srcImage2, Size(lady.cols, lady.rows));
//创建窗口
namedWindow( WINDOW_NAME, 70 );
//在创建的窗口中创建一个滑动条控件
char TrackbarName[50]; //声明数组
sprintf( TrackbarName, "透明值 %d", g_nMaxAlphaValue );
createTrackbar( TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar );
//在回调函数中显示结果
on_Trackbar( g_nAlphaValueSlider, 0 );
//按任意键退出
waitKey(0);
return 0; //表示在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数。
}
输出结果: