Bootstrap

OpenCV——透视变换

透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面,示意图如图所示。透视变换常用于机器人视觉导航研究中,由于相机视场与地面存在倾斜角使得物体成像产生畸变,通常通过透视变换实现对物体图像的校正。透视变换中,透视前的图像和透视后的图像之间的变换关系可以用一个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;

}

 

;