cvAddWeighted( ) 是opencv中,将两个图片矩阵进行融合的一个很好的函数,可以得到很多有趣的效果。
其函数原型如下:
void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
src1
第一个原数组.
alpha
第一个数组元素的权值
src2
第二个原数组
beta
第二个数组元素的权值
dst
输出数组
gamma
添加的常数项。
函数 cvAddWeighted 计算两数组的加权值的和:
dst(I)=src1(I)*alpha+src2(I)*beta+gamma
所有的数组必须的相同的类型相同的大小(或ROI大小)
注意:在这里src1,src2,以及dst,都必须是同样的图片类型,如:IPL_DEPTH_8U,在调用cvLoadImage( ) 时,打开方式也必须完全相同,这里1表示以三通道彩色图像方式输入,0表示以灰度图片格式输入,-1表示以原来图片的格式输入
看个例子:
-
-
-
-
-
int main(int argc, char* argv[])
-
{
-
IplImage *src1,*src2;
-
if(argc == 9 && (src1=cvLoadImage(argv[ 1], 1))!= 0 && (src2=cvLoadImage(argv[ 2], 1))!= 0)
-
{
-
IplImage *image=cvCreateImage(cvSize( 275, 313),IPL_DEPTH_8U, 3);
-
cvResize(src2,image);
-
int x= atoi(argv[ 3]);
-
int y= atoi(argv[ 4]);
-
int width= atoi(argv[ 5]);
-
int height= atoi(argv[ 6]);
-
double alpha=( double)atof(argv[ 7]);
-
double beta=( double)atof(argv[ 8]);
-
cvSetImageROI(src1,cvRect(x,y,width,height));
-
cvSetImageROI(image,cvRect( 10, 10,width,height));
-
cvAddWeighted(src1,alpha,image,beta, 0.0,src1);
-
cvResetImageROI(src1);
-
cvNamedWindow( "Alpha_bend", 1);
-
cvShowImage( "Alpha_bend",src1);
-
cvWaitKey( 0);
-
cvReleaseImage(&src1);
-
cvReleaseImage(&src2);
-
cvDestroyWindow( "Alpha_bend");
-
-
}
-
return 0;
-
}
我的命令行参数是:cvAddWeighted.exe lena.jpg cat.jpg 235 221 115 156 0.8 0.2
当然这里还可以自己调整。
这里由于cat.jpg图片比较大,我先对他进行缩放,然后在和lena.jpg进行图片融合,当然融合的坐标点我实在ps里得到的。