【OpenCV学习】--Task3:图像的叠加以及初级图像的混合

一、环境

系统: Ubuntu16.04
OpenCV版本: OpenCV3.2
语言: C++
IDE: Clion

——————————————————————————————————————————————————————————

二、源图片

图片一:女神瑞文
女神瑞文
图片二:LoL的logo在这里插入图片描述

图片三:初音在这里插入图片描述

图片四:晚霞或者日出在这里插入图片描述

三、代码

  1. 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})
  1. 源代码
#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:

  1. 直接把Logo加到图片上,也就是代码中的**ROI_AddImage()**函数实现的功能:
    在这里插入图片描述

  2. 函数**bool LinearBlending()**的功能:

在这里插入图片描述

  1. 函数**bool ROI_LinearBlending()**的功能:
    在这里插入图片描述

明显第三个函数通过线性加权混合之后的图片看起来更舒服一点,也就是给Logo淡化之后加到了原图上!
忽然感觉图像相关的东西还很有趣啊,我都有点越来越真的喜欢计算机科学了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值