使用OpenCV将图像扭曲成另一张图像的四边形区域

6

我有一张图片,并知道该图片的四个坐标,现在我只想将另一张小图片放在由这四个点形成的轮廓上。这个轮廓几乎是一个正方形。 有没有办法用图片填充这个轮廓?

我尝试创建一个矩形,但我无法使用多个点创建一个矩形。 我陷入了困境。找不到任何解决方案。

1个回答

12
我假设你想把一张图片(我们称之为img)变形成放在另一张图片(我们称之为canvas)上的四边形。换句话说,你基本上想做到这样:

首先,你需要找到矩阵变换T来描述原始矩形图片(img)和目标四边形(我们称之为warpedImg)之间的关系:
cv::Mat T = getPerspectiveTransform(imgCorners,     // std::vector<cv::Point2f> that contains img's vertices -- i.e. (0, 0) (0,img.rows) (img.cols, img.rows) (img.cols, 0)
                                    warpedCorners); // std::vector<cv::Point2f> that contains warpedImg's vertices

接下来,您可以使用Timg生成warpedImg

cv::Mat warpedImg;
cv::warpPerspective(img, warpedImg, T, canvas.size());

最后,要将“warpedImg”“粘贴”到“canvas”上,您可以首先在“canvas”中“遮罩”四边形区域:
cv::fillConvexPoly(canvas, warpedCorners, cv::Scalar::all(0), CV_AA);

然后进行“或”操作:
cv::bitwise_or(warpedImg, canvas, canvas);

就是这样!


2
您真是太棒了。我完全理解了这个概念,而且它非常有效。谢谢您。 - Sagar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接