《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于嵌入式Linux的双目测距系统研究
基于嵌入式Linux的双目测距系统研究
2015年微型机与应用第5期
谢永超,王进华
(福州大学 电气工程与自动化学院,福建 福州 350108)
摘要: 根据嵌入式系统的特点,设计了以ARM为核心的双目立体视觉测距系统。系统使用双目立体摄像头采集图像数据,可设置图像的多种属性。利用开源计算机视觉库OpenCV对采集的图像数据进行处理,分别完成了两台摄像机标定、匹配、重建等工作,最后实现摄像机测距功能。实验结果表明,该系统测量结果合理,工作稳定,同时可用Qt/Embedded实时显示图像和数据,具有良好的人机交互功能和跨平台移植性。
Abstract:
Key words :

  摘  要: 根据嵌入式系统的特点,设计了以ARM为核心的双目立体视觉测距系统。系统使用双目立体摄像头采集图像数据,可设置图像的多种属性。利用开源计算机视觉库OpenCV对采集的图像数据进行处理,分别完成了两台摄像机标定、匹配、重建等工作,最后实现摄像机测距功能。实验结果表明,该系统测量结果合理,工作稳定,同时可用Qt/Embedded实时显示图像和数据,具有良好的人机交互功能和跨平台移植性。

  关键词: 嵌入式;计算机视觉库;立体视觉;双目测距

0 引言

  双目立体视觉测距是计算机视觉技术中的一个分支,也是计算机视觉研究的重点和热点之一。它通过双摄像机模拟人眼的功能,对三维世界进行立体感知,恢复物体的三维几何信息。随着机器视觉理论的发展,双目立体视觉在机器视觉研究中发挥了越来越来越重要的作用,具有广泛的适用性[1]。

  嵌入式ARM因处理速度快、使用方便、操作系统开源等特点而广泛应用。目前,双目视觉系统多是基于PC平台实现[2],而在嵌入式系统中,因其屏幕尺寸、处理速度等硬件资源受到限制,测距系统的实现具有新特点。本文以嵌入式处理器作为硬件核心,构建基于嵌入式系统的双目测距系统,并具有图像的实时显示功能。

1 双目测距原理

  1.1 摄像机模型

001.jpg

  摄像机的针孔模型如图1所示,摄像机之外物体X通过穿过针孔平面的针孔,光束在图像平面成像,形成图像x。其中,f为摄像机焦距,Z为摄像机与物体间距离。

  根据相似三角原理可得:

  1.png

  1.2 双目测距模型

002.jpg

  利用针孔模型,可以得到双目测距模型[3]。如图2所示,Ol、Or分别为两摄像机的光心,焦距为f1、f2。光轴经过两个像平面的主点cl、cr。假设两摄像机的像平面精确共面,图像行对准,光轴严格平行,并且具有相同的焦距f(以上这些假设都是需要后面实现的)。物理世界中的P在左右平面上的成像点为pl、pr,对应横坐标xl、xr。

  视差定义为d=xl-xr。根据相似三角形原理,以左摄像机光心为原点,可以得到左摄像机坐标系下的深度Z:

  2.png

2 实验平台

  本系统主要分为硬件和软件两类。硬件是以S3C2440A为核心的ARM嵌入式开发平台。S3C2440A以ARM920T为核心,低功耗,简单,适合于成本和功耗敏感的应用。使用CMOS立体摄像头视频流数据,图片格式JPEG。LCD液晶显示器负责图像数据的显示和人机交互。软件部分由摄像头及屏幕驱动程序、OpenCV图像处理算法、QT主程序设计等组成。

  开放源代码的计算机视觉类OpenCV是由一些C函数和C++类所组成的库,用来实现图像处理和常用的计算机图像算法。具有开发效率高、执行速度快等优点。使用C函数和C++类可进行跨平台移植,因此可以很好地应用于工程实际当中。

  QT是跨平台C++图形用户界面工具。它特有的“信号-插槽”机制是QT编程的基础,当一个特定事件发生的时候,一个信号被发射。因此,执行按钮等事件时,可以方便地执行各个功能,如界面切换、显示和关闭等。本嵌入式系统的功能框图如图3所示,其功能都是利用“信号-插槽”机制实现。

003.jpg

