Bootstrap

opencv两张图片叠加显示

(一)、线性混合操作:使用addWeighted()

1、代码

#include<opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;

int main(int argc, char *argv[]) {
    Mat image, imagesrc1, imagesrc2;
    imagesrc1 = cv::imread("../data/test1.jpg");//读取图像1
    imagesrc2 = cv::imread("../data/test2.jpg");//读取图像2
    //判断读入是否成功
    if (!imagesrc1.data | !imagesrc2.data) {
        std::cout << "打开图片失败,请检查路径!" << std::endl;
        return 0;
    }
    //调整image2的大小与image1的大小一致,融合函数addWeighted()要求输入的两个图形尺寸相同
    resize(imagesrc2, imagesrc2, Size(imagesrc1.cols, imagesrc1.rows));
    addWeighted(imagesrc1, 0.3, imagesrc2, 0.7, 0, image);//0.5+0.5=1,0.3+0.7=1
    imshow("效果图", image);
    //建立显示窗口
    namedWindow("效果图");
    imwrite("../save/fuse.png", image);
    waitKey();
    return 0;
}


2、说明

1、先读取两张图;
2、调整image2的大小与image1的大小一致,融合函数addWeighted()要求输入的两个图形尺寸相同;
3、addWeighted(imagesrc1, 0.3, imagesrc2, 0.7, 0, image);这一行是给两张图片分别赋予权重,只要给的两个权重加起来等于1即可;
4、显示效果图;
5、写入处理之后的图片。

3、图片效果

在这里插入图片描述在这里插入图片描述

(二)、使用roi和mask方式

1、代码

void  GenerateRendering(Mat &srcImage, Mat &IC, Mat &IP, Mat &rending) {
    Mat mask1, mask2, tmp;
    IP.copyTo(mask1);
    IC.copyTo(mask2);
    //绿色通道分离出来
    vector<Mat> channels;
    Mat  imageGreenChannel;//1
    Mat  imageRedChannel;//2
    Mat greenmerge;
    split(IP, channels);//分离色图像色彩通道,则三通道图像成为三个单通道图像
    imageGreenChannel = channels.at(1);
    channels[0] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
    channels[2] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
    merge(channels, greenmerge);
    //再抠掉
    greenmerge.copyTo(srcImage, mask1);
    srcImage.copyTo(tmp);
    //红色通道分离出来
    vector<Mat> channels1;
    Mat redmerge;
    split(IC, channels1);//分离色图像色彩通道,则三通道图像成为三个单通道图像
    imageRedChannel = channels1.at(2);
    channels1[0] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
    channels1[1] = Mat::zeros(Size(IP.rows, IP.cols), CV_8UC1);
    merge(channels1, redmerge);
    //再抠掉IC将红色粘上去
    redmerge.copyTo(tmp, mask2);
    tmp.copyTo(rending);
}

2、说明

1、先读取3张图;
2、类似于抠图那种将图片加上去
重要的是这个函数: greenmerge.copyTo(srcImage, mask1);

3、图片效果

在这里插入图片描述

;