前言
这一次我们一起学习如何定义感兴趣区域ROI,如何使用addWeighted函数进行图像混合操作,以及将ROI和addWeighted函数结合起来使用,对指定区域进行图像混合操作(编译环境OpenCV 3.0beta和VS2010)
一、设置感兴趣区域
好了,下面我们来看一个实例,显示如何利用ROI将一幅图加到另一 幅图的指定位置。 大家如果需要拷
贝如下的函数中的代码直接运行的话,自己建一个基于console的程序 ,然后把函数体中的内容拷贝到
main
函数中,然后找两幅大小合适的图片,加入到工程目录下,并和代码中读取的文件名一 致即可。
在下面的代码中,我们通过一个图像掩膜( mask ),直接将插入 处的像素设置为logo图像的像素值,
这样效果会很赞很逼真
二、ROT代码示例
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
bool lien()
{
Mat imag1;
Mat imag2;
Mat imag3;
imag1=imread("girl.jpg");
imag2=imread("zhi.jpg");
if(!imag1.data){printf("error\r\n"); return false;}
if(!imag2.data){printf("error\r\n"); return false;}
Mat imageROI = imag1(Rect(200,350,imag2.cols,imag2.rows));
Mat mask=imread("zhi.jpg",0);
imag2.copyTo(imageROI,mask);
namedWindow("混合图像");
imshow("混合图像",imag1);
return true;
}
int main()
{
lien();
waitKey();
return 0;
}
原图像1
原图像2
混合图像
这里的皮皮志是通过操作之后加上去的图像
二、addWeighted代码示例
代码解析
定义一些局部变量alpha值和beta值
这里我们设置alpha的值为0.7
double alpha=0.7;
double beta;
Mat imag1;
Mat imag2;
Mat imag3;
读取两幅图像并做错误处理
imag1=imread("fire.jpg");
imag2=imread("rain.jpg");
if(!imag1.data){printf("error\r\n"); return false;}
if(!imag2.data){printf("error\r\n"); return false;}
图分别为
<2 >进行图像混合加权操作
载入图像后,我们就可以来生成混合图像,也就是之前公式中的g(x)。为此目的,使用函数addWeighted可以很方便地实现,也就是因
为addWeighted进行了如下计算:
这里的对应于addWeighted的第2个参数alpha
这里的对应于addWeighted的第4个参数beta
这里的对应于addWeighted的第5个参数,在上面代码中被我们设为0.0。
代码其实很简单,就是这样:
beta=(1.0-alpha);
addWeighted(imag1,alpha,imag2,beta,0.0,imag3);
namedWindow("原图1");
imshow("原图1",imag1);
namedWindow("原图2");
imshow("原图2",imag2);
namedWindow("混合图像");
imshow("混合图像",imag3);
通过代码我们可以其实这样理解,imag1透明度为0.7,imag2透明度为0.3
他们合起来加载到imag3,形成一个新的图像,这就是图像混合。
让我们运行整个代码
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
bool lien()
{
double alpha=0.7;
double beta;
Mat imag1;
Mat imag2;
Mat imag3;
imag1=imread("fire.jpg");
imag2=imread("rain.jpg");
if(!imag1.data){printf("error\r\n"); return false;}
if(!imag2.data){printf("error\r\n"); return false;}
beta=(1.0-alpha);
addWeighted(imag1,alpha,imag2,beta,0.0,imag3);
namedWindow("原图1");
imshow("原图1",imag1);
namedWindow("原图2");
imshow("原图2",imag2);
namedWindow("混合图像");
imshow("混合图像",imag3);
return true;
}
int main()
{
lien();
waitKey();
return 0;
}
最后得出很唯美的一张图片
是不是感觉更加高大上了~
总结
最后再混合两张图,代表我们对知识和未知世界的探索~
一张是我们眼睛的图
一张是未知的宇宙
以上就是今天要讲的内容,本文简单介绍了ROT和addWeight的使用
参考博文:OpenCV之ROI区域图像叠加和混合