C++|DAY2 OpenCv学习笔记( C++ 透视变换)

透视变换:图像几何变换,将原图像按坐标投射到新的平面上,从四组对应点计算新的坐标,进行线性变换。
在OPENCV中,可能过Mat getPerspectiveTransform ( cons point2f src [] , const Point2f dst [] )轻松地将图像投射到新的平面上。
参数:

  • src - 输入图像上矩形顶点的坐标
  • dst - 输出图像上相应矩形的顶点坐标
此次,需要将原图的四张扑克牌中,首先将斜的黑桃K剪切出来,再进行旋转,形成新的黑桃K图像,大致过程:

C++|DAY2 OpenCv学习笔记( C++ 透视变换)
文章图片

透视变换
首先通过原图进行取点分析:
C++|DAY2 OpenCv学习笔记( C++ 透视变换)
文章图片

原图
通过画图工具打开,寻找黑桃K四个点位置,并记录其坐标位置:

C++|DAY2 OpenCv学习笔记( C++ 透视变换)
文章图片


四个点的位置分别为(527,141),(771,190),(405,395),(674,457),再依据勾股定理,算出黑桃K的长:350,宽:249,如图:
【C++|DAY2 OpenCv学习笔记( C++ 透视变换)】
C++|DAY2 OpenCv学习笔记( C++ 透视变换)
文章图片


将黑桃K转换成原点坐标(0,0),则其坐标转换为:[0,0],[249,0],[0,350],[249,350],最终将黑桃K转换为:

C++|DAY2 OpenCv学习笔记( C++ 透视变换)
文章图片


依据前一次的OpenCv安装教程中的DEMO,更改其C++代码,实现如下:
string path = "images/cards.jpg";
Mat img = imread(path);
Mat matrix, chgImg;
float w = 249, h = 350; //计算出来的长和宽
Point2f src[4] = { {527,141},{771,190},{405,395},{674,457} };
Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };
matrix = getPerspectiveTransform(src, dst);
warpPerspective(img, chgImg, matrix, Point(w, h));

imshow("Image", img);
imshow("New Image", chgImg);
waitKey(0);

    推荐阅读