我正在寻找一种方法将图像放置在设定位置的另一张图像上。
我可以使用cv::addWeighted
将图片放在彼此之上但是当我搜索此特定问题时,我找不到与C++
相关的任何帖子。
快速示例:
200x200
红场& 100x100
蓝色广场
&
红色广场上的蓝色广场70x70
(来自蓝色方块的左上角Pixel)
答案 0 :(得分:4)
您还可以创建指向原始图像的矩形区域的Mat,并将蓝色图像复制到该区域:
Mat bigImage = imread("redSquare.png", -1);
Mat lilImage = imread("blueSquare.png", -1);
Mat insetImage(bigImage, Rect(70, 70, 100, 100));
lilImage.copyTo(insetImage);
imshow("Overlay Image", bigImage);
答案 1 :(得分:1)
从beaker answer构建,并推广到任何输入图像大小,并进行一些错误检查:
cv::Mat bigImage = cv::imread("redSquare.png", -1);
const cv::Mat smallImage = cv::imread("blueSquare.png", -1);
const int x = 70;
const int y = 70;
cv::Mat destRoi;
try {
destRoi = bigImage(cv::Rect(x, y, smallImage.cols, smallImage.rows));
} catch (...) {
std::cerr << "Trying to create roi out of image boundaries" << std::endl;
return -1;
}
smallImage.copyTo(destRoi);
cv::imshow("Overlay Image", bigImage);
注意:如果2张图片的格式不同,可能会失败,例如如果一个是彩色而另一个是灰度。
答案 2 :(得分:0)
建议的显式算法:
1 - 阅读两张图片。例如, bottom.ppm,top.ppm , 2 - 阅读叠加的位置。例如,让“bottom.ppm”上的“top.ppm”的左上角为(x,y),其中0 <0。 x&lt; bottom.height()和0&lt; y&lt; bottom.width()的, 3 - 最后,在顶部图像上嵌套循环以逐个像素地修改底部图像:
for(int i=0; i<top.height(); i++) {
for(int j=0; j<top.width(), j++) {
bottom(x+i, y+j) = top(i,j);
}
}
返回底部图片。