基于嵌入式系统的多摄像头图像采集.ppt
基于嵌入式系统的多摄像头图像采集,答辩人:桂 旻,指导教师:刘忠信,2015年6月2日,-1-,主要内容,-2-,研究背景及意义系统硬件平台介绍单摄像头图像采集多摄像头图像采集与图像处理总结与展望,注释:DDTL-Distribution Diagram Table Look-up,-3-,研究背景及意义,随着机器视觉技术的发展,越来越多的机器人工作时需要采集周围环境的图像信息。对某些机器平台来说,周围环境的全景信息更是其进行定位、移动规划时所需的必要信息。,本课题的目标在于搭建基于嵌入式的多摄像头图像采集系统。与一般通过特殊设备(如鱼眼镜头、折射反射镜)来实现全景图像采集功能的系统不同,本课题通过多个市面上一般的USB摄像头设备采集周围的图像信息,再通过图像拼接算法将这些摄像头采集到的图像数据合成全景图片。,系统硬件平台介绍,-4-,广州天嵌计算机科技有限公司TQ210开发板采用三星Cortex-A8 S5PV210核心板,CPU运行速度最大可达1GHz,32/32KB一级缓存,512KB二级缓存。自带3D图形加速引擎(SGX540),2D图形加速,最大支持81928192分辨率。,(1)ARM开发板选择,TQ210开发板实物图,系统硬件平台介绍,-5-,中心微公司出品的具有150度广角的USB摄像头。该摄像头的型号为XS998,有1200万像素,免驱,感光元件类型为CMOS,最大分辨率为1280720,支持UVC协议,(2)摄像头选择,摄像头实物图,系统硬件平台介绍,-6-,三摄像头相对位置图,本课题的最终目标是实现基于嵌入式的多摄像头全景图像采集系统。由于需要采集周围环境的全景图像信息,所以对摄像头的位置有一定的要求。摄像头摆放的相对位置如右图所示。,(3)硬件平台搭建,单摄像头图像采集,-7-,一、搭建Android开发环境二、相关驱动介绍三、JNI技术四、图像采集程序,搭建Android开发环境,-8-,(1)安装JDK(Java SE Development Kit);(2)安装Eclipse;(3)安装Android SDK(Software Development Kit);(4)安装ADT(Android Development Tools)插件;(5)在Eclipse中设定Android SDK主目录;,相关驱动介绍,-9-,(1)V4L2(Video for Linux two)驱动,/dev/videoXV4L2设备号,字符设备驱动程序核心(cdev),V4L2驱动核心,平台V4L2驱动(Video_device,v4l2_dev),具体的sensor驱动(v4l2_subdev),摄像头硬件设备,用户空间,内核空间,内核空间,硬件,V4L2作用效果图,相关驱动介绍,-10-,(2)UVC(USB Video Class),UVC(USB Video Class)是由微软发起的一种USB视频类标准,主要用于摄像头,扫描仪等图像设备。该协议主要用于提供一种基USB的视频图像设备的一种视频图像传输的标准。UVC驱动的实现源码位于drivers/media/video/uvc/uvc_driver.c中。当系统外接USB图像采集设备如USB摄像头时,系统就会调用该文件,检测USB设备所能实现的功能,将该USB图像采集设备注册成一个V4L2视频设备,并将该video设备文件存放在系统的/dev目录下。,JNI技术,-11-,JNI是Java平台上定义的一套接口标准。它的存在使得Java能和C语言等其它编程语言进行交流,即让Java能调用用C语言编写的代码。具体来看,当Java想调用C语言编写的文件,需先将这个文件生成一个动态链接库,再将这个动态链接库导入到Android程序中。,图像采集程序,-12-,打开摄像头驱动程序,获取驱动功能VIDIOC_QUERYCAP,设置视频格式VIDIOC_S_FMT,为设备驱动申请帧内存VIDIOC_QUERYBUF,映射帧缓存到用户空间mmap(),帧缓冲入队列,交给内核驱动VIDIOC_QBUF,启动视频采集VIDIOC_STREAMON,从缓冲序列中获取一帧视频VIDIOC_DQBUF,帧缓冲入队列,交给内核驱动VIDIOC_QBUF,停止视频采集VIDIOC_STREAMOFF,关闭摄像头驱动程序,继续采集,是,否,一、采集流程,图像采集程序,-13-,二、主要步骤,(1)打开设备文件。(2)查看设备功能,若设备能采集图像,设置输入图像的格式(3)设置设备采集的图像编码格式为YUYV(4)向驱动申请帧缓冲,用来存放采集的图像数据。本系统申请了4个缓冲区。(5)将申请到的内存缓冲区放入图像采集队列。(6)开始数据采集。这里采用内存映射方法,程序直接获取摄像头采集的数据(7)处理数据。内存缓冲区将通过驱动从设备处采集的数据交给应用程序处理,自己清空数据后再被放入图像采集队列等待获取图像。(8)程序将从内存缓冲区得到的YUYV格式数据转化为RGB格式,在显示屏上显示出来。(9)图像采集过程结束,关闭视频设备。,图像采集程序,-14-,三、编写程序,在清楚了Android系统如何通过USB摄像头采集视频图像信息后,本文编写完成一个简单的应用程序来实际实现单USB摄像头的图像采集。该程序只有一个Activity,用来预览USB摄像头采集到的视频图像。同时本文将操作摄像头采集图像数据及对数据进行处理的函数方法都封装到用C语言编写的文件中,再通过Android系统中的JNI技术生成动态链接库将其导入程序中。通过调用这些函数本文编写了一个继承Android系统中的SurfaceView的CameraPreview类,通过此类实现数据采集工作,最终实现了单摄像头图像采集的功能。,三摄像头图像采集及图像处理,-15-,一、三摄像头图像采集二、简单图像拼接三、图像拼接Stitcher类四、两种图像拼接方法的简单比较,三摄像头图像采集,-16-,当将三个USB摄像头与开发板相连时,在系统目录下的dev文件夹中会生成video0,video4,video5三个设备文件(video1、video2、video3是Android4.0系统自带的文件,有特定的功能,不再对应外接的USB设备)。,在第三章里已经编写了一个能实现摄像头预览功能的CameraPreview类。在这个类中,通过一个cameraID和一个cameraBase整形变量来确定访问的设备文件,通过改变这两个变量的值可访问不同的摄像头设备。,通过三个CameraPreview类,如CameraPreview1、CameraPreview2、CameraPreview3,分别访问一个摄像头。同时调用它们三个即可实现三摄像头图像采集。最后将三组采集的数据汇聚到一个程序中,实现全景图像的合成。,简单图像拼接,-17-,算法思想:由于在本系统中采集周围图像信息的三个摄像头的相对位置是固定的。那么同一时间三个摄像头所采集的图像信息的重叠部分是始终不变的。那么可通过一组实例找到图像重叠部分,拼接时就只需将已确定位置的重叠部分消去,再将剩余部分拼接在一起即可得到较为理想的全景图像。,简单图像拼接,-18-,简单拼接效果图,图像拼接Stitcher类,-19-,OpenCV2.4.0以上的版本提供了用于图像拼接的stitcher类,其图像拼接的基本过程如下:(1)图像预处理:对原始图像进行直方图匹配、平滑滤波、增强变换等数字图像处理的基本操作,为图像拼接的下一步作好准备。(2)图像配准:这一步是整个图像拼接流程的核心,配准的精度决定了图像的拼接质量。精确配准的关键是寻找一个能很好描述两幅图像转换关系的数据模型。(3)图像合成:确定了两幅图像之间的转换关系模型,即重叠区域后,就需要根据重叠区域的信息将待拼接图像拼接成一个包含全部图像信息的全景图,图像拼接Stitcher类,-20-,Stitcher类拼接效果图,两种图像拼接方法的简单比较,-21-,总结与展望,-22-,总结:,本课题实现了基于嵌入式的图像采集系统,并能通过两种图像拼接方法获得全景图像,展望:,(1)系统仅仅实现了摄像头的图像采集功能。可尝试扩展如拍照、录影等其它常用功能的实现。(2)系统依赖多个程序实现对多个摄像头的访问。可尝试在一个程序里实现对多个摄像头的操作。(3)能否对视频进行实时的图像拼接,谢谢各位评审老师!,Q&A,-23-,