透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面,示意图如图所示。透视变换常用于机器人视觉导航研究中,由于相机视场与地面存在倾斜角使得物体成像产生畸变,通常通过透视变换实现对物体图像的校正。透视变换中,透视前的图像和透视后的图像之间的变换关系可以用一个3×3的变换矩阵表示,该矩阵可以通过两张图像中四个对应点的坐标求取,因此透视变换又称作“四点变换”。
根据四个对应点求取变换矩阵的getPerspectiveTransform()函数和进行透视变换的warpPerspective()函数
Mat getPerspectiveTransform( const Point2f src[], const Point2f dst[] );
void warpPerspective( InputArray src, OutputArray dst,
InputArray M, Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar& borderValue = Scalar());
- src:输入图像。
- dst:透视变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
- M:3×3的变换矩阵。
- dsize:输出图像的尺寸。
- flags:插值方法标志。
- borderMode:像素边界外推方法的标志。
- borderValue:填充边界使用的数值,默认情况下为0
简答示例:
//
// Created by smallflyfly on 2021/6/10.
//
#include "opencv2/opencv.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat im = imread("test.jpg");
Point2f srcPoints[4];
Point2f dstPoints[4];
srcPoints[0] = Point2f(20, 30);
srcPoints[1] = Point2f(50, 100);
srcPoints[2] = Point2f(200, 400);
srcPoints[3] = Point2f(500, 800);
dstPoints[0] = Point2f(45, 120);
dstPoints[1] = Point2f(80, 250);
dstPoints[2] = Point2f(300, 500);
dstPoints[3] = Point2f(600, 600);
Mat r, warp;
r = getPerspectiveTransform(srcPoints, dstPoints);
warpPerspective(im, warp, r, im.size());
imshow("warp", warp);
waitKey(0);
destroyAllWindows();
return 0;
}