参考网站:
http://blog.csdn.net/poem_qianmo/article/details/20911629
1、感兴趣区域ROI
//【2】定义一个Mat类型并给其设定ROI区域 Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows )); //【3】加载掩摸(必须是灰度图) Mat mask = imread( "dota_logo.jpg", 0 ); //【4】将掩摸拷贝到ROI logoImage.copyTo( imageROI , mask );
2、addWeighted函数
其原型:
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
第一个参数:InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat
第二个参数:alpha,表示第一个数组的权重
第三个参数:src,表示需要第二个数组,它需要和第一个数组拥有相同的尺寸和通道数
第四个参数:beta,表示第二个数组的权重
第五个参数:gamma,一个加到权重总和上的标量值。????不是很懂
第六个参数:dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第七个参数:dtype,输出阵列的课选深度,有默认值-1.??????不懂
//【2】进行图像混合加权操作 betaBValue = (1.0 - aphaValue); addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage);
3、综合:
#include <cv.h>
#include <highgui.h>
#include <iostream>
//*************************【命名空间声明部分】**********************************
//描述:包含程序所使用的命名空间
//*******************************************************************************
using namespace cv;
using namespace std; //cout的命名空间???
//*************************【全局函数声明部分】**********************************
//描述:全局函数声明
//*******************************************************************************
bool ROI_AddImage();
bool LinearBlending();
bool ROI_LinearBlending();
//*************************【main()函数】**********************************
//描述:控制台应用程序的入口函数,我们的程序从这里开始
//*******************************************************************************
int main()
{
system("color 5E");
if (ROI_AddImage() && LinearBlending() && ROI_LinearBlending())
cout<<endl<<"嗯,非常gut。得出了你需要的图像了。!!!";
waitKey(0);
return 0;
}
//*************************【ROI_AddImage()函数】**********************************
//函数名:ROI_AddImage()
//描述 :利用感兴趣区域ROI实现图像叠加
//*******************************************************************************
bool ROI_AddImage()
{
//【1】读入图像
Mat srcImage1 = imread("dota_pa.jpg");
Mat logoImage = imread("dota_logo.jpg");
if (!srcImage1.data) { printf("damm,读取文件srcImage1错误~!\n"); return false; }
if (!logoImage.data) { printf("damm,读取文件logoImage错误~!\n"); return false; }
//【2】定义一个Mat类型并给其设定ROI区域
Mat imageROI = srcImage1( Rect(200, 250, logoImage.cols, logoImage.rows ));
//【3】加载掩摸(必须是灰度图)
Mat mask = imread( "dota_logo.jpg", 0 );
//【4】将掩摸拷贝到ROI
logoImage.copyTo( imageROI , mask );
//【5】显示结果
namedWindow( " <1>利用ROI实现图像叠加示例窗口 " );
imshow( " <1>利用ROI实现图像叠加示例窗口 ",srcImage1 );
return true;
}
//*************************【LinearBlending()函数】************************************
//函数名:LinearBlending()
//描述 :利用cv::addWeighted()函数实现图像线性混合
//************************************************************************************
bool LinearBlending()
{
//【0】定义一些局部变量
double aphaValue = 0.5;
double betaBValue;
Mat srcImage2,srcImage3,dstImage;
//【1】读取图像(两幅图片需要同样的类型和尺寸)
srcImage2 = imread("mogu.jpg");
srcImage3 = imread("rain.jpg");
if (!srcImage2.data) { printf("damm,读取文件srcImage2错误~!\n"); return false; }
if (!srcImage3.data) { printf("damm,读取文件srcImage3错误~!\n"); return false; }
//【2】进行图像混合加权操作
betaBValue = (1.0 - aphaValue);
addWeighted( srcImage2, aphaValue, srcImage3, betaBValue, 0.0, dstImage);
//【3】创建并显示原图窗口
namedWindow( "<2>线性混合示例窗口【原图】" , 1);
imshow( "<2>线性混合示例窗口【原图】", srcImage2 );
namedWindow( "<3>线性混合示例窗口【效果图】" , 1);
imshow( "<3>线性混合示例窗口【效果图】", srcImage3 );
namedWindow( "<4>线性混合示例窗口【效果图】" , 1);
imshow( "<4>线性混合示例窗口【效果图】", dstImage );
return true;
}
//*************************【ROI_LinearBlending()函数】**********************************
//函数名:ROI_LinearBlending()
//描述 :线性混合实现函数,指定区域线性图像线性混合
// 利用cv::addWeighted()函数结合定义感兴趣区域ROI,实现自定义区域的线性混合
//***************************************************************************************
bool ROI_LinearBlending()
{
//【1】读取图像
Mat srcImage4 = imread("dota_pa.jpg");
Mat logoImage = imread("dota_logo.jpg");
if (!srcImage4.data) { printf("damm,读取文件srcImage4错误~!\n"); return false; }
if (!logoImage.data) { printf("damm,读取文件logoImage错误~!\n"); return false; }
//【2】定义一个Mat类型并给其设定ROI区域
//第一种表达
Mat imageROI = srcImage4( Rect(200, 250, logoImage.cols, logoImage.rows) );
//第二种表达
//Mat imageROI = srcImage4( Range(250, 250+logoImage.rows), Range(200, 200+logoImage.cols) );
//【3】将logo加到原图上
addWeighted(imageROI, 0.5, logoImage, 0.3, 0.0, imageROI);
//【4】显示结果
namedWindow("<5>区域线性图像混合示例窗口", 1);
imshow("<5>区域线性图像混合示例窗口", srcImage4);
return true;
}
【opencv入门之二】感兴趣区域ROI,线性混合addWeighted
原文:http://www.cnblogs.com/havendblog/p/7538444.html