1 透视变换
透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。如下图所示,通过透视变换ABC变换到A’B’C’。

2 使用OpenCV实现透视变换
2.1 getPerspectiveTransform
由四对点计算透射变换,返回由源图像中矩形到目标图像矩形变换的矩阵。

2.2 warpPerspective
使用getPerspectiveTransform得到的透视变换矩阵,对图像进行透视变换,返回的是相同size的图片。

3 代码实现
3.1 C++
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
/// 全局变量
const char* source_window = "Source image";;
const char* warpPerspective_window = "warpPerspective";
/**
* @主函数
*/
int main( )
{
Point2f srcTri[4];
Point2f dstTri[4];
Mat warpPerspective_mat(3, 3, CV_32FC1);
Mat src, warpPerspective_dst;
/// Load the image
src = imread("lena.bmp", IMREAD_COLOR);
/// Set the dst image the same type and size as src
warpPerspective_dst = Mat::zeros( src.rows, src.cols, src.type() );
/// 设置4组点,求出变换矩阵
srcTri[0] = Point2f( 0, 0);
srcTri[1] = Point2f( src.cols-1, 0 );
srcTri[2] = Point2f( 0, src.rows-1);
srcTri[3] = Point2f(src.cols-1, src.rows - 1);
dstTri[0] = Point2f( 0,src.rows*0.13 );
dstTri[1] = Point2f( src.cols*0.9,0 );
dstTri[2] = Point2f( src.cols*0.2,src.rows*0.7 );
dstTri[3] = Point2f( src.cols*0.8,src.rows );
//计算4个二维点对之间的仿射变换矩阵(2行x3列)
warpPerspective_mat = getPerspectiveTransform(srcTri, dstTri);
//应用仿射变换,可以恢复出原图
warpPerspective( src, warpPerspective_dst, warpPerspective_mat, src.size() );
//显示结果
namedWindow( source_window, WINDOW_AUTOSIZE );
imshow( source_window, src );
namedWindow( warpPerspective_window, WINDOW_AUTOSIZE );
imshow( warpPerspective_window, warpPerspective_dst );
/// 等待,直到用户退出
waitKey(0);
return 0;
}

3.2 Python
import cv2 as cv
import numpy as np
img = cv.imread("test/scene2.png",0)
w,h = img.shape
point1 = np.array([[308,230],[500,230],[308,640],[500,640]],dtype = "float32")
point2 = np.array([[308,230],[500,230],[155,30],[835,30]],dtype = "float32")
M = cv.getPerspectiveTransform(point1,point2)
out_img = cv.warpPerspective(img,M,(w,h))
cv.imshow("img",out_img)
cv.waitKey(0)
4 参考
[1] OpenCV官方文档:
getPerspectiveTransform: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#getperspectivetransformwarpPerspective: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#warpperspective
[2] https://www.cnblogs.com/aoru45/p/9763983.html
[3] https://blog.youkuaiyun.com/i_chaoren/article/details/78324184

2650

被折叠的 条评论
为什么被折叠?



