【学习笔记
前言:在做项目的时候,用到了关于 “点” 的透视变换,查阅很多blog,发现大多数都是关于图的透视变换,所以特意记录一下,顺便把图片的透视变换代码贴到这里,方便大家查阅。
一、图的透视变换----得到透视后的图
我们在做图像处理的时候经常需要做透视变换得到鸟瞰图,在鸟瞰图上做处理,甚至根据需要还需要将透视后 处理过的图像再次的透视变换回去。这里简单粗暴的记录一下自己曾经学习的心路。重点:简单粗暴,快速上手,废话不多说,开始我的表演。
// 定义四个原始点
cv::Point2f sourcePoints[4], objectPoints[4];
sourcePoints[0].x = 567 - 10.; sourcePoints[0].y = 461.; //left_top
sourcePoints[1].x = 692.; sourcePoints[1].y = 461.; //right_top
sourcePoints[2].x = 369 - 10.; sourcePoints[2].y = 638; //left_bottom
sourcePoints[3].x = 1058; sourcePoints[3].y = 638.; //right_bottom/
// 定义四个目标点 或者说是你透视变换后图像的大小
objectPoints[0].x = 50.; objectPoints[0].y = 15.;
objectPoints[1].x = 276.; objectPoints[1].y = 15.;
objectPoints[2].x = 50.; objectPoints[2].y = 610.;
objectPoints[3].x = 276.; objectPoints[3].y = 610.
// 透视变换矩阵
transformMatrix = cv::getPerspectiveTransform(objectPoints, sourcePoints); //perspective matrix
cv::warpPerspective(inputImage, inputImage, Matrix, Size(inputImage.rows/2, inputImage.cols/2), INTER_LINEAR); // 透视变换
效果图如下:
原图:鸟瞰图:
二、点的透视变换----得到透视后点的坐标
点的透视变换和图片的透视变换原理是一样的,具体代码如下:
//原始点sourcePoints[0].x = 567 - 10.; sourcePoints[0].y = 461.; //left_topsourcePoints[1].x = 692.; sourcePoints[1].y = 461.; //right_topsourcePoints[2].x = 369 - 10.; sourcePoints[2].y = 638; //left_bottomsourcePoints[3].x = 1058; sourcePoints[3].y = 638.; //right_bottom// 目标点objectPoints[0].x = 50.; objectPoints[0].y = 15.;objectPoints[1].x = 276.; objectPoints[1].y = 15.;objectPoints[2].x = 50.; objectPoints[2].y = 610.;objectPoints[3].x = 276.; objectPoints[3].y = 610.;std::vector<cv::Point2f> warpedLeftPoint; // 点为 cv::Point2f类型 我这里是一堆点
cv::perspectiveTransform(points, warpedLeftPoint, transformMatrix); //点的透视变换,透视变换矩阵和图像透视变换矩阵一样
三、总 结
点的透视变换和图片的透视变换本质上是一样的,具体步骤都是一样的:
- 定义4个原始点和4个目标点。
- 利用点的对应关系,求透视变换矩阵。
- 根据透视变换矩阵得到透视变换后的点或者图像。