一、算法原理
首先有四个点
p
1
,
p
2
,
q
1
,
q
2
p_{1}, p_{2}, q_{1}, q_{2}
p1,p2,q1,q2,经过单应矩阵
H
a
H_{a}
Ha 变换后得到新的点:
p
1
′
=
H
a
p
1
,
p
2
′
=
H
a
p
2
p_{1}^{'}=H_{a}p_{1}, \space\space\space\space p_{2}^{'}=H_{a}p_{2}
p1′=Hap1, p2′=Hap2
q 1 ′ = H a q 1 , q 2 ′ = H a q 2 q_{1}^{'}=H_{a}q_{1}, \space\space\space\space q_{2}^{'}=H_{a}q_{2} q1′=Haq1, q2′=Haq2
然后计算平行线段长度D
D 1 = [ p 1 − p 2 ] T [ p 1 − p 2 ] D_{1} = [p_{1}-p_{2}]^{T}[p_{1}-p_{2}] D1=[p1−p2]T[p1−p2]
D 1 ′ = [ p 1 ′ − p 2 ′ ] T [ p 1 ′ − p 2 ′ ] D_{1}^{'} = [p_{1}^{'}-p_{2}^{'}]^{T}[p_{1}^{'}-p_{2}^{'}] D1′=[p1′−p2′]T[p1′−p2′]
D 2 = [ q 1 − q 2 ] T [ q 1 − q 2 ] D_{2} = [q_{1}-q_{2}]^{T}[q_{1}-q_{2}] D2=[q1−q2]T[q1−q2]
D 2 ′ = [ q 1 ′ − q 2 ′ ] T [ q 1 ′ − q 2 ′ ] D_{2}^{'} = [q_{1}^{'}-q_{2}^{'}]^{T}[q_{1}^{'}-q_{2}^{'}] D2′=[q1′−q2′]T[q1′−q2′]
最后证明下式:
D 1 D 2 = D 1 ′ D 2 ′ \frac{D_{1}}{D_{2}} = \frac{D_{1}^{'}}{D_{2}^{'}} D2D1=D2′D1′
二、代码实现
import numpy as np
Ha = np.array([[1.078, 0.0618, 1.2], [0.9019, 1.8825, 1.2], [0, 0, 1]])
Ha
array([[1.078 , 0.0618, 1.2 ],
[0.9019, 1.8825, 1.2 ],
[0. , 0. , 1. ]])
p1 = np.array([[0.5], [-1.0], [1.0]])
p2 = np.array([[1.5], [-1.0], [1.0]])
q1 = np.array([[-0.5], [-1.5], [2]])
q2 = np.array([[-1.5], [-1.5], [2]])
实现:
p
1
′
=
H
a
p
1
,
p
2
′
=
H
a
p
2
p_{1}^{'}=H_{a}p_{1}, \space\space\space\space p_{2}^{'}=H_{a}p_{2}
p1′=Hap1, p2′=Hap2
q 1 ′ = H a q 1 , q 2 ′ = H a q 2 q_{1}^{'}=H_{a}q_{1}, \space\space\space\space q_{2}^{'}=H_{a}q_{2} q1′=Haq1, q2′=Haq2
p1_new = np.matmul(Ha, p1)
p2_new = np.matmul(Ha, p2)
q1_new = np.matmul(Ha, q1)
q2_new = np.matmul(Ha, q2)
print('p1_new: \n', p1_new, '\n p2_new: \n', p2_new, '\n q1_new: \n', q1_new, '\n q2_new: \n', q2_new)
实现:
D 1 = [ p 1 − p 2 ] T [ p 1 − p 2 ] D_{1} = [p_{1}-p_{2}]^{T}[p_{1}-p_{2}] D1=[p1−p2]T[p1−p2]
D 1 ′ = [ p 1 ′ − p 2 ′ ] T [ p 1 ′ − p 2 ′ ] D_{1}^{'} = [p_{1}^{'}-p_{2}^{'}]^{T}[p_{1}^{'}-p_{2}^{'}] D1′=[p1′−p2′]T[p1′−p2′]
D 2 = [ q 1 − q 2 ] T [ q 1 − q 2 ] D_{2} = [q_{1}-q_{2}]^{T}[q_{1}-q_{2}] D2=[q1−q2]T[q1−q2]
D 2 ′ = [ q 1 ′ − q 2 ′ ] T [ q 1 ′ − q 2 ′ ] D_{2}^{'} = [q_{1}^{'}-q_{2}^{'}]^{T}[q_{1}^{'}-q_{2}^{'}] D2′=[q1′−q2′]T[q1′−q2′]
D1 = np.matmul((p1 - p2).T, (p1-p2))
D2 = np.matmul((q1 - q2).T, (q1-q2))
D1_new = np.matmul((p1_new - p2_new).T, (p1_new-p2_new))
D2_new = np.matmul((q1_new - q2_new).T, (q1_new-q2_new))
print('D1: ', D1, '\n D2: ', D2, '\n D1_new: ', D1_new, '\n D2_new: ', D2_new)
最后计算:
D
1
D
2
=
D
1
′
D
2
′
\frac{D_{1}}{D_{2}} = \frac{D_{1}^{'}}{D_{2}^{'}}
D2D1=D2′D1′
D1/D2
array([[1.]])
D1_new/D2_new
array([[1.]])
结果一样,证明完成!