1. 图像的透视变换
1.1 简介
图像的透视变换(Perspective Transformation)是指将图像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。
透视变换是一种非线性变换,它可以将一个二维坐标系中的点映射到三维坐标系中的点,然后再将其投影到另一个二维坐标系中的点。透视变换可以改变图像中的形状,并可以模拟真实世界中的透视效果。
仿射变换可以看成是透视变换的特殊情况,下图是对几何变换的总结。
透视变换的应用:
图像矫正 透视变换可以用于矫正图像的透视失真,例如由于拍摄角度或镜头畸变导致的图像倾斜或拉伸。
图像配准 透视变换可以用于将两张或多张图像进行配准,使其具有相同的几何形状。这在医学图像处理、卫星图像处理等领域有着重要的应用。
3D 建模 透视变换可以用于将二维图像投影到三维空间,从而生成三维模型。
图像增强 透视变换可以用于调整图像的视角,使其看起来更具吸引力。
图像合成 透视变换可以用于将不同的图像合成在一起,创建新的图像。
特效 透视变换可以用于创建各种特效,例如虚拟场景、3D 动画等。
1.2 原理
透视变换的定义为将图像中的所有点按照一定的透视关系映射到新的图像中。
透视关系可以由一个3x3的透视变换矩阵来表示,透视变换的矩阵如下:
其中,、、、 表示线性变换,、 表示平移变换,、 表示透视变换。
透视变换的过程为:
此时,得到的不是最后的坐标,还需要进一步转换:
最终的坐标为:
重新回顾一下整个透视变换的过程:
不难看出看出仿射变换是透视变换的一种特殊情况。
2. 透视变换的应用
2.1 商品图位置矫正
下面的代码,对图中的没有摆正的商品通过透视变换将其对齐,然后在原图中将商品放正。主要用到了 OpenCV 的 findHomography()
、warpPerspective()
函数进行透视变换。findHomography()
函数用于计算两个平面之间进行透视变换的矩阵,warpPerspective()
函数用于对图像进行透视变换。
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
bool ascendSort(vector<Point> a,vector<Point> b)
{
return contourArea(a) > contourArea(b);
}
long pointSideLine(Point &lineP1, Point &lineP2, Point &point) {
long x1 = lineP1.x;
long y1 = lineP1.y;
long x2 = lineP2.x;
long y2 = lineP2.y;
long x = point.x;
long y = point.y;
return (x - x1)*(y2 - y1) - (y - y1)*(x2 - x1);
}
vector<Point> sortPointByClockwise(vector<Point> points) {
i