使用OpenCV将图像变形为另一图像的四边形区域

时间:2015-12-12 02:18:29

标签: c++ opencv visual-studio-2012 contour

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

我尝试创建一个矩形,但我无法使用多个点创建一个矩形。 我被卡住了。无法找到任何解决方案。

1 个答案:

答案 0 :(得分:5)

我假设您想要“扭曲”一个图像(让我们称之为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

然后,您可以使用TwarpedImg生成img

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);

就是这样!