在 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的函数max()和min()取两幅图像中相同位置像素点的较大值或较小值
如何使用 Python PIL 模糊图像的非矩形或圆形区域?
对于 Mask RCNN 模型,较小的图像对 OpenCV 中的推理时间几乎没有影响