DAY2 OpenCv学习笔记: C++ 透视变换

透视变换:图像几何变换,将原图像按坐标投射到新的平面上,从四组对应点计算新的坐标,进行线性变换。

在OPENCV中,可能过Mat getPerspectiveTransform ( cons point2f src [] , const Point2f dst [] )轻松地将图像投射到新的平面上。

参数:

  • src - 输入图像上矩形顶点的坐标
  • dst - 输出图像上相应矩形的顶点坐标

此次,需要将原图的四张扑克牌中,首先将斜的黑桃K剪切出来,再进行旋转,形成新的黑桃K图像,大致过程:

DAY2 OpenCv学习笔记: C++ 透视变换_第1张图片

透视变换

首先通过原图进行取点分析:

DAY2 OpenCv学习笔记: C++ 透视变换_第2张图片

原图

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

DAY2 OpenCv学习笔记: C++ 透视变换_第3张图片

四个点的位置分别为(527,141),(771,190),(405,395),(674,457),再依据勾股定理,算出黑桃K的长:350,宽:249,如图:

DAY2 OpenCv学习笔记: C++ 透视变换_第4张图片

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

DAY2 OpenCv学习笔记: C++ 透视变换_第5张图片

依据前一次的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);

你可能感兴趣的:(C++,opencv,c++,计算机视觉)