3 系统实现

  3.1图像采集

  获取立体图像是图像处理的基础,图像质量受到光照条件、摄像机性能以及景物特点等因素的影响。因此,获得高质量的立体图像是双目测距前提。

  V4L2(Video 4 Linux 2)是针对免驱USB设备的编程框架,主要用于采集USB摄像头。为了更方便地调节视频设备的属性,本系统并没有使用OpenCV获取图像,而是调用V4L2的接口函数。在Linux系统编程中,一般使用ioct()函数来对设备的I/O通道进行管理[4]。

  针对本嵌入式的特点,使用ioct()函数可以设置图片亮度、对比度、格式、尺寸,如设置320×240或者640×480的分辨率,以适应屏幕大小。

004.jpg

  系统图像采集过程如图4所示。其中,图像处理阶段若是处在获取标定,可以用Opencv中的“角点检测”函数计算角点个数,以判断角点图的好坏。在测距时,可以完成图像的处理。利用V4L2采集图像的主要过程如下:

  (1)fd=open(″dev/video0″,O_RDWR),打开设备文件,即左、右摄像机。

  (2)ioctl(fd,VIDIOC_QUERYSTD,&std),取得设备的功能,查看设备具有什么功能。

  (3)ioctl(fd,VIDIOC_S_FMT,&fmt),设置摄像机视频图片格式。

  (4)ioctl(fd,VIDIOC_REQBUFS,&req),向驱动申请帧缓冲。

  (5)mmap(),申请物理内存,并将申请到的帧缓冲映射到用户空间。

  (6)ioctl(fd,VIDIOC_STREAMON,&type),开始视频的采集。

  (7)ioctl(fd,VIDIOC_DQBUF,&buf),出队列以取得已采集数据的帧缓冲,取得原始采集数据。

  (8)ioctl(fd,VIDIOC_STREAMOFF,&type),停止视频的采集,然后使用munmap()函数删除映射。

  (9)close(fd),关闭视频设备。

  3.2 基于QT的图像显示

  在OpenCV中,图片是IplImage类型,IplImage类型图片的每个像素点是由24位的三通道B、G、R(蓝、绿、红)三种颜色组成。若使用QT库内与图像处理与显示有关的QImage类,QImage类颜色的排列顺序为R、G、B(红、绿、蓝)。为使IplImage类图像能够在QT图像界面中显示,又不降低视频图像质量,需要通过程序将BGR图像转化为RGB图像,即交换R通道与B通道的顺序,可采用cvCvtColor()函数。由于本系统QT的特殊性,图片不能直接显示,可将图像显示在label上。采用如下语句进行转换及显示:

  QLabel label(this);

  cvCvtColor(frame,frame,CV_RGB2BGR);

  QImage image=QImage((const uchar*)frame->imageData,

  frame->width,frame->height,QImage::Format_RGB888);

  label.setPixmap(QPixmap::fromImage(image));

  label.show();

  3.3 摄像机标定

  在双目视觉中,可以通过两幅二维图像对应像素点计算得到三维世界坐标与二维世界坐标的对应关系,以此得到物体的三维坐标值[5]。

  光轴与图像平面的交点与中心的偏移形成两个摄像机的内cx、cy。单个像素点在成像仪上是矩形,形成另外两个x、y方向上的焦距内参fx、fy。这样,可以得到摄像机的内矩阵M,将物理世界的点Q(X,Y,Z)投影到摄像机上q(x,y),利用齐次坐标,可表示为:

  q=MQ(3)

  其中,M=fx  0 cx0 fy cy0 0 1,q=xy1,Q=XYZ

  透镜的球形形状产生径向畸变k1、k2、k3,在成像仪上径向位置按下式进行调节:

  4.png

  透镜与图像不平衡产生切向畸变,用两个参数p1和p2表示:

  5.png

  其中,(x,y)是原来的点,(xcorrected,ycorrected)为修正后的点。

  两摄像机之间的旋转矩阵R和平移向量T构成了摄像机的外参。OpenCV中利用cvStereoCalibrate()函数和多幅棋盘角点图(图5)进行立体标定。

