基于OPENGL的全景监控方法及系统技术领域
本发明涉及图像处理技术领域,尤其涉及基于OPENGL的全景监控方法及系统。
背景技术
目前的全景环视技术一般都是利用二维重投影技术,该类技术将摄像头获取的图
像向二维平面投射,通过多分屏实现不同视角下的平面投影影像,无法按照用户需求,从全
景图平滑的过渡某个视角下的细节图像,用户体验一般。传统的分屏投影技术中,用户与设
备的交互比较少,用户操作不灵活。
发明内容
本发明提供了一种基于OPENGL的全景监控方法,包括如下步骤:
鱼眼摄像头内部参数的获取步骤:用鱼眼摄像头对标定板拍照若干张,然后用
matlab工具箱进行标定,从而获取鱼眼摄像头的内部参数;
OPENGL处理步骤:通过OPENGL编程来实现将图像像素点按照投影函数映射到球
面;
交互式实时漫游步骤:通过调节视角大小和观察点的位置来操作透视变换矩阵,
从而实现交互式实时漫游。
作为本发明的进一步改进,在鱼眼摄像头内部参数的获取步骤中,标定完成后,所
有的计算参数存储在matlab鱼眼摄像头模型对象中,包括仿射变换矩阵、径向畸变多项式
系数、图像坐标系下的畸变中心位置坐标,至此matlab标定部分已经结束,标定得到的鱼眼
摄像头内部参数与图像分辨率作为输入参数被OPENGL球面映射过程所调用。
作为本发明的进一步改进,所述OPENGL处理步骤和交互式实时漫游步骤包括:
第一步:计算出图8所示的图像采样点对应的摄像机坐标系下的三维入射向量为
[X Y Z]T并对此三维入射向量进行归一化,以使该三维向量对应的三维点分布在单位化的
球面上;
第二步:对纹理图像进行归一化操作,将采样点的图像像素坐标转化为归一化的
纹理坐标值,用[X_texture,Y_texture]T来表示;
第三步:绑定纹理坐标,确立第二步的2D图像纹理坐标[X_texture,Y_texture]T
与第一步的单位球面点坐标[X_sphere Y_sphere Z_sphere]T的映射关系,通过
glTexCoord2f和glVertex3f实现;
第四步,设置纹理映射属性,调用glTexImage2D函数,用来指定二维纹理图像,包
括纹理图像的宽度和高度、像素数据的格式、像素数据的数据类型等,调用函数
glTexParameteri对插值方式进行设置,其中双线性插值效果优于最近邻插值;
第五步,对超出图像纹理坐标的顶点进行控制,对超出[0,1]范围的纹理坐标进行
控制,将其置成黑色,以免产生图像的重叠;
第六步,切换观察视角,在鼠标事件处理函数中捕获鼠标拖动时产生的二维位移
量,将其按照一定规则转化为围绕x轴、y轴、z轴的旋转角度,并通过glRotatef函数分别控
制绕x轴,y轴,z轴的旋转量,从而产生旋转矩阵;在滚轮事件处理函数中捕获滚轮的旋转角
度,并将滚轮旋转角做线性或非线性处理后传入glPerspective函数控制不同视角下的透
视投影,产生缩放效果;
第七步,全景与小视角切换,当视场角比较小时,观察点放置在球心。当滑动滚轮
控制的视场角大于一定值后,增量部分通过线性或非线性的方式控制远离球心的距离,通
过glTranslate函数实现,由此可以实现大视场范围下图像合理显示和小视场角度下图像
无畸变,以及转换过程平滑过渡的效果;
第八步,更新纹理数据,将解码出来的图像帧数据更新纹理图像数据。
作为本发明的进一步改进,在所述第三步中,首先调用glGenTextures函数创建纹
理对象,然后调用glBindTexture函数将glGenTextures函数生成的纹理的名字绑定到对应
的目标纹理上。
作为本发明的进一步改进,在第五步中,调用函数glTexParameterfv和
glTexParameteriv实现纹理越界控制,将越界区域设置为黑色。
本发明还提供了一种基于OPENGL的全景监控系统,包括:
鱼眼摄像头内部参数的获取模块:用鱼眼摄像头对标定板拍照若干张,然后用
matlab工具箱进行标定,从而获取鱼眼摄像头的内部参数;
OPENGL处理模块:通过OPENGL编程来实现将图像像素点按照投影函数映射到球
面;
交互式实时漫游步骤:通过调节视角大小和观察点的位置来操作透视变换矩阵,
从而实现交互式实时漫游。
作为本发明的进一步改进,在鱼眼摄像头内部参数的获取模块中,标定完成后,所
有的计算参数存储在matlab鱼眼摄像头模型对象中,包括仿射变换矩阵、径向畸变多项式
系数、图像坐标系下的畸变中心位置坐标,至此matlab标定部分已经结束,标定得到的鱼眼
摄像头内部参数与图像分辨率作为输入参数被OPENGL球面映射过程所调用。
作为本发明的进一步改进,所述OPENGL处理模块和交互式实时漫游模块包括:
第一模块:计算出图8所示的图像采样点对应的摄像机坐标系下的三维入射向量
为[X Y Z]T并对此三维入射向量进行归一化,以使该三维向量对应的三维点分布在单位化
的球面上;
第二模块:对纹理图像进行归一化操作,将采样点的图像像素坐标转化为归一化
的纹理坐标值,用[X_texture,Y_texture]T来表示;
第三模块:绑定纹理坐标,确立第二步的2D图像纹理坐标[X_texture,Y_texture
]T与第一步的单位球面点坐标[X_sphere Y_sphere Z_sphere]T的映射关系,通过
glTexCoord2f和glVertex3f实现;
第四模块,设置纹理映射属性,调用glTexImage2D函数,用来指定二维纹理图像,
包括纹理图像的宽度和高度、像素数据的格式、像素数据的数据类型等,调用函数
glTexParameteri对插值方式进行设置,其中双线性插值效果优于最近邻插值;
第五模块,对超出图像纹理坐标的顶点进行控制,对超出[0,1]范围的纹理坐标进
行控制,将其置成黑色,以免产生图像的重叠;
第六模块,切换观察视角,在鼠标事件处理函数中捕获鼠标拖动时产生的二维位
移量,将其按照一定规则转化为围绕x轴、y轴、z轴的旋转角度,并通过glRotatef函数分别
控制绕x轴,y轴,z轴的旋转量,从而产生旋转矩阵;在滚轮事件处理函数中捕获滚轮的旋转
角度,并将滚轮旋转角做线性或非线性处理后传入glPerspective函数控制不同视角下的
透视投影,产生缩放效果;
第七模块,全景与小视角切换,当视场角比较小时,观察点放置在球心。当滑动滚
轮控制的视场角大于一定值后,增量部分通过线性或非线性的方式控制远离球心的距离,
通过glTranslate函数实现,由此可以实现大视场范围下图像合理显示和小视场角度下图
像无畸变,以及转换过程平滑过渡的效果;
第八模块,更新纹理数据,将解码出来的图像帧数据更新纹理图像数据。
作为本发明的进一步改进,在所述第三模块中,首先调用glGenTextures函数创建
纹理对象,然后调用glBindTexture函数将glGenTextures函数生成的纹理的名字绑定到对
应的目标纹理上。
作为本发明的进一步改进,在第五模块中,调用函数glTexParameterfv和
glTexParameteriv实现纹理越界控制,将越界区域设置为黑色。
本发明的有益效果是:本发明的全景监控具有灵活的人机交互方式,可以产生逼
真的漫游效果,实现了实时全景监控功能,本发明可以应用于悬顶式和侧视安装的全景监
控系统,具有很强的实用性和使用价值。
附图说明
图1是标定板图像;
图2是拍摄图片样例图;
图3是标定工具箱GUI图;
图4是鱼眼摄像头和成像平面的相对关系图;
图5是图像坐标系图;
图6是描述投影规则的非线性函数f图;
图7是小视角漫游透视校正示意图;
图8是采样点的选取规则图;
图9是OPENGL通过三角形构建的3D球背面图;
图10是OPENGL通过三角形构建的3D球侧面图;
图11是180度鱼眼摄像头采集到的原始图像;
图12是2D图像映射到3D球面上的侧面观察效果图;
图13是2D图像映射到3D球面上的背面观察效果图;
图14是小视角不同方位的非畸变图像效果图;
图15是小视角不同方位的非畸变图像效果图;
图16是未优化前大视场条件下球心位置观察到的效果图;
图17是大视角条件下视点后移图;
图18是视点后移得到的大视角效果图。
具体实施方式
本发明是将180的广角鱼眼镜头拍摄的图片利用OPENGL强大的3D建模能力,实现
3D的全景图片,并且能对生成的3D图片通过调节视角的大小和观察点的位置实现交互式漫
游。这种方法可以应用到球面映射的全景监控系统中,也可以应用于柱面映射全景监控当
中,具有很高的实际应用价值。
一.鱼眼摄像头内部参数的获取
获鱼眼镜头的参数,采用matlab工具箱进行图片的标定。第一步是准备标定板如
图1所示,标定板为黑白相间的棋盘格。每个格子都为方形的,将棋盘格打印出来,贴在平面
上(如平整的桌面,平面硬木板等),但是要确保在同一个平面上。图1是我们所用的鱼眼镜
头标定板图样。
用鱼眼摄像头对二维标定板拍照,大约拍摄20~30张即可。拍摄图像是为了后面
用matlab标定箱处理,得到摄像头内部参数。由于后面数据处理的时需要提取拍摄图像的
角点(也就是黑白棋盘格的交点)坐标值,拍摄图像尽量采用无压缩格式,例如bmp格式。图2
为用180度鱼眼摄像头拍摄的标定板图像中的其中一张:
标定所需的标定板图像拍摄完成后,下一步用matlab工具箱进行标定,工具箱的
图形交互界面如图3:
此工具箱需要输入标定的黑白棋盘格的以下参数来完成自动的角点提取和内外
参数的计算。
(1)X方向的方格数;
(2)Y方向的方格数;
(3)输入标定后投影函数多项式的阶数(一般情况4阶的效果比较好)
依次对标定箱的GUI所示的步骤进行操作。Calibration步骤是粗略标定,得到连
个最为重要数据,平均误差(以像素为单位)和误差平方和。
Calibration进行粗略标定后的参数达不到精度的要求,但可以做为精确标定的
初始值。非线性优化,是运用前面粗标定的数据作为初始值,利用非线性最小二乘法解矩阵
方程,并迭代多次直到误差收敛或者循环次数达到预设值后停止。最终得到OPENGL编程时
所需要用到的鱼眼镜头的内参数。
标定完成后,所有的计算参数存储在matlab鱼眼相机模型对象中。包括仿射变换
矩阵、径向畸变多项式系数、图像坐标系下的畸变中心位置坐标。至此matlab标定部分已经
结束标定得到的鱼眼相机内参与图像分辨率作为输入参数被OPENGL球面映射过程所调用。
二.鱼眼模型及其参数的含义
简述一下标定鱼眼镜头的过程的原理。设世界坐标系下三维物体的场景坐标为X,
这里统一采用齐次坐标的形式。应用齐次坐标有利于后面对于图像的平移和旋转进行操
作。理想的传感器平面与光轴严格正交,入射光线在该平面投影后像素坐标为ρ=[u,v]T.
那么鱼眼镜头的成像的数学模型可以描述为:
其中,λ是比例系数,P是世界坐标系到摄像机坐标系的变换矩阵,P包含旋转矩阵R
和平移矩阵T,
f(ρ)描述了鱼眼镜头的曲面多项式模型:
f(ρ)=a0+a1ρ+a2ρ2+a3ρ3+a4ρ4;(2)
其中a1=0,a0,a2,a3,a4是鱼眼镜头的内参。真实的图像坐标系坐标(像素为单位)
和理想传感器平面坐标系下的坐标是通过仿射变换矩阵联系在一起的。用如下矩阵关系表
示:
上式中是理想坐标,是真实坐标即图像坐标系下坐标。
是仿射变换矩阵,c,d,e是标定所要求取的内参,(xc,yc)是图像的中心坐标。也是
鱼眼镜头的内参。
其中ρ对应鱼眼镜头像素点到成像中心的距离:
ρ是关于θ的一个多项式。称为畸变多项式,ρ关于θ的多项式表示为:
ρ=b0+b1θ+b2θ2+b3θ3+…+bnθn;(4)
其中θ是入射光线与相机坐标系Z轴正方向的夹角;多项式系数称为畸变系数。
基于泰勒多项式展开的鱼眼相机模型适用于各种镜头的相机,无论是折射、折反
射、组合的相机,都可以得到很好地拟合。
鱼眼镜头的折射材料一般包括前组和后组玻片,前组玻片对入射光线起到发散作
用,后组玻片调整光线的色差。目前的鱼眼摄像头基本都满足或近似满足单有效视点特性。
所谓单有效视点(the single effective viewpoint)指的是所有进入镜头并在感光芯片
上成像的入射光线,都交汇于同一三维空间点,该点称为透视中心,即图4中的O点。并且假
定镜头都满足旋转对称性,即所有与主光轴成相同入射角的光线,在感光面上的投射点距
离畸变中心(图4中的c点)具有相同的距离。
标定完成后,得到畸变中心在图像坐标系下的坐标(xc,yc),对每一个像素
由(3)式就可以求出理想摄像机坐标系下坐标再根据(1)式,求出摄
像机坐标系下对应的入射向量为f为泰勒多项式拟合的描述了鱼
眼镜头的径向畸变的非线性函数,其系数在标定后可以得到。
三.OPENGL开发的过程及原理
OpenGL是图形硬件的一种软件接口。OpenGL全称OpenGraphicsLibrary,是一个优
秀的专业化的3D的API(ApplicationProgrammingInterface)。
作为与DirectX类似的三维图形软件包,具有跨平台独立于操作系统和底层硬件
的优秀特性。OPENGL的顶点着色器和片元着色器可以将像素数据并行处理,加快图像计算
的效率。通过OPENGL的纹理映射技术,可以将纹理图像映射到设定的平面,逼真的表现图像
的细节。GLSL语言编写的shader程序,可以方便的控制矩阵变换,产生交互式的全景漫游效
果。
我们的整体思路是将图像纹理按照投影函数映射到构建的单位球面上,然后通过
调节视角大小和观察点的位置来操作透视变换矩阵,实现交互式实时漫游。
OPENGL的纹理映射是以三角形为单位的。OPENGL会根据设定参数对三角形内的片
元像素进行自动插值计算。当我们将曲面切分成足够多的三角形后,可以近似的代替原有
的曲面形状。
根据前面标定得到的参数,我们得到了图像坐标系下(左上角为坐标原点)以像素
为单位的畸变中心O1(xc,yc)。我们以畸变中心O1为原点,对原图像中进行顶点分割,采样
按照蜘蛛网式进行,如图8所示。蛛网状纹理图像最内层即里畸变中心最近的一层已经切分
为三角形,除此之外的外层为梯形,连接梯形其中一条对角线可以将梯形切分为两个三角
形。蛛网状纹理切分的径向和旋转增量根据实际情况进行调节切分顶点的数目可以根据实
际情况而定,细分程度越高,形成的纹理映射越逼真,但是计算量也越大。
蛛网状纹理切分的规则确定后,整个球面纹理映射和全景漫游的步骤如下:
第一步,根据以上标定鱼眼摄像头参数结合(1)(2)(3)式计算出图8所示的图像采
样点对应的摄像机坐标系下的三维入射向量为[X Y Z]T并对此三维入射向量进行归一化,
以使该三维向量对应的三维点分布在单位化的球面上。归一化的入射向量(即单位球面点)
坐标为[X_sphere Y_sphere Z_sphere]T。
第二步,对纹理图像进行归一化操作。OPENGL中图像纹理的横坐标和纵坐标在区
间[0,1]之间,并且纹理坐标的坐标原点在左下角,因此需要将采样点的图像像素坐标转化
为归一化的纹理坐标值,用[X_texture,Y_texture]T来表示。
第三步,绑定纹理坐标。确立第二步的2D图像纹理坐标[X_texture,Y_texture]T
与第一步的单位球面点坐标[X_sphere Y_sphere Z_sphere]T的映射关系,通过
glTexCoord2f和glVertex3f实现。首先调用glGenTextures函数创建纹理对象,然后调用
glBindTexture函数将glGenTextures函数生成的纹理的名字绑定到对应的目标纹理上。
第四步,设置纹理映射属性。调用glTexImage2D函数,用来指定二维纹理图像,包
括纹理图像的宽度和高度、像素数据的格式、像素数据的数据类型等。调用函数
glTexParameteri对插值方式进行设置,其中双线性插值效果优于最近邻插值。
第五步,对超出图像纹理坐标的顶点进行控制。OPENGL规定纹理坐标范围为[0,
1],且越界纹理坐标默认为重复映射。由于构造的有效纹理坐标区域为圆形,且图像的长和
宽不一致,我们根据实际需要求对超出[0,1]范围的纹理坐标进行控制,将其置成黑色,以
免产生图像的重叠。调用函数glTexParameterfv和glTexParameteriv实现纹理越界控制,
将越界区域设置为黑色。
第六步,切换观察视角:由于我们将2D图像信息依照投影规则映射到3D球面上,根
据光的直线传播,当视点放在球心位置时,小视角条件下,观察到的图像便会去掉畸变效
果,产生真实的透视效果。
在鼠标事件处理函数中捕获鼠标拖动时产生的二维位移量,将其按照一定规则转
化围绕x轴、y轴、z轴的旋转角度。并通过glRotatef函数分别控制绕x轴,y轴,z轴的旋转量,
从而产生旋转矩阵,实现鼠标控制下,以单位球的球心为观察点,交互式的切换视角产生的
透视图像。在滚轮事件处理函数中捕获滚轮的旋转角度,并将滚轮旋转角做线性或非线性
处理后传入glPerspective函数控制不同视角下的透视投影,产生缩放效果。
图9,图10展示的是以三角形构建的3D模型球。
当我们采样点取得足够多之后,由这些三角形构建的球面就可以很精细的描述曲
面贴图的逼真效果。
我们的180度鱼眼摄像头采集到的图像为图11所示,将其按照三角形填充方式进
行球面纹理映射后,得到的球面贴图图像为图12,图13所示,视点放在球心,变换观察方位
角,观察球的内侧面,并变换方位和视场角,得到小视角不同方位的非畸变图像效果图14和
图15。
第七步,全景与小视角切换过程的平滑效果:透视视图可以保持原始图像的直线
属性——场景中的直线经过畸变校正和透视变换后依然保持直线。但在大视场角度下,透
视视图却不利于人眼获取有效信息。大角度透视图像外侧区域插值后产生虚化效果。图16
为大视角条件下,将观察点放在球心位置,观察到效果图。
然而我们在大视角条件下,只需要尽量多的观察到图像捕获的信息,并不追求图
像的严格非畸变。当需要查看某个方位角的具体信息时,再恢复出非畸变的场景信息即可。
考虑到视场范围变化过程中观察图像的平滑性过渡,需要采用一种根据观察视场范围大小
移动视点的策略。
当视场角比较小时,观察点放置在球心。当滑动滚轮控制的视场角大于一定值(例
如50度)后,增量部分通过线性或非线性的方式控制远离球心的距离(垂直于赤道面方向),
通过glTranslate函数实现。由此可以实现大视场范围下图像合理显示和小视场角度下图
像无畸变,以及转换过程平滑过渡的效果。经过视点后移处理后,大视场角度下的效果展示
如图18所示。
第八部,更新纹理数据,得到实时全景。想要得到实时的全景监控的漫游效果,需
要将解码出来的图像帧数据来更新纹理图像数据。由于软解码出来数据多为YUV类型
(YUV420、YUV422等),可以通过将YUV数据分别制作成3个纹理,在片元着色器中按照YUV转
RGB的转换矩阵公式编写GLSL代码,实现并行的转换,提高转换效率。
综上,利用获取到的鱼眼摄像头参数,建立由二维纹理图像到三维球面映射映射,
并通过改变旋转矩阵来控制透视图像;对纹理越界时的情况进行控制,将越界区域设置为
黑色,从而简化了纹理映射的复杂度;通过控制视点的移动,实现从全景到小视角监控画面
的平滑过渡的设计,并结合视角的变换控制透视矩阵,使整个过程过渡自然;由鼠标拖动产
生二维平移量映射到三维旋转矩阵。由滚轮的滑动产生旋转量,控制视角大小,同时控制视
点的移动,产生平滑过渡效果。
本发明保护范围包含但不仅限于使用OPENGL进行球面,柱面纹理映射,矩阵展开
的全景监控技术。
本发明实现了如下功能:通过输入设备,实现人机交互的实时漫游效果。鼠标拖动
改变观察方位,滚轮滑动变换视场角大小,产生缩放效果,与此同时,滚轮的滑动还改变观
察点的在垂直赤道平面且通过球心的直线上的平移,实现了全景图到某个方位角上的无畸
变透视图的平滑自然过渡。该方法的全景监控具有灵活的人机交互方式,可以产生逼真的
漫游效果,实现了实时全景监控功能。本发明可以应用于悬顶式和侧视安装的全景监控系
统,具有很强的实用性和使用价值。
以上内容是结合具体的优选实施方式对本发明所作的进一步详细说明,不能认定
本发明的具体实施只局限于这些说明。对于本发明所属技术领域的普通技术人员来说,在
不脱离本发明构思的前提下,还可以做出若干简单推演或替换,都应当视为属于本发明的
保护范围。