OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspectivecv.findHomography
Posted 虾米小馄饨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspectivecv.findHomography相关的知识,希望对你有一定的参考价值。
引言
图像的几何变换通常包括拉伸、缩放、扭曲和旋转等操作。
对于平面区域来说,分为两类几何转换:1
- ⭐️仿射变换(affine transform),基于
2x3矩阵
进行变换。指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够保持图像的平直性和平行性。平直性是指图像经过仿射变换后,直线仍然是直线;平行性是指图像在完成仿射变换后,平行线仍然是平行线。 - ⭐️透视变换(projective transform),基于
3x3矩阵
进行变换。透视变换将视锥体转换为长方体形状,视锥体的近端比远端小,具有扩大相机附近物体的效果。透视变换可以改变平行关系,将矩形映射为任意四边形。
透视变换通常被用于当作从特定角度观察三维平面的计算方法(非垂直观测),在三维视觉领域具有广泛的应用。
本文主要介绍opencv中的透视变换(projective transform)原理和代码。
透视变换(projective transform)
透视变换,又称为投影变换,是指将坐标为 ( X , Y , Z ) (X,Y,Z) (X,Y,Z)的物理点 Q Q Q映射到投影平面上坐标为 ( x , y ) (x,y) (x,y)的点 q q q的过程1。
基本投影几何
将定义摄像机参数的矩阵(包含 f x , f y , c x , c y f_x,f_y,c_x,c_y fx,fy,cx,cy)称为摄像机的内参数矩阵(camera intrinsics matrix)。
物理世界中的点 Q Q Q投影到摄像机上的点 q q q的过程,可以用下式表示:
q = M ⋅ Q , 其 中 q = [ x y w ] , M = [ f x 0 c x 0 f y c y 0 0 1 ] , Q = [ X Y Z ] q=M\\cdot{Q},其中q= \\begin{bmatrix} x \\\\ y \\\\ w \\end{bmatrix} , M=\\begin{bmatrix} f_x & 0 & c_x \\\\ 0 & f_y & c_y \\\\ 0 & 0 & 1 \\end{bmatrix} ,Q=\\begin{bmatrix} X \\\\ Y \\\\ Z \\end{bmatrix} q=M⋅Q,其中q=⎣⎡xyw⎦⎤,M=⎣⎡fx000fy0cxcy1⎦⎤,Q=⎣⎡XYZ⎦⎤
单应性(Homography)
计算机视觉中,平面的单应性被定义为从一个平面到另一个平面的投影映射。(注:“单应性”在不同学科有不同含义,在数学上有更通用的意思。这里仅说明计算机视觉中的单应性。1)
二维平面上的点映射到摄像机成像画面上的映射,就是平面单应性的典型例子。
利用齐次坐标,可以对物理世界的点Q到成像画面上的点q的映射进行表示:
q
=
s
⋅
M
⋅
W
⋅
Q
q =s \\cdot{M}\\cdot{W} \\cdot{Q}
q=s⋅M⋅W⋅Q
其中,参数s表示尺度比例,
M
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
M=\\begin{bmatrix} f_x & 0 & c_x \\\\ 0 & f_y & c_y \\\\ 0 & 0 & 1 \\end{bmatrix}
M=⎣⎡fx000fy0cxcy1⎦⎤ ,W表示旋转R和平移t的影响之和
W
=
[
R
t
]
W = [R \\space\\space\\space t]
W=[R t],旋转矩阵
R
=
[
r
1
⃗
r
2
⃗
r
3
⃗
]
R=\\begin{bmatrix} \\vec{r_1} & \\vec{r_2} & \\vec{r_3} \\end{bmatrix}
R=[r1r2r3]
由于我们只关注这个物体平面,为了简化计算,令Z=0:
[
x
y
1
]
=
s
⋅
M
⋅
[
r
1
⃗
r
2
⃗
r
3
⃗
t
⃗
]
⋅
[
X
Y
0
1
]
=
s
⋅
M
⋅
[
r
1
⃗
r
2
⃗
t
⃗
]
⋅
[
X
Y
1
]
\\begin{bmatrix} x \\\\ y \\\\ 1 \\end{bmatrix} =s \\cdot{M}\\cdot{\\begin{bmatrix} \\vec{r_1} & \\vec{r_2} & \\vec{r_3} & \\vec{t} \\end{bmatrix}} \\cdot{\\begin{bmatrix} X \\\\ Y \\\\ 0 \\\\ 1 \\end{bmatrix}} =s \\cdot{M}\\cdot{\\begin{bmatrix} \\vec{r_1} & \\vec{r_2} & \\vec{t} \\end{bmatrix}} \\cdot{\\begin{bmatrix} X \\\\ Y \\\\ 1 \\end{bmatrix}}
⎣⎡xy1⎦⎤=s⋅M⋅[r1r2r3t]⋅⎣⎢⎢⎡OpenCV中的透视变换介绍