005.jpg

  3.4 立体校正

  在实际应用中,摄像机几乎不可能像图1那样严格地前向平行对准,但可以通过数学方法计算投影图和畸变图,从而将左右摄像机图像校正为前向平行对准[6]。立体校正的目的就是使得两台摄像机准确共面并且相对准,因此需要进行校正。

  立体校正算法有非标定校正(如Hartley算法)等。其可以简单地通过场景中观察点完成校正,然而不可获知图像比例。Bouguet算法为标定立体算法,使用两台摄像机之间的旋转和平移参数进行校正计算。Bouguet立体校正可使得两图像中的每一幅重投影次数都最小化,同时使得观测面积最大化。

  通过OpenCV中cvStereoRectify()立体校正函数,可以得到重投影矩阵Q:

  6.png

  3.5 立体匹配

  图像立体匹配实质上解决了对不同时间或空间位置下获取的同一物体的两幅或多幅图像信息在位置空间或灰度空间上寻找对应匹配像素点的问题。简言之,寻找这些图像中相同物体的对应像素点。

  立体匹配找到两个不同摄像机图像中具有相同特征的点。OpenCV中有BM算法、SGBM算法、GC算法等。其中BM算法测距速度很快,可以达到实时应用的要求,SGBM算法和GC(Graph Cuts)算法的测距速度较慢,而BM算法误差只比SGBM算法稍大,故系统采用BM算法[7]。BM块匹配算法cvFindStereoCorrespondenceBM()函数,使用“绝对误差累计”,查找左右两幅立体校正图像之间的匹配点,匹配代价函数:

  7.png

  其中E表示匹配窗口灰度均值,D为匹配窗口,d为窗口的位移量。代价越小,匹配度越高。通过规定视差的搜索范围构成一个双目视界。

  3.6 三维重建

  利用立体匹配得到的视差d、图像中通过角点检测到的点(x,y)以及由立体校正得到的投影矩阵Q,可得到3D深度:

  8.png

  其中三维坐标就是(X/W,Y/W,Z/W)。Opencv中的函数cvReprojectImageTo3d(),该函数输入视差数据和每个像素坐标,输出所需的三维点阵,这样就可以提取物体的深度信息。

4 实验结果

  OpenCV利用张正友标定法,使用20幅摆放在不同位置的平面黑白棋盘图,对摄像机标定。在应用过程中,摄像机标定误差及系统结构参数对系统测量精度有着不同程度的影响[8],采取优化方法后的摄像机内参数如下。

  左摄像机内参数为:

 912.jpg

  利用上述参数,使用该系统测量多个目标物体的距离,将测量值与实际值进行比较,得到表1所示结果。

  实验表明,摄像机间的距离约36.5 mm时,在300~2 500 mm的实验范围内,系统能够识别匹配物体的图像,得出物体的距离的测量误差在10%以内。系统测距较为准确。但随着距离的增加,导致匹配效果较差,误差有逐渐扩大的趋势。物体距离为2 500 mm时,测量距离误差已超过100 mm。因此,本系统暂不适合远距离测距。为提高测距精度,可从以下几个方面入手:增加标定图像数目,增加基线长度,调整相应参数,变换图像处理方法,增大焦距等。如何更有效地减少测量误差,扩大测距范围,需要以后不断研究和改进。

参考文献

  [1] 赵鹏.机器视觉理论及应用[M].北京:电子工业出版社,2011.

  [2] 王杰,孟浩,张洁.基于嵌入式Linux的双目测距系统研究[J].世界科技研究与发展,2014,36(3):263-267.

  [3] BRADSKI G, KAEHLER A. 学习OpenCV[M]. 于仕琪,刘瑞祯,译. 北京:清华大学出版社,2009.

  [4] 白长清,陈沛.嵌入式终端基于Linux V4L2的图像采集系统[J].科技资讯,2012(2):22-23.

  [5] 陈胜勇,刘盛.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.

  [6] 任继昌,杨晓东.基于角点检测的双目视觉测距新方法[J].电光与控制,2013,20(7):93-95.

  [7] 王浩,许志闻,谢坤,等.基于OpenCV的双目测距系统[J].吉林大学学报(自然科学版),2014,32(2):188-193.

  [8] 肖志涛,张文寅,耿磊.双目视觉系统测量精度分析[J].光电工程,2014,41(2):6-11.


此内容为AET网站原创,未经授权禁止转载。