基于混合编程的双目视觉三维重建方法
2012-09-15范有情
袁 宁,范有情,何 涛
(1湖北工业大学现代制造质量工程重点实验室,湖北 武汉430068;2湖北工业大学机械工程学院,湖北 武汉430068)
随着计算机视觉技术的发展,对三维重建的开发效率、软件产品质量以及重建速度的要求越来越突出[1].在数值化计算程度高的双目视觉三维重建的应用程序开发中,利用Matlab实现矩阵计算和数值计算较多的相机标定部分以及三维绘图部分,利用VC++实现程序界面、图像采集以及立体匹配等部分.而Matlab语言和C语言相比较,它具有语言简单、内涵丰富、易学易用等优点,尤其是它提供了丰富的绘图函数和命令,可方便地绘制一维、二维和三维图形,如线性图、极坐标图、直方图、等高线图、落差图等[2].针对传统的利用单一环境实现三维重建的软件开发效率和重建速度受局限等问题,本文提出了一种基于VC++与Matlab混合编程的双目视觉三维重建方法.
1 VC++利用Matlab engine实现与matlab的混合编程技巧
Matlab可以通过引擎的方式与其他编程环境下的程序实现通信,将Matlab作为一个计算引擎使用,让其在后台运行,完成复杂的矩阵计算,简化前台用户程序设计的任务.与其他各种接口相比,引擎所提供的Matlab功能支持是最全面的.通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何Matlab所支持的计算和绘图等操作.在数据交流方面,可以对几乎所有的基本数据类型提供支持.同时以引擎方式打开的Matlab进程以非常友好的界面方式支持Matlab的各种操作[2].
在编程环境中使用Matlab引擎扩展编程的基本操作步骤为:1)对开发环境进行必要的设置;2)创建Matlab引擎对象;3)向引擎空间写入数据;4)调用Matlab命令处理数据;5)从引擎空间读取数据;6)释放Matlab引擎对象.如果在VC集成环境下利用Matlab引擎实现VC和Matlab的混合编程,一般需要对VC++与Matlab混合编程的编译环境进行设置,在完成了若干基本步骤后即可利用Matlab引擎库函数engEvalString来调用Matlab的内建函数[3].
2 系统开发环境及流程
双目视觉的三维重建系统包括两个computar的16mm镜头和2个西安方诚科技的VDC-FD 130M型CCD相机(图1).
图1 双目视觉示意图
该三维重建系统的软件部分是以VC++为基本框架,调用 Matlab engine来实现三维重建的工作.开发环境:Win2000、VC++6.0和 Matlab7.0.该系统采用的具体流程如图2所示.
图2 三维重建基本流程
3 三维重建方法
3.1 相机标定
为了从图像中获取世界坐标系中三维物点与像点的对应关系(图3),计算物体的形状位置等信息,必须建立相机成像的集合模型并获得其参数.在大多数条件下,这些参数必须通过计算与实验才能得到,这种求解参数的过程称为相机标定[5].
图3 相机标定模型
设(Xw,Yw,Zw)是三维世界坐标系中某目标点p的三维坐标,(x,y,z)是该点在相机坐标系(定义如下图所示)中的坐标.相机坐标系定义为:中心在O点(光学中心),Z轴与光轴重合,(X,Y)是中心在Oi点(光轴z与图像平面的交点)且平行于x,y轴的图像坐标系,有效焦距f是图像平面和光心的距离.(xu,yu)是在理想Pin-hole模型下P点的图像坐标,(xd,yd)是由透镜畸变引起的(dxu,dyu)偏离的实际图像坐标[11].
相机标定部分涉及到了大量的矩阵运算,而Matlab具有强大的数学运算功能,并且有专业的相机标定工具箱.
利用Matlab相机标定工具箱对一个基于15张平面西洋跳棋盘图片的全面标定.具体步骤:1)装入标定图片;2)提取图像角点;3)运行主标定程序;4)显示结果;5)控制精度;6)添加或减少图片;7)纠正图片畸变;8)以不同格式输出标定数据.标定板图集如图4所示.
标定的结果被保存在Matlab的二进制文件(mat文件)里以便于数据传递.图5所示为左右两个相机与标定板之间的位置关系.图6所示为相机标定工具箱获得标定结果的误差分析.从图中可以看出每个标定板图像的误差范围,便于添加或减少图片,通过进一步标定获得误差更小的标定结果.
通过Matlab相机标定工具箱可以简便快速地完成相机的标定以及标定结果数据的存储与传递,避免了利用VC++标定的复杂过程,有效提高了相机标定的效率.
3.2 图像预处理
通过CCD工业相机获取图像后,考虑到光照、噪声以及相机性能等条件的影响,需要对获取的图像做进一步处理,以提高图像清晰度,改善视觉效果,将图像转换成更适合人或计算机分析处理的形式[4].该过程包括两个部分:1)图像的滤波、增强及平滑;2)目标物体与背景的分离.在VC++环境中有图像预处理算法集,能够完全满足三维重建中原始图像的预处理要求.因此,图像预处理部分在VC++环境中实现.
3.3 特征点提取和立体匹配
特征点提取是通过 Harris[6]算法实现.Harris特征提取算法的思想是:在图像中设计一个局部检测窗口,当该窗口沿任一方向做微小移动时,检测窗口平均能量的变化.当能量变化值超过了设定阈值时,则将窗口中心像素点设为角点.图像亮度
Harris算法的角点响应函数
式中,det(M)=λ1λ2=AB-C2;trace(M)=λ1+λ2=A+B;k为经验值,取0.04.角点对应于函数R的局部极大值点.当图像上某点像素的R值大于给定的阈值T时,就把该点作为特征点.
立体匹配是三维重建的核心问题.立体匹配是指将在不同视点下拍摄到的同一空间场景的投影图像中的映像点对应起来,并生成相应的视差图的过程[7].对于实际的立体图像对,求解其对应问题极具挑战性,可以说是立体视觉中最困难的一步.Barnard[8]回顾了立体重构的基本原理,对主要的匹配方法做了综述,并且给出了算法新能的评价标准.Dhond[9]总结了大量的立体匹配算法,并介绍了分级处理思想,提出了使用三目约束减少立体匹配的不确定性.Koschan[10]对动态立体和主动立体、早期的遮挡和无纹理问题以及实时立体视觉实现进行了探讨与总结.
本文设计了一种基于置信度传播的立体匹配算法模型,在Harris角点提取算法的基础上实现立体匹配.图7为本文立体匹配流程图.
3.4 三维重构
在VC++的编译环境中编写程序的主界面(图8).在程序主界面中,点击按键可以有效调用Matlab内置函数.基于双目视觉的三维重建中包含相机标定、立体匹配、三维重构等三部分.
三维重构部分在matlab环境中实现,因其有着强大的绘图功能,在前期工作的数据结果基础上,可以快速获得需要的三维图.图8中的“显示三维图”按键调用Matlab engine来绘制三维图.图9a为左相机拍摄轴承图片,图9b为右相机拍摄轴承图片,图9c为三维重建以后获得的轴承三维图.
本文的三维重建是VC++和Matlab混合编程的一个应用,即以VC++环境为程序主框架,并且利用其完成每个界面,同时利用Matlab强大的数学计算和绘图功能,完成整个工作.在实际的数值计算、控制系统开发等工程应用中,可以很好地利用二者混合编程技术,从而简化应用程序的开发.
4 结束语
三维重建技术是计算机视觉、人工智能、虚拟现实、医学图像等前沿领域的热点和难点,也是在基础研究和应用研究中面临的重大挑战之一.本文通过对VC++和Matlab的集成开发,以精练的代码和较高的运行效率实现对二维图像的三维重建.该系统不仅稳定,而且操作简单,提高了自动化的程度.
[1]史利民,郭复胜,高 伟,等.基于语义交互的三维重建[J].计算机辅助设计与图形学学报,2011(5):731-734.
[2]王素立,高 洁,孙新德.MATLAB混合编程与工程应用[M].北京:清华大学出版社,2008.
[3]景征骏,许家民.VC++与 MATLAB混合编程及其应用[J].计算机与信息技术,2006(12):70-71.
[4]冯 宇.基于计算机立体视觉的三维重建系统研究[D].青岛:青岛科技大学图书馆,2009.
[5]赵 娟,曾 强,魏林媛,等.基于立体视觉的三维模型重建系统设计[J].光电系统,2011(2):12-14,30.
[6]Harris C,Stephens M.A Co mbined C0rner and Edge Detector[C]∥Fourth Alvey Vision Conference,1988:147-151.
[7]魏 冲.基于数码相机图像的三维重建技术研究[D].太原:中北大学图书馆,2009.
[8]Barnard S T,Fischler M A.Computational stereo[J].ACM Computing Surverys,1982.
[9]Dhond U R,Aggarwal J K.Structure from stereo-Areview[J].IEEE Trans on Systems,Man and Cybernetics,1989,19(6):1 489-1 510.
[10]Koschan A.What is new in computational stereo since 1989:A survey of current stereo papers[R].Berlin:Technical University of Berlin,1993.
[11]张 楠.双目立体视觉的摄像机标定方法研究[D].武汉:湖北工业大学图书馆,2008.