网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[
x
y
1
]
\begin{bmatrix}u{}‘\v{}’\w\end{bmatrix}=H
\begin{bmatrix}x\y\1\end{bmatrix}\tag1
其中投影矩阵
H
H
H为一个3×33×33\times 3方阵,
H=⎡⎣⎢h1h4h7h2h5h8h3h6h9⎤⎦⎥(2)
(2)
H
=
[
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
h
9
]
H=\begin{bmatrix}h_{1}&h_{2}&h_{3}\
h_{4}&h_{5}&h_{6}\h_{7}&h_{8}&h_{9}\end{bmatrix}\tag2
点
p′(u,v)
p
′
(
u
,
v
)
p{}'(u, v)的坐标为
{u=u′/wv=v′/w(3)
(3)
{
u
=
u
′
/
w
v
=
v
′
/
w
\left{\begin{matrix}u=u{}‘/w
\ v=v{}’/w\end{matrix}\right.\tag3
也就是
⎧⎩⎨u=h1x+h2y+h3h7x+h8y+h9v=h4x+h5y+h6h7x+h8y+h9(4)
(4)
{
u
=
h
1
x
h
2
y
h
3
h
7
x
h
8
y
h
9
v
=
h
4
x
h
5
y
h
6
h
7
x
h
8
y
h
9
\left{\begin{matrix}u=\frac{h_{1}x+h_{2}y+h_{3}}{h_{7}x+h_{8}y+h_{9}}\
v=\frac{h_{4}x+h_{5}y+h_{6}}{h_{7}x+h_{8}y+h_{9}}\end{matrix}\right.\tag4
注意到,上式中等式的格式为矩阵
H
H
H中各行系数求比,也就说等式右边的分子分母可同时乘以一个缩放因子⎧⎩⎨u=h1x+h2y+h3h7x+h8y+h9×sxsxv=h4x+h5y+h6h7x+h8y+h9×sysy(5)(5){u=h1x+h2y+h3h7x+h8y+h9×sxsxv=h4x+h5y+h6h7x+h8y+h9×sysy\left{\begin{matrix}u=
\frac{h_{1}x+h_{2}y+h_{3}}{h_{7}x+h_{8}y+h_{9}}\times \frac{s_{x}}{s_{x}}\
v=\frac{h_{4}x+h_{5}y+h_{6}}{h_{7}x+h_{8}y+h_{9}}\times \frac{s_{y}}{s_{y}}
\end{matrix}\right.\tag5
而不影响结果的正确性,因此投影矩阵不是唯一的,矩阵元素可以等比例放缩,故在求解矩阵
H
H
H时,未知数只有8个而不是9个,只要为矩阵中任意一非零元素的赋一确定值,其他元素根据比例也就得到了确定的值。通常情况下,我们使用的矩阵是将h9h9h_{9}的值置为1而得到的,记为
H0=H,whereh9=1
H
0
=
H
,
w
h
e
r
e
h
9
=
1
H_{0}=H, where,h_{9}=1。之所以这么做,是为了使元素
h3
h
3
h_{3}、
h6
h
6
h_{6}为
u
u
u、vvv在
x
x
x和yyy都取
0
0
0时的值,这在某些应用场合是有特定意义的。如在相机标定应用中,当h9h9h_{9}取
1
1
1时,h3h3h_{3}、
h6
h
6
h_{6}为相机图像的主点(光轴与成像平面的交点)坐标,此时
h1
h
1
h_{1}、
h5
h
5
h_{5}分别是相机在水平和垂直方向的像素焦距值。
从前面的推导可以看出,每提供两个平面上的一对点,即可联立分别基于
x
x
x和yyy坐标的两个方程,而求投影矩阵
H
H
H需要8个约束条件,故需要提供4对点才能求出HHH。
我们将
(4)
(
4
)
(4)式写成如下形式
{h1x+h2y+h3−h7ux−h8uy−h9u=0h4x+h5y+h6−h7vx−h8vy−h9v=0(6)
(6)
{
h
1
x
h
2
y
h
3
−
h
7
u
x
−
h
8
u
y
−
h
9
u
=
0
h
4
x
h
5
y
h
6
−
h
7
v
x
−
h
8
v
y
−
h
9
v
=
0
\left{\begin{matrix}
h_{1}x+h_{2}y+h_{3}-h_{7}ux-h_{8}uy-h_{9}u=0\
h_{4}x+h_{5}y+h_{6}-h_{7}vx-h_{8}vy-h_{9}v=0
\end{matrix}\right.\tag6
也就是
{Xh=0Yh=0(7)
(7)
{
X
h
=
0
Y
h
=
0
\left{\begin{matrix}
\mathbf{Xh}=0\
\mathbf{Yh}=0
\end{matrix}\right.\tag7
其中
{X=(x,y,1,0,0,0,−ux,−uy,−u)Y=(0,0,0,x,y,1,−vx,−vy,−v)(8)
(8)
{
X
=
(
x
,
y
,
1
,
0
,
0
,
0
,
−
u
x
,
−
u
y
,
−
u
)
Y
=
(
0
,
0
,
0
,
x
,
y
,
1
,
−
v
x
,
−
v
y
,
−
v
)
\left{\begin{matrix}
\mathbf{X}=\left ( x,,y,,1,,0,,0,,0,,-ux,,-uy,,-u \right )\
\mathbf{Y}=\left ( 0,,0,,0,,x,,y,,1,,-vx,,-vy,,-v \right )
\end{matrix}\right.\tag8
h=(h1,h2,h3,h4,h5,h6,h7,h8,h9)T(9)
(9)
h
=
(
h
1
,
h
2
,
h
3
,
h
4
,
h
5
,
h
6
,
h
7
,
h
8
,
h
9
)
T
\mathbf{h}=\left ( h_{1},,h_{2},,h_{3},,h_{4},,h_{5},,h_{6},,h_{7},,h_{8},,h_{9} \right )^{T}\tag9
当有两个平面上的四对点
(xi,yi)
(
x
i
,
y
i
)
(x_{i},,y_{i})、
(ui,vi)
(
u
i
,
v
i
)
(u_{i},,v_{i}),
(i=1,2,3,4)
(
i
=
1
,
2
,
3
,
4
)
(i=1,2,3,4)时,即可得如式
(10)
(
10
)
(10)所示的方程组
Ah=0(10)
(10)
A
h
=
0
A\mathbf{h}=\mathbf{0}\tag{10}
其中
A=[X1Y1X2Y2X3Y3X4Y4]T(11)
(11)
A
=
[
X
1
Y
1
X
2
Y
2
X
3
Y
3
X
4
Y
4
]
T
A=\begin{bmatrix}
\mathbf{X_{1}} & \mathbf{Y_{1}} & \mathbf{X_{2}} & \mathbf{Y_{2}} & \mathbf{X_{3}} & \mathbf{Y_{3}}& \mathbf{X_{4}} & \mathbf{Y_{4}}
\end{bmatrix}^{T}\tag{11}
为了更直观,下面将
(11)
(
11
)
(11)式展开
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x10x20x30x40y10y20y30y40101010100x10x20x30x40y10y20y30y401010101−u1x1−v1x1−u2x2−v2x2−u3x3−v3x3−u4x4−v4x4−u1y1−v1y1−u2y2−v2y2−u3y3−v3y3−u4y4−v4y4−u1−v1−u2−v2−u3−v3−u4−v4⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢h1h2h3h4h5h6h7h8h9⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢00000000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥(12)
(12)
[
x
1
y
1
1
0
0
0
−
u
1
x
1
−
u
1
y
1
−
u
1
0
0
0
x
1
y
1
1
−
v
1
x
1
−
v
1
y
1
−
v
1
x
2
y
2
1
0
0
0
−
u
2
x
2
−
u
2
y
2
−
u
2
0
0
0
x
2
y
2
1
−
v
2
x
2
−
v
2
y
2
−
v
2
x
3
y
3
1
0
0
0
−
u
3
x
3
−
u
3
y
3
−
u
3
0
0
0
x
3
y
3
1
−
v
3
x
3
−
v
3
y
3
−
v
3
x
4
y
4
1
0
0
0
−
u
4
x
4
−
u
4
y
4
−
u
4
0
0
0
x
4
y
4
1
−
v
4
x
4
−
v
4
y
4
−
v
4
]
[
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
h
9
]
=
[
0
0
0
0
0
0
0
0
]
\begin{bmatrix}
x_{1} & y_{1} & 1 & 0 & 0 & 0 & -u_{1}x_{1} & -u_{1}y_{1} & -u_{1}\
0 & 0 & 0 & x_{1} & y_{1} & 1 & -v_{1}x_{1} & -v_{1}y_{1} & -v_{1}\
x_{2} & y_{2} & 1 & 0 & 0 & 0 & -u_{2}x_{2} & -u_{2}y_{2} & -u_{2}\
0 & 0 & 0 & x_{2} & y_{2} & 1 & -v_{2}x_{2} & -v_{2}y_{2} & -v_{2}\
x_{3} & y_{3} & 1 & 0 & 0 & 0 & -u_{3}x_{3} & -u_{3}y_{3} & -u_{3}\
0 & 0 & 0 & x_{3} & y_{3} & 1 & -v_{3}x_{3} & -v_{3}y_{3} & -v_{3}\
x_{4} & y_{4} & 1 & 0 & 0 & 0 & -u_{4}x_{4} & -u_{4}y_{4} & -u_{4}\
0 & 0 & 0 & x_{4} & y_{4} & 1 & -v_{4}x_{4} & -v_{4}y_{4} & -v_{4}
\end{bmatrix}
\begin{bmatrix}
h_{1}\h_{2}\h_{3}\h_{4}\h_{5}\h_{6}\h_{7}\h_{8}\h_{9}
\end{bmatrix}
=\begin{bmatrix}
0\0\0\0\0\0\0\0
\end{bmatrix}\tag{12}
接下来的任务就是怎么解这个方程了,这个矩阵的解法一般使用奇异值分解。像
(12)
(
12
)
(12)式这样的方程我们称为齐次方程,与之对应的是非齐次方程,如
Ah=b(13)
(13)
A
h
=
b
A\mathbf{h}=\mathbf{b}\tag{13}
其中
b≠0
b
≠
0
\mathbf{b}\neq \mathbf{0},将
(13)
(
13
)
(13)式与
(10)
(
10
)
(10)式对比就知道,它们的差别是“常数项”是否为零向量,所以我对“齐次方程”这个概念的理解是,方程只有因变量和自变量而没有常数项,例如
y=kx
y
=
k
x
y=kx和
f(x,y)=ax+by
f
(
x
,
y
)
=
a
x
b
y
f(x,,y)=ax+by和这种是齐次的,而
y=kx+b
y
=
k
x
b
y=kx+b和
f(x,y)=ax+by+c
f
(
x
,
y
)
=
a
x
b
y
c
f(x,,y)=ax+by+c是非齐次的。
像解
(13)
(
13
)
(13)式这样的非齐次矩阵方程,可以通过求矩阵
A
A
A的伪逆矩阵A−1A−1A^{-1},也就是
h=A−1Ah=A−1b(14)
(14)
h
=
A
−
1
A
h
=
A
−
1
b
\mathbf{h}=A{-1}A\mathbf{h}=A{-1}\mathbf{b}\tag{14}
伪逆矩阵是逆矩阵的广义形式,我们平时说的逆矩阵处理的对象是满秩的方阵,对一个任意非方阵矩阵
M
M
M,其大小为m×n(m≠n)m×n(m≠n)m \times n,(m\neq n),它的伪逆矩阵
M−1
M
−
1
M^{-1}大小为
n×m
n
×
m
n \times m,且
M−1M
M
−
1
M
M^{-1}M为一个
n×n
n
×
n
n \times n的单位矩阵。
如果解
(10)
(
10
)
(10)式也这么做,结果是
h=0
h
=
0
\mathbf{h}=\mathbf{0},但这显然不符合条件。于是我们要用到奇异值分解。
2.奇异值分解
在线性代数中,奇异值分解(SVD, singular-value decomposition)是实数或复数矩阵的因式分解,它是方阵的特征值分解在非方阵矩阵上的一般化。
在介绍SVD之前先温习一下特征值分解的知识。对于一个
n×n
n
×
n
n \times n矩阵
M
M
M和一个nnn维非零向量
v
v
\mathbf{v},如果有
Mv=λv(15)
(15)
M
v
=
λ
v
M\mathbf{v}=\lambda \mathbf{v}\tag{15}
其中
λ
λ
\lambda为一标量,则
λ
λ
\lambda为矩阵
M
M
M的一个特征值,vv\mathbf{v}为
λ
λ
\lambda对应的特征向量。若
M
M
M有nnn个线性无关的特征向量
qi(i=1,2,…,n)
q
i
(
i
=
1
,
2
,
.
.
.
,
n
)
q_{i}(i=1,2,…,n)。这样,
M
M
M可以被分解为M=QΛQ−1(16)(16)M=QΛQ−1
M=Q\Lambda Q^{-1}\tag{16}
其中
Q
Q
Q是n×nn×nn \times n的方阵,
Λ
Λ
\Lambda为对角矩阵,其对角线上的元素即为
M
M
M的一系列特征值,即Λii=λiΛii=λi\Lambda_{ii}=\lambda_{i}。
而奇异值分解能分解非方阵矩阵,矩阵
A
A
A为一nnn行
p
p
p列矩阵(n×p)(n×p)(n \times p),则SVD可表述为如下式子
An×p=Un×nSn×pVTp×p(17)
(17)
A
n
×
p
=
U
n
×
n
S
n
×
p
V
p
×
p
T
A_{n\times p}=U_{n\times n}S_{n\times p}V_{p\times p}^{T}\tag{17}
其中
UTU=In×n(18)
(18)
U
T
U
=
I
n
×
n
U^{T}U=I_{n\times n}\tag{18}
VTV=Ip×p(19)
(19)
V
T
V
=
I
p
×
p
V^{T}V=I_{p\times p}\tag{19}
即矩阵
U
U
U、VVV均为正交矩阵。矩阵
U
U
U、VVV分别由
n
n
n个、ppp个互相正交的向量组成,在这里我们关心矩阵
V
V
V,有V=v1v2⋯vp(20)V=[v1v2⋯vp]
V=\begin{bmatrix}
\mathbf{v}_{1} & \mathbf{v}_{2} & \cdots & \mathbf{v}_{p}
\end{bmatrix}\tag{20}
其中对于任意的两个向量
vi
v
i
\mathbf{v}_{i}、
vj
v
j
\mathbf{v}_{j}的点积有,
{vi⋅vj=0,i≠jvi⋅vj≠0,i=j(21)
(21)
{
v
i
⋅
v
j
=
0
,
i
≠
j
v
i
⋅
v
j
≠
0
,
i
=
j
\left{\begin{matrix}
\mathbf{v}_{i}\cdot \mathbf{v}_{j}=0,,i\neq j\
\mathbf{v}_{i}\cdot \mathbf{v}_{j}\neq 0,,i=j
\end{matrix}\right.\tag{21}
而矩阵
S
S
S由一系列奇异值组成,除在SiiSiiS_{ii}上的奇异值外,其他值都为0,在本应用中被分解的是8行9列矩阵,正常情况下奇异值有8个(
σ1,σ2,⋯,σ8
σ
1
,
σ
2
,
⋯
,
σ
8
\sigma_{1},,\sigma_{2},,\cdots ,,\sigma_{8}),非正常情况后文有分析。那么我们在这里就可以说
(10)
(
10
)
(10)式的解
h
h
\mathbf{h}为:
**矩阵
A
A
A奇异值分解后VVV矩阵的最后一列向量**
vp
v
p
\mathbf{v}_{p}。
这个结论可以很简单地推导如下:
Avp=Un×n⎡⎣⎢⎢⎢⎢⎢σ10⋮00σ2⋮0⋯⋯⋱⋯00⋮σn00⋮0⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢vT1vT2⋮vTp⎤⎦⎥⎥⎥⎥⎥vp(22)
(22)
A
v
p
=
U
n
×
n
[
σ
1
0
⋯
0
0
0
σ
2
⋯
0
0
⋮
⋮
⋱
⋮
⋮
0
0
⋯
σ
n
0
]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
λ
\lambda为一标量,则
λ
λ
\lambda为矩阵
M
M
M的一个特征值,vv\mathbf{v}为
λ
λ
\lambda对应的特征向量。若
M
M
M有nnn个线性无关的特征向量
qi(i=1,2,…,n)
q
i
(
i
=
1
,
2
,
.
.
.
,
n
)
q_{i}(i=1,2,…,n)。这样,
M
M
M可以被分解为M=QΛQ−1(16)(16)M=QΛQ−1
M=Q\Lambda Q^{-1}\tag{16}
其中
Q
Q
Q是n×nn×nn \times n的方阵,
Λ
Λ
\Lambda为对角矩阵,其对角线上的元素即为
M
M
M的一系列特征值,即Λii=λiΛii=λi\Lambda_{ii}=\lambda_{i}。
而奇异值分解能分解非方阵矩阵,矩阵
A
A
A为一nnn行
p
p
p列矩阵(n×p)(n×p)(n \times p),则SVD可表述为如下式子
An×p=Un×nSn×pVTp×p(17)
(17)
A
n
×
p
=
U
n
×
n
S
n
×
p
V
p
×
p
T
A_{n\times p}=U_{n\times n}S_{n\times p}V_{p\times p}^{T}\tag{17}
其中
UTU=In×n(18)
(18)
U
T
U
=
I
n
×
n
U^{T}U=I_{n\times n}\tag{18}
VTV=Ip×p(19)
(19)
V
T
V
=
I
p
×
p
V^{T}V=I_{p\times p}\tag{19}
即矩阵
U
U
U、VVV均为正交矩阵。矩阵
U
U
U、VVV分别由
n
n
n个、ppp个互相正交的向量组成,在这里我们关心矩阵
V
V
V,有V=v1v2⋯vp(20)V=[v1v2⋯vp]
V=\begin{bmatrix}
\mathbf{v}_{1} & \mathbf{v}_{2} & \cdots & \mathbf{v}_{p}
\end{bmatrix}\tag{20}
其中对于任意的两个向量
vi
v
i
\mathbf{v}_{i}、
vj
v
j
\mathbf{v}_{j}的点积有,
{vi⋅vj=0,i≠jvi⋅vj≠0,i=j(21)
(21)
{
v
i
⋅
v
j
=
0
,
i
≠
j
v
i
⋅
v
j
≠
0
,
i
=
j
\left{\begin{matrix}
\mathbf{v}_{i}\cdot \mathbf{v}_{j}=0,,i\neq j\
\mathbf{v}_{i}\cdot \mathbf{v}_{j}\neq 0,,i=j
\end{matrix}\right.\tag{21}
而矩阵
S
S
S由一系列奇异值组成,除在SiiSiiS_{ii}上的奇异值外,其他值都为0,在本应用中被分解的是8行9列矩阵,正常情况下奇异值有8个(
σ1,σ2,⋯,σ8
σ
1
,
σ
2
,
⋯
,
σ
8
\sigma_{1},,\sigma_{2},,\cdots ,,\sigma_{8}),非正常情况后文有分析。那么我们在这里就可以说
(10)
(
10
)
(10)式的解
h
h
\mathbf{h}为:
**矩阵
A
A
A奇异值分解后VVV矩阵的最后一列向量**
vp
v
p
\mathbf{v}_{p}。
这个结论可以很简单地推导如下:
Avp=Un×n⎡⎣⎢⎢⎢⎢⎢σ10⋮00σ2⋮0⋯⋯⋱⋯00⋮σn00⋮0⎤⎦⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢vT1vT2⋮vTp⎤⎦⎥⎥⎥⎥⎥vp(22)
(22)
A
v
p
=
U
n
×
n
[
σ
1
0
⋯
0
0
0
σ
2
⋯
0
0
⋮
⋮
⋱
⋮
⋮
0
0
⋯
σ
n
0
]
[外链图片转存中…(img-Lu6V4Hjb-1715891015723)]
[外链图片转存中…(img-V2Q6FmPu-1715891015723)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新