C ++将图像放在某个位置的另一个图像上

时间:2015-04-01 16:18:15

标签: c++ image opencv

我正在寻找一种方法将图像放置在设定位置的另一张图像上。

我可以使用cv::addWeighted将图片放在彼此之上但是当我搜索此特定问题时,我找不到与C++相关的任何帖子。

快速示例:

200x200红场& 100x100蓝色广场

enter image description here & enter image description here

红色广场上的蓝色广场70x70(来自蓝色方块的左上角Pixel)

enter image description here

3 个答案:

答案 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);

检查cv::Mat::operator()

注意:如果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);
    }
}

返回底部图片。