前言:在做項目的時候,用到了關于 “點” 的透視變換,查閱很多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_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); //點的透視變換,透視變換矩陣和圖像透視變換矩陣一樣
三、總 結
點的透視變換和圖檔的透視變換本質上是一樣的,具體步驟都是一樣的:
- 定義4個原始點和4個目标點。
- 利用點的對應關系,求透視變換矩陣。
- 根據透視變換矩陣得到透視變換後的點或者圖像。