使用 OpenCV 将图像变形为另一个图像的四边形区域
Warp an image into a quad region of another image using OpenCV
我有一个图像,我知道该图像的四个坐标,现在我只想在这四个点形成的轮廓上放置另一个小图像。这个轮廓几乎是一个正方形。
有没有办法用图像填充这个轮廓点?
我试图创建一个矩形,但我无法使用多个点创建一个矩形。
我卡住了。找不到任何解决方案。
我假设你想 "warp" 一个图像(我们称之为 img
)到放置在另一个图像中的四边形(我们称之为 canvas
) - 即你基本上想要这样做:
首先,您需要找到矩形图像 (img
) 和目标四边形(我们称之为 warpedImg
)之间的变换(矩阵)T
:
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
然后,您可以使用 T
从 img
:
生成 warpedImg
cv::Mat warpedImg;
cv::warpPerspective(img, warpedImg, T, canvas.size());
最后,要"paste"warpedImg
到canvas
,可以先"mask"canvas
中的四边形区域:
cv::fillConvexPoly(canvas, warpedCorners, cv::Scalar::all(0), CV_AA);
然后应用"or"操作:
cv::bitwise_or(warpedImg, canvas, canvas);
就是这样!
我有一个图像,我知道该图像的四个坐标,现在我只想在这四个点形成的轮廓上放置另一个小图像。这个轮廓几乎是一个正方形。 有没有办法用图像填充这个轮廓点?
我试图创建一个矩形,但我无法使用多个点创建一个矩形。 我卡住了。找不到任何解决方案。
我假设你想 "warp" 一个图像(我们称之为 img
)到放置在另一个图像中的四边形(我们称之为 canvas
) - 即你基本上想要这样做:
首先,您需要找到矩形图像 (img
) 和目标四边形(我们称之为 warpedImg
)之间的变换(矩阵)T
:
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
然后,您可以使用 T
从 img
:
warpedImg
cv::Mat warpedImg;
cv::warpPerspective(img, warpedImg, T, canvas.size());
最后,要"paste"warpedImg
到canvas
,可以先"mask"canvas
中的四边形区域:
cv::fillConvexPoly(canvas, warpedCorners, cv::Scalar::all(0), CV_AA);
然后应用"or"操作:
cv::bitwise_or(warpedImg, canvas, canvas);
就是这样!