【OpenCV学习】--Task3:图像的叠加以及初级图像的混合
一、环境
系统: Ubuntu16.04
OpenCV版本: OpenCV3.2
语言: C++
IDE: Clion
——————————————————————————————————————————————————————————
二、源图片
图片一:女神瑞文
图片二:LoL的logo
图片三:初音
图片四:晚霞或者日出
三、代码
- CmakeLists.txt
make_minimum_required( VERSION 2.8 )
project( imposedAndBlending )
set( CMAKE_BUILD_TYPE Release)
set( CMAKE_CXX_FLAGS "-std=c++11 -o3")
find_package( OpenCV 3.2 REQUIRED )
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable( task3_imposedAndBlending test.cpp )
target_link_libraries( task3_imposedAndBlending ${OpenCV_LIBS})
- 源代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
bool ROI_AddImage();
bool LinearBlending();
bool ROI_LinearBlending();
int main( )
{
//system("color 5E");
if (ROI_AddImage()&&LinearBlending()&&ROI_LinearBlending())
{
cout<<endl<<"well , the image you want";
}
waitKey(0);
return 0;
}
bool ROI_AddImage()
{
Mat srcImage1= imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/riwen.jpeg");
Mat logoImage= imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/logo.jpeg");
if(!srcImage1.data ) { printf("load error! \n"); return false; }
if(!logoImage.data ) { printf("load error! \n"); return false; }
// --需要注意的是这里的Rect的前两个参数就是目标图片的左上角的起始位置,就目前我的图片来数改成(0,0)之后其实更好看啦!
Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols,logoImage.rows));
Mat mask = imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/logo.jpeg", 0);
logoImage.copyTo(imageROI,mask);
namedWindow("<1>利用ROI实现图像叠加实例窗口");
imshow("<1>利用ROI实现图像叠加实例窗口",srcImage1);
imwrite("EnjoyLoLByBingo.jpg", srcImage1);
waitKey();
return true;
}
bool LinearBlending()
{
// --定义两个局部变量
double alphaValue = 0.5;
// --这里啊的alphaValue的大小就是值越小,第一张图片的参与感就越小,反之则越大,当我设置为0.1的时候就非常不明显了
double betaValue;
Mat srcImage2, srcImage3, dstImage;
// --读取图像
srcImage2 = imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/chuyin.jpeg");
srcImage3 = imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/wanxia.jpg");
if(!srcImage2.data ) { printf("load error! \n"); return false; }
if(!srcImage3.data ) { printf("load error! \n"); return false; }
// --进行图像混合加权操作
betaValue = (1.0 - alphaValue);
addWeighted( srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
// --显示图片
namedWindow("<2>LinearBlendingWindow[original]", 1);
imshow("<3>LinearBlendingWindow[fused]", srcImage2);
namedWindow("<3>LinearBlendingWindow[fused]", 1);
imshow("<3>LinearBlendingWindow[fused]",dstImage);
imwrite("EnjoyChuyinByBingo.jpg", dstImage);
waitKey();
return true;
}
bool ROI_LinearBlending()
{
// --image Reading
Mat srcImage4 = imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/riwen.jpeg");
Mat logoImage = imread("/home/hri/Project/LearnOpenCV/task3_imposedAndBlending/logo.jpeg");
if(!srcImage4.data ) { printf("load error! \n"); return false; }
if(!logoImage.data ) { printf("load error! \n"); return false; }
// --Define a Mat and set a ROI area
Mat imageROI;
imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));
// --Method2
//imageROI = srcImage4(Rect(200, 250+logoImage.rows),Range(200, 200+logoImage.cols));
addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);
// --Display the image
namedWindow("<4>ROI_LinearBlendingWindow");
imshow("<4>ROI_LinearBlendingWindow",srcImage4);
imwrite("ROI_LinearBlending_Bingo.jpg",srcImage4);
return true;
}
四、Bug调试
今天是真的出错了,主要就是处理第二个函数LinearBlending 的图像的时候,一定要注意合成的两张图片的尺寸大小,如果尺寸不一样就不会不断的报错,关于OpenCV的错误!
经过重新下载了同尺寸的图片之后问题得到了解决!
五、Results:
-
直接把Logo加到图片上,也就是代码中的**ROI_AddImage()**函数实现的功能:
-
函数**bool LinearBlending()**的功能:
- 函数**bool ROI_LinearBlending()**的功能:
明显第三个函数通过线性加权混合之后的图片看起来更舒服一点,也就是给Logo淡化之后加到了原图上!
忽然感觉图像相关的东西还很有趣啊,我都有点越来越真的喜欢计算机科学了!