天天看点

【学习笔记-opencv透视变换】点的透视变换和图像透视变换

前言:在做项目的时候,用到了关于 “点” 的透视变换,查阅很多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);  // 透视变换

           

效果图如下:

原图:

【学习笔记-opencv透视变换】点的透视变换和图像透视变换

鸟瞰图:

【学习笔记-opencv透视变换】点的透视变换和图像透视变换

二、点的透视变换----得到透视后点的坐标

点的透视变换和图片的透视变换原理是一样的,具体代码如下:

//原始点
 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.;

std::vector<cv::Point2f> warpedLeftPoint;  // 点为  cv::Point2f类型  我这里是一堆点
cv::perspectiveTransform(points, warpedLeftPoint, transformMatrix);  //点的透视变换,透视变换矩阵和图像透视变换矩阵一样

           

三、总 结

点的透视变换和图片的透视变换本质上是一样的,具体步骤都是一样的:

  1. 定义4个原始点和4个目标点。
  2. 利用点的对应关系,求透视变换矩阵。
  3. 根据透视变换矩阵得到透视变换后的点或者图像。