#include<opencv2/opencv.hpp>
#include <iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<string>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
string a1 , b1 ;
cin >> a1 >> b1;//读入图片路径
//读入图像
Mat srcImage1 = imread(a1);
Mat logoImage = imread(b1);
Mat src=srcImage1;
//判断读入图片是否正常
if (!srcImage1.data) { printf("background read error \n"); return false; }
if (!logoImage.data) { printf("logo read error \n"); return false; }
//判断贴图矩阵相对于背景矩阵是否在右下方出界(出界则裁掉)
//得到左上坐标
int a, b, c, d;
cin >> a >> b;
//判断右下是否出界
if (a + logoImage.cols > srcImage1.cols) {//向右出界
c = srcImage1.cols - a;//裁掉向右出界的贴图横坐标
}
else {//向右未出界
c = logoImage.cols;//横坐标与输入相同
}
if (b + logoImage.rows > srcImage1.rows) {//向下出界
d = srcImage1.rows - b;//裁掉向下出界的贴图横坐标
}
else {//向下未出界
d = logoImage.rows;//纵坐标坐标与输入相同
}
//在背景中使用ROI剪裁贴图所在位置
Mat imageROI = srcImage1(Rect(a, b, c, d));
//剪裁贴图掩膜以匹配背景ROI
Mat mask= logoImage(Rect(0, 0, c, d));
//将掩膜覆盖到背景roi上
mask.copyTo(imageROI, mask);
//定义窗口
namedWindow("合成图1");
//定义窗口的显示为srcImage1
imshow("合成图1", srcImage1);
//创建路径
system("mkdir c:\\save");
//将贴好的图片保存
imwrite("C:/save/save.jpg", srcImage1);
waitKey();
}
input:背景路径 贴图路径 贴图左上角横坐标 贴图左上角纵坐标
然后就是这么简单,解释都写成注释了,如果有不对的请各位大佬帮忙指正下谢谢