在 OpenCV 中将较小的图像叠加在较大的图像中

Posted

技术标签:

【中文标题】在 OpenCV 中将较小的图像叠加在较大的图像中【英文标题】:Overlay smaller image in a larger image in OpenCV 【发布时间】:2012-04-03 16:31:50 【问题描述】:

我想用我在 Opencv 中的图像替换部分图像

我用过

cvGetPerspectiveMatrix() with a warpmatrix and using cvAnd() and cvOr()

但无法让它工作

这是当前显示图像和替换图像的白色多边形的代码。我想用任何尺寸的图片替换白色多边形,并用指向的区域替换。

虽然代码在 javacv 中,但即使发布了 c 代码,我也可以将其转换为 java

grabber.start();
while(isDisp() && (image=grabber.grab())!=null)
  if (dst_corners !=  null) // corners of the image to be replaced
  CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length);
  cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image 
  
correspondFrame.showImage(image);

对此的任何指示都会非常有帮助。

更新:

我在这段代码中使用了 warpmatrix,我得到了覆盖图像的黑点

cvSetImageROI(image, cvRect(x1,y1, overlay.width(), overlay.height()));
CvPoint2D32f p = new CvPoint2D32f(4);
CvPoint2D32f q = new CvPoint2D32f(4);

q.position(0).x(0);
q.position(0).y(0);
q.position(1).x((float) overlay.width());
q.position(1).y(0);
q.position(2).x((float) overlay.width());
q.position(2).y((float) overlay.height());
q.position(3).x(0);
q.position(3).y((float) overlay.height());

p.position(0).x((int)Math.round(dst_corners[0]);
p.position(0).y((int)Math.round(dst_corners[1]));
p.position(1).x((int)Math.round(dst_corners[2]));
p.position(1).y((int)Math.round(dst_corners[3]));
p.position(3).x((int)Math.round(dst_corners[4]));
p.position(3).y((int)Math.round(dst_corners[5]));
p.position(2).x((int)Math.round(dst_corners[6]));
p.position(2).y((int)Math.round(dst_corners[7]));

cvGetPerspectiveTransform(q, p, warp_matrix);

cvWarpPerspective(overlay, image, warp_matrix);

我得到一个覆盖图像的黑点,即使原始图像是一个有 4 个顶点的多边形,覆盖图像也被设置为一个矩形。我相信这是因为投资回报率。谁能告诉我如何按原样拟合图像,以及为什么我得到一个黑点而不是覆盖图像。

【问题讨论】:

你的多边形轴是否对齐(更具体地说,矩形)? 它不是一个矩形,也不是轴对齐的,但它只有4个顶点。 【参考方案1】:

我认为cvWarpPerspective(link) 就是您要找的。​​p>

所以不要这样做

CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length);
cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image

试试

cvWarpPerspective(yourimage, image, M, image.size(), INTER_CUBIC, BORDER_TRANSPARENT);

其中M 是您从cvGetPerspectiveMatrix 得到的矩阵

【讨论】:

您好,我正在使用 cvGetPerspectiveTransform(q,p,warp_matrix);其中 p 具有图像角,q 具有覆盖图像角。然后我将这个warp_matrix用于warpperspective,但它仍然无法替换图像。我错过了什么吗? 你能粘贴你的代码吗?您所说的“无法替换”是什么意思? 我添加了一个更新,请检查那里的代码 :) 正如我所说,我想在一个有 4 个顶点的多边形中放置一个叠加图像,不一定是一个矩形。谢谢你帮助我 @PavanK 我认为您不需要为图像设置 ROI。并确保 dst_corners 的顺序正确。你可以打印出 warp_matrix 看看cvGetPerspectiveTransform 是否给你一些合理的东西。 如果我不设置 ROI,那么整个图像就会出现乱码。 dst_corners 有正确的角,因为当我使用 convexpolyfill 时它可以完美填充。我将打印 warp_matrix 以查看是否有任何问题。我真的被困在这里,我不知道出了什么问题。【参考方案2】:

一种方法是将图片缩放为白色多边形大小,然后将其复制到设置其感兴趣区域的抓取图像(这里是 link 解释 ROI)。 您的代码应如下所示:

resize(pic, resizedImage, resizedImage.size(), 0, 0, interpolation); //resizedImage should have the points size
cvSetImageROI(image, cvRect(the points coordinates));
cvCopy(resizedImage,image);
cvResetImageROI(image);

希望对你有帮助。

最好的问候, 丹尼尔

【讨论】:

以上是关于在 OpenCV 中将较小的图像叠加在较大的图像中的主要内容,如果未能解决你的问题,请参考以下文章

在openCV中,如何替换图像中的RGB ROI

利用OpenCV的函数max()和min()取两幅图像中相同位置像素点的较大值或较小值

如何使用 Python PIL 模糊图像的非矩形或圆形区域?

对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响

在R中将较大的Dataframe子化为较小的Dataframe?

基于OpenCV的图像梯度与边缘检测!