原创文章,转载请联系博主并注明出处 https://blog.csdn.net/huohu9973/article/details/82012140
联系方式:yuhenglu@pku.edu.cn
问题定义:
输入:
1、给定球型全景图像的展开图。
2、给定输出图像的横向视场(field of view)以、横纵比及分辨率。
3、给定当前正视视角,通过经纬度表示。
输出:
当前给定视角、视场、横纵比下的图像。
主要流程
1、通过横向视场以、横纵比、分辨率计算纵向的视场大小以及球心到视平面的距离。
2、对于输出指定输出图像上的每个点,计算在球型全景模型下对应投影的球面经纬度坐标。
3、对于第二步计算出的经纬度坐标,求解全景展开图像中的图像坐标,并将展开图中的该点贴到输出图像中。
辅助图像
墨卡托投影动画
http://cdn.hujiulong.com/geohey/blog/mercator/play.html
相关计算
- 根据横向视场、输出图像横纵比计算纵向视场
如图1所示
width/2D=tan(wfov2)(1) w i d t h / 2 D = t a n ( w f o v 2 ) ( 1 )
height/2D=tan(hfov2)(2) h e i g h t / 2 D = t a n ( h f o v 2 ) ( 2 )
由(1)、(2)可得
tan(hfov2)=width/2D×heightwidth=heightwidth×tan(wfov2)(3) t a n ( h f o v 2 ) = w i d t h / 2 D × h e i g h t w i d t h = h e i g h t w i d t h × t a n ( w f o v 2 ) ( 3 )
由(3)可得
hfov=2×arctan(heightwidth×tan(wfov2)) h f o v = 2 × a r c t a n ( h e i g h t w i d t h × t a n ( w f o v 2 ) ) - 根据横向视场、图像分辨率求球心到视平面的距离
如图2所示
width2=tan(wfov2)×D w i d t h 2 = t a n ( w f o v 2 ) × D
D=width2×cot(wfov2) D = w i d t h 2 × c o t ( w f o v 2 ) - 如图3所示,根据视场中心点B以及视平面某点D,求D的俯仰角
β′
β
′
与偏转角
α′
α
′
已知视场中心点B的俯仰角为 β β ,偏转角为 α α ,线段AB、BG、GD的长度为D, x, y。
BH=AB×sin(β)(4) B H = A B × s i n ( β ) ( 4 )
AH=AB×cos(β)(5) A H = A B × c o s ( β ) ( 5 )
AH=AB×cos(β)(6) A H = A B × c o s ( β ) ( 6 )
记B,D两点在竖直方向上的高度差为 Δh Δ h
Δh=GD×cos(β)(7) Δ h = G D × c o s ( β ) ( 7 )
HI=GD×sin(β)(8) H I = G D × s i n ( β ) ( 8 )
DE=BH−Δh(9) D E = B H − Δ h ( 9 )
FE=AH+HI(10) F E = A H + H I ( 10 )
IE=BG(11) I E = B G ( 11 )
tan(β′)=DEFE(12) t a n ( β ′ ) = D E F E ( 12 )
tan(α′)=IEFE(13) t a n ( α ′ ) = I E F E ( 13 )
由(4)~(13)式可得
β′=arctan(BH−ΔhAH+HI)=arctan(AB×sin(β)−GD×cos(β)AB×cos(β)−GD×sin(β))=arctan(D×sin(β)−y×cos(β)D×cos(β)−y×sin(β)) β ′ = a r c t a n ( B H − Δ h A H + H I ) = a r c t a n ( A B × s i n ( β ) − G D × c o s ( β ) A B × c o s ( β ) − G D × s i n ( β ) ) = a r c t a n ( D × s i n ( β ) − y × c o s ( β ) D × c o s ( β ) − y × s i n ( β ) )
α′=arctan(IEAH+HI)=arctan(BGAB×cos(β)−GD×sin(β))=arctan(xD×cos(β)−y×sin(β)) α ′ = a r c t a n ( I E A H + H I ) = a r c t a n ( B G A B × c o s ( β ) − G D × s i n ( β ) ) = a r c t a n ( x D × c o s ( β ) − y × s i n ( β ) ) - 根据俯仰角、偏转角求解球面全景图像中的经纬度
如图4所示, β β 为点E的俯仰角, α α 为点E的偏转角,点B是点E所在纬线与xoz平面的交点, ∠AOB ∠ A O B 即为要求的纬度, α α 即为要求的经度, θ=∠EOF θ = ∠ E O F ,EO=R,。BO = R
EF=EO×sin(θ)(14) E F = E O × s i n ( θ ) ( 14 )
FO=EO×cos(θ)(15) F O = E O × c o s ( θ ) ( 15 )
DF=EF×cos(β)=OF×cot(α)(16) D F = E F × c o s ( β ) = O F × c o t ( α ) ( 16 )
由(14)~(16)式可得
θ=arctan(cot(α)×sec(β)) θ = a r c t a n ( c o t ( α ) × s e c ( β ) )
ED=EF×sin(β)(17) E D = E F × s i n ( β ) ( 17 )
ED=BA(18) E D = B A ( 18 )
由(14)~(18)式可得
∠AOB=arcsin(BAOB)=arcsin(EO×sin(θ)×sin(β)OB)=arcsin(sin(θ)×sin(β))=arcsin(sin(arctan(cot(α)×sec(β)))×sin(β)) ∠ A O B = a r c s i n ( B A O B ) = a r c s i n ( E O × s i n ( θ ) × s i n ( β ) O B ) = a r c s i n ( s i n ( θ ) × s i n ( β ) ) = a r c s i n ( s i n ( a r c t a n ( c o t ( α ) × s e c ( β ) ) ) × s i n ( β ) ) - 根据俯经纬度求展开的平面坐标
根据墨卡托投影展开
y=longitude180×width2+width2 y = l o n g i t u d e 180 × w i d t h 2 + w i d t h 2
x=sign(latitude)×ln(tan(|latitude|)+sec(|latitude|))×height2+height2 x = s i g n ( l a t i t u d e ) × l n ( t a n ( | l a t i t u d e | ) + s e c ( | l a t i t u d e | ) ) × h e i g h t 2 + h e i g h t 2
根据经纬度比例展开
y=longitude180×width2+width2 y = l o n g i t u d e 180 × w i d t h 2 + w i d t h 2
x=latitude90×height2+height2 x = l a t i t u d e 90 × h e i g h t 2 + h e i g h t 2
实验结果
全景展开图像
俯角=0,偏转角=0,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=0,偏转角=90,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=0,偏转角=-90,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=0,偏转角=180,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=20,偏转角=0,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=-20,偏转角=0,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
俯角=-90,偏转角=0,w_fov = 100,
heightwidth=0.75
h
e
i
g
h
t
w
i
d
t
h
=
0.75
, 输出分辨率=[1024,768]
reference
[1] 一个小游戏让你彻底弄懂墨卡托投影,https://blog.csdn.net/chelen_jak/article/details/80415642
[2] 墨卡托投影,https://blog.csdn.net/mygisforum/article/details/13295223