使用opencv复制/混合不同大小的图像
Posted
技术标签:
【中文标题】使用opencv复制/混合不同大小的图像【英文标题】:Copy / blend images of different sizes using opencv 【发布时间】:2013-07-23 23:16:39 【问题描述】:我正在尝试混合两个图像。如果它们具有相同的大小,这很容易,但如果其中一个图像更小或更大,则 cv::addWeighted 失败。
图片 A(预计更大) 图 B(预计更小)
我尝试创建 ROI - 尝试创建 A 大小的第三张图像并在其中复制 B - 我似乎无法正确处理。请帮忙。
double alpha = 0.7; // something
int min_x = ( A.cols - B.cols)/2 );
int min_y = ( A.rows - B.rows)/2 );
int width, height;
if(min_x < 0)
min_x = 0; width = (*input_images).at(0).cols - 1;
else width = (*input_images).at(1).cols - 1;
if(min_y < 0)
min_y = 0; height = (*input_images).at(0).rows - 1;
else height = (*input_images).at(1).rows - 1;
cv::Rect roi = cv::Rect(min_x, min_y, width, height);
cv::Mat larger_image(A);
// not sure how to copy B into roi, or even if it is necessary... and keep the images the same size
cv::addWeighted( larger_image, alpha, A, 1-alpha, 0.0, out_image, A.depth());
即使像 cvSetImageROI 这样的东西 - 可能有效,但我找不到 c++ 等价物 - 可能会有所帮助 - 但我不知道如何使用它来保持图像内容,只在 ROI 内放置另一个图像...
【问题讨论】:
您希望out_image
成为 (1) A
的裁剪部分与 B
混合(因此是 B
的大小)或 (2) A
的大小与B
混合的选定部分(因此A
的大小)?
A 的大小 - 所选部分与 B 混合
为什么是width = (*input_images).at(0).cols - 1
?为什么不(*input_images).at(0).cols
?
@Thalia,你能说出你在if
语句中分配给height
和width
的*input_images
是什么吗?
【参考方案1】:
// min_x, min_y should be valid in A and [width height] = size(B)
cv::Rect roi = cv::Rect(min_x, min_y, B.cols, B.rows);
// "out_image" is the output ; i.e. A with a part of it blended with B
cv::Mat out_image = A.clone();
// Set the ROIs for the selected sections of A and out_image (the same at the moment)
cv::Mat A_roi= A(roi);
cv::Mat out_image_roi = out_image(roi);
// Blend the ROI of A with B into the ROI of out_image
cv::addWeighted(A_roi,alpha,B,1-alpha,0.0,out_image_roi);
请注意,如果要将B
直接混合到A
中,则只需要roi
。
cv::addWeighted(A(roi),alpha,B,1-alpha,0.0,A(roi));
【讨论】:
我仍然得到与我一直得到的相同的错误:输入参数的大小不匹配(操作既不是'array op array'(其中数组具有相同的大小和相同的数量通道),也不是未知函数中的“array op scalar op array”,...\arithm.cpp,第 1277 行 试试cv::Rect roi = cv::Rect(min_x, min_y, B.cols, B.rows);
它有点工作 - 谢谢 - 除了结果是将图像 A 调整为图像 B 的大小 - 并且两者混合在一起。我使用 A(roi) 作为输出
这太完美了!谢谢 !我现在对 roi 有了更好的了解。
@Jacob 很好的解释。谷歌把我带到了这里。 :D【参考方案2】:
您可以使用addWeighted()
function 轻松混合两个图像
addWeighted(src1, alpha, src2, beta, 0.0, dst);
声明两个图像
src1 = imread("c://test//blend1.jpg");
src2 = imread("c://test//blend2.jpg");
声明alpha
和beta
的值,然后调用函数。你完成了。您可以在链接中找到详细信息:Blending of Images using Opencv
【讨论】:
以上是关于使用opencv复制/混合不同大小的图像的主要内容,如果未能解决你的问题,请参考以下文章