我正在寻找一种方法来放置在另一个图像在一组位置的图像。我已经能够使用cv::addWeighted将图像放置在彼此的顶部,但当我搜索这个特定的问题时,没有任何帖子,我可以找到与C++相关的。
cv::addWeighted
C++
快速示例:200x200红色方块和100x100蓝色方块
200x200
100x100
和
红色方块上的蓝色方块70x70(从左上角蓝色方块的像素开始)
70x70
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);
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个图像具有不同的格式,例如,如果一个是彩色,另一个是灰度,则可能仍会失败。
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); } }
返回底部图像。
3条答案
按热度按时间jogvjijk1#
可以创建指向原始图像的矩形区域的Mat,然后将蓝色图像复制到该区域:
u59ebvdq2#
从beaker answer构建,并泛化到任何输入图像大小,并进行一些错误检查:
检查cv::Mat::操作员()
注:如果2个图像具有不同的格式,例如,如果一个是彩色,另一个是灰度,则可能仍会失败。
iq3niunx3#
建议的显式算法:
1 -读取两个图像。例如,bottom.ppm,top.ppm,2 -读取重叠位置。例如,* 让“top.ppm”在“bottom.ppm”上的所需左上角为(x,y),其中0〈x〈bottom.height()且0〈y〈bottom.width()*,3 -最后,在顶部图像上嵌套循环以逐个像素地修改底部图像:
返回底部图像。