基于街景图片的目标物地理位置及高度的三维量测算方法
技术领域
本发明涉及街景地图、电子地图学、摄影测量、GIS、Web服务、计算机图形学等领域,其目的是在现有街景地图资源的基础上,实现街景地图中目标物实际地理位置的直接量测。具体涉及Http请求、极坐标系下的空间直线确定、前方交汇等内容。
背景技术
街景地图是一种实景地图服务。为用户提供城市、街道或其他环境的提供水平方向360°及垂直方向180°的街道全景,让使用者能检视所选城市地面上街道不同位置及其两旁的景物。它是一种运用多路摄像机对真实场景进行多角度环视图像采集之后,再利用计算机进行后期融合处理,并加载播放程序来完成的一种三维虚拟展示技术。
近年来,随着互联网技术的飞速发展,三维全景、虚拟游览等各种以全景图像信息为基础的应用服务,越来越多地进入了人们的日常生活。街景地图实现了二维三维相结合的虚拟现实场景,给使用者能够带来身临其境的观感。
目前,国外的Google公司,国内的百度、腾讯等信息技术和互联网公司,均推出了面向城市街景的地图服务。但是,这些街景地图主要用于展览展示,严重浪费了街景图像中蕴含的大量信息。与传统的二维地图相比,街景地图无法实现对街景图像中地物的定位、量测,极大地限制了全景技术的广泛应用。
针对目前街景地图仅可用于展览展示的不足,本发明提出基于现有街景地图的三维量测算法,实现对街景图像中地物的实际地理坐标及高度的快速获取。
发明内容
本发明旨在解决现有街景地图无法实现对街景图片中目标物的实际地理位置、高度等信息获取的问题。在街景地图为用户提供更加真实准确、更富有画面细节的地图服务的基础上,本发明根据街景图片可以实现街景地图中目标物实际地理位置、高度的量测,使街景地图中特有的丰富信息得到利用,拓展街景在实际生产生活中的应用。
为实现上述技术目的,本发明采用如下技术方案:
一种基于街景图片的目标物地理位置及高度的三维量测算方法,包括如下步骤:
步骤1:在街景地图中,选定两个视角范围内包含待测算的目标物的视点;
步骤2:获取所选两个视点的经纬度;
步骤3:在两视点下分别获取三张不同视角的街景图片,分别为街景图片1、街景图片2和街景图片3,其中街景图片1为基准图片,街景图片2与街景图片1水平角不同,俯仰角相同,街景图片3与街景图片1水平角相同,俯仰角不同;
步骤4:计算出两视点到目标物底部上某一点的视角,包括水平角与俯仰角;
步骤5:根据步骤4中的两视点及目标物底部上某一点构建两条空间直线,前方交汇求出交点的经纬度,即目标物的实际地理位置;
步骤6:计算所选两个视点中任一视点到目标物的距离,结合该视点到目标物底部、顶部上某一点的的俯仰角求出目标物底部、顶部与视点的相对高度;
步骤7:由目标物底部、顶部与视点的相对高度得到目标物的实际高度。
本发明所述的方法,所述视点是指,拍摄该街景图像时相机所在地理位置,以经纬度表示。不同视点是指拍摄街景图片时相机的地理位置不同。所述步骤1中,视点选择时,通过旋转街景地图,将目标物调整到街景地图的合适位置,确定合适的视点;具体为,在某一视点下,通过旋转调整街景影像,使目标物大致位于屏幕中央,并且目标物整体清晰的位于视野范围内,无障碍物遮挡,则选择该视点。
所述步骤2中,视点经纬度根据视点的拍摄参数获取。
所述步骤3中,根据步骤2获取得视点经纬度,在两视点下分别获取三张不同视角的街景图片,街景图片1作为基准图,俯仰角为0,街景图片2与1水平角不同,俯仰角相同,街景图片3与1水平角相同,俯仰角不同;
视角选择时,通过旋转调整街景影像,使目标物位于屏幕合适的位置,放大或缩小影像,使得目标物不至于太小而看不清,也不至于过大而超出屏幕范围。
所述步骤4中,在每个视点下根据该视点对应的街景图片1与2计算出该视点到目标物底部上某一点的水平角,根据该视点对应的街景图片1与3计算出该视点到目标物的俯仰角。所述目标物底部上某一点选择目标物底部中心或角点;所述水平角、俯仰角是视角的参数,用来表示摄像机拍摄街景图像时摄像头的方位信息。
所述水平角是指拍摄相机的摄像头的罗盘航向。可接受值的范围是0至360°(两个值都表示北方,90°表示东方,180°表示南方)。
所述俯仰角是指拍摄相机的摄像头相对于Street View车辆的向上或向下角度。正值表示摄像头呈向上角度(90°表示垂直向上);而负值表示摄像头呈向下角度(-90°表示垂直向下)。
所述视点到目标物水平角求解过程是:
首先在街景图片1中标出街景图片2的中心点与目标物底部上某一点在街景图片1中的像素位置;将街景图片1的中心点X1、街景图片2的中心点X2及目标物底部T投影到视点O所在水平面上。过视点O沿水平角为0的方向作直线OO1,过点X2作OO1的垂线,垂足为O’,其中,O’X2与OX1、OT交点分别为X1’、T’;
计算目标物在该视点的水平角即计算∠O’OT,设为ht,街景图片1、2中心的水平角已知,即∠O’OX1,∠O’OX2,以h1,h2表示。
由(公式2)-(公式1),(公式3)-(公式1)分别得(公式4),(公式5):
由(公式4)/(公式5)得(公式6):
由(公式6)可得:
实际计算中,∠X1OX2在10°到15°之间,X1X2之间的像素距离,相较于点O与点X1之间的实际距离是相当小的。因此在△OX1X2与△0X1’X2中,近似的相当于
其中由图像中各点的像素位置可得,因此可求出目标物底部在该视点下的水平角:
ht=Arctan ht
所述视点到目标物俯仰角求解过程是:
首先在街景图片1中标出街景图片3的中心点与目标物顶部、底部在街景图片1中的像素位置;将街景图片1的中心点Y1、街景图片3的中心点Y3及目标物顶部Tt、目标物底部Tb投影到视点O所在竖直面上。
计算目标物底部与顶部在该视点的水平角即计算∠TtOY1,∠TbOY1,设为pt,pb,已知街景图片1中心点的俯仰角为0°,街景图片3中心点的俯仰角为p3。
其中根据图片像素点的距离可计算出,由此可得到目标物底部、顶部在当前视点下的俯仰角。
所述步骤5中,根据两视点及视点到目标物底部的水平角,在极坐标系下构建两条空间直线,前方交汇,求出两直线交点,即为目标物的经纬度。
所述步骤6中,目标物底部、顶部与视点的相对高度计算方法具体为:由任一视点经纬度及目标物底部的经纬度求出视点与目标物底部在水平面上的距离;根据该视点到目标物底部与顶部的俯仰角,分别求出目标物底部与顶部距视点的相对高度。为便于调整,优选的,所述视点到目标物底部、顶部上的某一点选择目标物底部或顶部的角点/中心点;目标物底部和顶部所选择的一点连线为一条竖直线。
所述步骤7中,目标物的实际高度具体计算方法为:目标物顶部距视点的相对高度减去目标物底部距视点的相对高度,即得到目标物的实际高度。
本发明的算法可以概括为:在街景地图中,首先选定一个目标物,根据目标物选择两个合适的视点,根据视点的拍摄参数获取视点经纬度;在两视点下分别获取三张不同视角的街景图片,图片1作为基准图,俯仰角为0,图片2与图片1水平角不同,俯仰角相同,图片3与图片1水平角相同,俯仰角不同;在每个视点下根据该视点对应的图片1与图片2计算出该视点到目标物的水平角,根据该视点下图片1与图片3计算出到目标物的俯仰角;根据视点经纬度及视点到目标物底部的视角确定两条空间直线,前方交汇,求出两直线的交点,该交点即为目标物的实际地理空间中的经纬度;由视点经纬度与得到的目标物的经纬度求出视点及目标物在水平面上的距离,再根据视点到目标物顶部与底部的俯仰角求出视点与目标物顶部、底部的相对高度,两相对高度差即为目标物的实际高度。
本发明有效的利用了现有的街景资源,基于街景图片实现了街景地图中地物的地理位置的直接获取以及地物的实际高度的量测,有利于现有街景资源在智慧城市、智能交通等方面的进一步应用。
附图说明
图1是本发明实施例1的流程图;
图2a是本发明实施例1水平角求解过程视点、街景图片中心点及目标物位置示意图;
图2b是本发明实施例1水平角求解过程视点、街景图片中心点及目标物位置投影到视点所在水平面结果图;
图3a是本发明实施例1俯仰角求解过程视点、街景图片中心点及目标物位置示意图;
图3b是本发明实施例1俯仰角求解过程视点、街景图片中心点及目标物位置投影到视点所在竖直面结果图;
图4是本发明实施例1目标物地理位置求解示意图;
图5是本发明实施例1目标物实际高度求解示意图。
具体实施方式
下面结合附图和实施例作进一步详细说明。
实施例1
本实施例以Google公司的街景地图为例,对本发明的技术方案作进一步描述。如图1所示,本发明的流程包括如下步骤:
步骤1:在街景地图中,选定两个视角范围内包含待测算的目标物的视点;
步骤2:获取所选两个视点的经纬度;
步骤3:在两视点下分别获取三张不同视角的街景图片,分别为街景图片1、街景图片2和街景图片3,其中街景图片1为基准图片,街景图片2与街景图片1水平角不同,俯仰角相同,街景图片3与街景图片1水平角相同,俯仰角不同;
步骤4:计算出两视点到目标物底部上某一点的视角,包括水平角与俯仰角;所述目标物底部上某一点选择目标物底部中心或角点;
步骤5:根据步骤4中的两视点及目标物底部上某一点构建两条空间直线,前方交汇求出交点的经纬度,即目标物的实际地理位置;
步骤6:计算所选两个视点中任一视点到目标物的距离,结合该视点到目标物底部、顶部上某一点的俯仰角求出目标物底部、顶部与视点的相对高度;所述视点到目标物底部、顶部上的某一点选择目标物底部或顶部的角点/中心点;目标物底部和顶部所选择的一点连线为一条竖直线;
步骤7:由目标物底部、顶部与视点的相对高度得到目标物的实际高度。
具体实施步骤如下:
步骤1首先选择一个特定的目标物,选择Google街景地图中两个不同的合适的视点;
所述视点是指,拍摄该街景图像时相机所在地理位置,以经纬度表示。不同视点是指拍摄街景图片时相机的地理位置不同。合适的视点是指,相机在该位置所拍摄的街景影像,经过旋转调整,可以清晰地看到目标物整体,无障碍物遮挡。
步骤2根据Google街景地图相关服务分别获取两个街景视点的经纬度;街景地图的拍摄参数中即包含视点的经纬度信息,其他街景地图可采用相应方式获取视点的经纬度信息。
视点的经纬度根据Google Street ViewAPI可以获得,具体代码如下:
//获取视点的经纬度
var lat=panorama.getPosition().lat();
var lng=panorama.getPosition().lng();
其中,lat为视点的纬度,lng为视点的经度;
步骤3根据步骤2获取得视点经纬度,基于Google Street View Image API,在两视点下分别获取三张不同视角的街景图片,街景图片1作为基准图,俯仰角为0,街景图片2与1水平角不同,俯仰角相同,街景图片3与1水平角相同,俯仰角不同;
所述视角的选择是指通过旋转调整街景影像,使目标物位于屏幕合适的位置,放大或缩小影像,使得目标物不至于太小而看不清,也不至于过大而超出屏幕范围。
所述水平角、俯仰角是视角的参数,用来表示摄像机拍摄街景图像时摄像头的方位信息。
所述水平角是指拍摄相机的摄像头的罗盘航向。可接受值的范围是0至360°(两个值都表示北方,90°表示东方,180°表示南方)。
所述俯仰角是指拍摄相机的摄像头相对于Street View车辆的向上或向下角度。正值表示摄像头呈向上角度(90°表示垂直向上);而负值表示摄像头呈向下角度(-90°表示垂直向下)。
本实施例中,所述街景图片的获取请求是一个HTTPURL,其格式如下:
https://maps.googleapis.com/maps/api/streetview?parameters
对于其他街景地图可采用相应方式获取对应的街景图片;
本实施例中,获取的街景图片参数具体包括:location(可以是文本字符串(如Chagrin Falls,OH),或纬度/经度值(40.457375,-80.009353),size(以像素表示图像的输出尺寸),heading(水平角,表示摄像头的罗盘航向),pitch(俯仰角,指定摄像头相对于Street View车辆的向上或向下角度);
步骤4在每个视点下根据该视点对应的街景图片1与2计算出该视点到目标物的水平角,根据该视点下街景图片1与3计算出到目标物的俯仰角;
如图2a、图2b所示,所述视点到目标物水平角求解过程是:
首先在街景图片1中标出街景图片2的中心点与目标物底部在街景图片1中的像素位置;将街景图片1的中心点X1、街景图片2的中心点X2及目标物底部T投影到视点O所在水平面上。过视点O沿水平角为0的方向作直线OO1,过点X2作OO1的垂线,垂足为O’,其中,O’X2与OX1、OT交点分别为X1’、T’;
计算目标物在该视点的水平角即计算∠O’OT,设为ht,街景图片1、2中心的水平角已知,即∠O’OX1,∠O’OX2,以h1,h2表示。
由(公式2)-(公式1),(公式3)-(公式1)分别的(公式4),(公式5):
由(公式4)/(公式5)得(公式6):
由(公式6)可得:
实际计算中,∠X1OX2在10°到15°之间,X1X2之间的像素距离,相较于点O与点X1之间的实际距离是相当小的。因此在△OX1X2与△0X1’X2中,近似的相等于
其中由图像中各点的像素位置可得,因此可求出目标物底部在该视点下的水平角:
ht=Arctan ht
如图3a,图3b所示,所述视点到目标物俯仰角求解过程是:
首先在街景图片1中标出街景图片3的中心点与目标物顶部、底部在街景图片1中的像素位置;将街景图片1的中心点Y1、街景图片3的中心点Y3及目标顶部Tt、物底部Tb投影到视点O所在竖直面上。
计算目标物底部与顶部在该视点的水平角即计算∠TtOY1,∠TbOY1,设为pt,pb,已知街景图片1中心点的俯仰角为0°,街景图片3中心点的俯仰角为p3。
其中根据图片像素点的距离可计算出,由此可得到目标物底部、顶部在当前视点下的俯仰角。
步骤5:已知视点的经纬度及视点到目标物底部的水平角,根据极坐标系,可以确定出一条空间直线。如图4所示,两个不同的视点则构建出两条不同的空间直线,前方交汇,确定目标物实际地理位置。具体代码如下:
//k1,k2分别为两条空间直线的斜率
vark1=1/Math.Tan(rad(angleT1));
var k2=1/Math.Tan(rad(angleT2));
//b1,b2分别为两条空间直线的截距
var b1=lat1-k1*lng1;
var b2=lat2-k2*lng2;
//目标经纬度
var tlng=(b2-b1)/(k1-k2);
var tlat=tlng*k1+b1;
其中tlng为目标点经度,tlat为目标点纬度;
步骤6:如图3所示,由视点经纬度及目标物底部的经纬度求出视点与目标物底部在水平面上的距离。根据视点到目标物底部与顶部的俯仰角,分别求出目标物底部与顶部距视点的相对高度,如图5所示。具体代码如下:
其中,z1为目标物底部距视点的相对高度,z2为目标物顶部距视点的相对高度;
步骤7:目标物顶部距视点的相对高度减去目标物底部距视点的相对高度得到目标物的实际高度。具体代码如下:
//目标物顶部与视点的相对高度减去目标物底部与视点的相对高度,得出目标物的实际高度
var height=z2-z1;
计算所得height即为目标物的实际高度。