opencv入门之二感兴趣区域ROI,线性混合addWeighted

Posted Haven_zhf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv入门之二感兴趣区域ROI,线性混合addWeighted相关的知识,希望对你有一定的参考价值。

参考网站:

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的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-C++选择提取感兴趣区域(ROI区域)附用鼠标选取ROI区域的代码

opencv ROI(感兴趣区域替换)

ROI区域图像叠加&初级图像混合 综合实例

opencv中使用ROI获取感兴趣区域时,如何获取一幅图像中相应的坐标,比如:

OpenCV实战——图像感兴趣区域

opencv学习笔记访问图像中像素的三种方式ROI区域图像叠加和图像混合