opencv C++将一个图像放在另一个图像的顶部的某个位置

l7mqbcuq  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(6189)

我正在寻找一种方法来放置在另一个图像在一组位置的图像。
我已经能够使用cv::addWeighted将图像放置在彼此的顶部,但当我搜索这个特定的问题时,没有任何帖子,我可以找到与C++相关的。

快速示例:
200x200红色方块和100x100蓝色方块



红色方块上的蓝色方块70x70(从左上角蓝色方块的像素开始)

jogvjijk

jogvjijk1#

可以创建指向原始图像的矩形区域的Mat,然后将蓝色图像复制到该区域:

cv::Mat bigImage = cv::imread("redSquare.png", cv::IMREAD_UNCHANGED);
cv::Mat lilImage = cv::imread("blueSquare.png", cv::IMREAD_UNCHANGED);

cv::Mat insetImage(bigImage, cv::Rect(70, 70, 100, 100));
lilImage.copyTo(insetImage);
    
cv::imshow("Overlay Image", bigImage);
u59ebvdq

u59ebvdq2#

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::操作员()
注:如果2个图像具有不同的格式,例如,如果一个是彩色,另一个是灰度,则可能仍会失败。

iq3niunx

iq3niunx3#

建议的显式算法:
1 -读取两个图像。例如,bottom.ppm,top.ppm,2 -读取重叠位置。例如,* 让“top.ppm”在“bottom.ppm”上的所需左上角为(x,y),其中0〈x〈bottom.height()且0〈y〈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);
    }
}

返回底部图像。

相关问题