[VP] 证明多视觉几何中平行线段长度比不变

平行线段长度比不变


一、算法原理

首先有四个点 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=[p1p2]T[p1p2]

D 1 ′ = [ p 1 ′ − p 2 ′ ] T [ p 1 ′ − p 2 ′ ] D_{1}^{'} = [p_{1}^{'}-p_{2}^{'}]^{T}[p_{1}^{'}-p_{2}^{'}] D1=[p1p2]T[p1p2]

D 2 = [ q 1 − q 2 ] T [ q 1 − q 2 ] D_{2} = [q_{1}-q_{2}]^{T}[q_{1}-q_{2}] D2=[q1q2]T[q1q2]

D 2 ′ = [ q 1 ′ − q 2 ′ ] T [ q 1 ′ − q 2 ′ ] D_{2}^{'} = [q_{1}^{'}-q_{2}^{'}]^{T}[q_{1}^{'}-q_{2}^{'}] D2=[q1q2]T[q1q2]

最后证明下式:

D 1 D 2 = D 1 ′ D 2 ′ \frac{D_{1}}{D_{2}} = \frac{D_{1}^{'}}{D_{2}^{'}} D2D1=D2D1

二、代码实现

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=[p1p2]T[p1p2]

D 1 ′ = [ p 1 ′ − p 2 ′ ] T [ p 1 ′ − p 2 ′ ] D_{1}^{'} = [p_{1}^{'}-p_{2}^{'}]^{T}[p_{1}^{'}-p_{2}^{'}] D1=[p1p2]T[p1p2]

D 2 = [ q 1 − q 2 ] T [ q 1 − q 2 ] D_{2} = [q_{1}-q_{2}]^{T}[q_{1}-q_{2}] D2=[q1q2]T[q1q2]

D 2 ′ = [ q 1 ′ − q 2 ′ ] T [ q 1 ′ − q 2 ′ ] D_{2}^{'} = [q_{1}^{'}-q_{2}^{'}]^{T}[q_{1}^{'}-q_{2}^{'}] D2=[q1q2]T[q1q2]

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=D2D1

D1/D2

array([[1.]])

D1_new/D2_new

array([[1.]])

结果一样,证明完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是土豆大叔啊!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值