《点云库PCL学习教程》第4章 输入、输出(IO)课件.pptx
《《点云库PCL学习教程》第4章 输入、输出(IO)课件.pptx》由会员分享,可在线阅读,更多相关《《点云库PCL学习教程》第4章 输入、输出(IO)课件.pptx(83页珍藏版)》请在三一办公上搜索。
1、第4章 输入、输出(IO),1,ppt课件,PCL中所有的处理都是基于点云展开的,利用不同的设备获取点云、存储点云等都是点云处理前后必须做的流程,PCL中有自己设计的内部PCD文件格式,为此,设计读写该格式以及与其他3D文件格式之间进行转化的接口类都是很必要的,目前PCL内部支持对常用的3D格式文件的打开和存储操作,以及与PCD内部格式之间的互相转化。本章首先对PCL中支持的点云获取设备(如kinect)以及OpenNI开源框架作一个基本介绍,其次对PCL中的I/O模块及相关类进行简单说明,最后通过应用实例来展示如何对PCL中I/O模块进行灵活运用。,2,ppt课件,本章各小节目录,4.1 I
2、/O涉及的设备及相关概念简介4.2 PCL中I/O模块及类介绍4.3 应用实例解析,3,ppt课件,4.1 I/O涉及的设备及相关概念简介,4,ppt课件,4.1.1 OpenNI开源框架OpenNI(开放式自然交互)来源于由业界领导的一个非营利性组织,创建于2010年11月,专注于提高和改善自然交互设备与应用软件的互操作能力。其官方网站于12月8号正式公开,主要成员之一是PrimeSense公司(Kinect的核心芯片正是由这家公司提供),其他成员还包括开发ROS的机器人公司Willow Garage,以及游戏公司Side-Kick等。OpenNI是一个多语言、跨平台的框架,它定义了一套用于
3、编写通用自然交互应用的API。OpenNI的主要目的就是形成标准的API,便于下面两个接口之间进行通信:(1)视觉和音频传感器(用来感知周围环境信息)。,5,ppt课件,(2)视觉和音频感知中间件(用来对应用场景中所记录的音频和视觉数据进行分析与理解,例如能够接收一份可见的图像数据并返回从中检测到的手掌位置信息)。OpenNI提供了一组基于传感器设备实现的API和另外一组由中间件组件实现的API,打破了传感器和中间件之间的依赖关系。这样,使用OpenNI API开发应用程序时就不需要在各种中间件模块的上层操作上浪费时间,可以做到一次编写、随处部署。OpenNI的这种分层设计机制允许中间件开发者
4、可以直接基于最原始的数据格式编写算法,而不管这些数据是由何种传感器设备产生,同时也让传感器生产商制造的设备能用于任何OpenNI兼容的应用程序。OpenNI的这套标准化API使得自然交互应用开发人员,6,ppt课件,可以利用由传感器输入并计算过的数据类型,很方便地跟踪处理现实生活中的场景(例如,可以是表示人体全身的数据,也可以是表示手的位置数据,或者仅仅是深度图里面的一组像素等)。这样可以保证编写应用程序的时候,不用考虑传感器或中间件供应商相关的细节。图4-1展示了OpenNI框架的应用概念,分为三层:(1)应用层:基于OpenNI实现的自然交互应用软件。(2)中间件接口层:代表OpenNI本
5、身,提供了传感器和中间件之间的交互接口。(3)硬件设备层:列出了捕捉视觉和音频数据的多种硬件设备。,7,ppt课件,4.1.2 OpenNI兼容设备OpenNI目前已成为PCL集成进来的第一个设备相关的第三方库,用来抓取OpenNI兼容设备中的点云数据。上节描述的OpenNI应用框架说明,只要底层的设备传感器设备与OpenNI兼容,都可以作为点云数据输入源,图4-2则展示了目前流行的OpenNI兼容设备。其中,Primesense Reference Design、Microsoft Kinect和Asus XtionPro这3种摄像头设备均进行了OpenNI兼容性测试。选择其中任何一个设备进
6、行点云数据采集,都可以经OpenNI处理后转化为标准数据供上层应用使用。如今,OpenNI已成为微软xbox360配件kinect在PC上的开源驱动中必须安装的一个API。,8,ppt课件,4.2 PCL中I/O模块及类介绍,PCL中I/O库提供了点云文件输入输出相关的操作类,并封装了OpenNI兼容的设备源数据获取接口,可直接从众多感知设备获取点云图像等数据。I/O模块利用21个类与28个函数实现了对点云的获取、读入、存储等相关操作,其依赖于pcl_common和pcl_octree模块以及OpenNI外部开发包。,9,ppt课件,4.2.1 I/O模块中类以及全局函数说明I/O模块中目前共
7、有21个类,随着RGDB设备的流行必将引入更多的设备相关的I/O扩展,以后有可能增加以下几类。1.class pcl:FileReader类FileReader定义了PCD文件的读取接口,主要用做其他读取类的父类。从它继承的子类必须实现自己的读取函数,即该类中的纯虚函数其继承关系如图4-3所示。但为了保持向后兼容,提供了FILE_V6版本文件读取的实现函数。,10,ppt课件,类FileReader关键成员函数:virtual intreadHeader(const std:string&file_name,sensor_msgs:PointCloud2&cloud,Eigen:Vector4
8、f&origin,Eigen:Quaternionf&orientation,int&file_version,int&data_type,unsigned int&data_idx,const int offset=0)=0纯虚函数,定义读取点云文件头的接口函数,其参数意义:file_name读取文件的文件名。cloud存储读取后的点云数据,但只填充文件头(关于PCD文件格式详见本章后面实例分析)。origin点云获取原点,该参数只有在文件版本大于FILE_V7才存在,否则为NULL。orientation点云获取方向,该参数只有在文件版本大于FILE_V7才存在,否则为NULL。file_
9、version文件版本(FILE_V7或者FILE_V6)。,11,ppt课件,data_type数据类型(二进制置为1,ASCII码置为0)。data_idx数据偏移文件头末尾的偏移量。offset文件头偏移文件开始的偏移量。virtual int read(const std:string&file_name,sensor_msgs:PointCloud2&cloud,Eigen:Vector4f&origin,Eigen:Quaternionf&orientation,int&file_version,const int offset=0)=0为纯虚函数,定义读取文件数据的接口函数,读取
10、文件中的点云数据存储到cloud对象中,其他参数同上函数。int read(const std:string&file_name,sensor_msgs:PointCloud2&cloud,const int offset=0)功能同上函数(仅适用于FILE_V6版本文件获取,因为sensor_msgs:PointCloud2不包含传感器原点和方向数据,若读取高版本数据会产生警告信息)。,12,ppt课件,templateint read(const std:string&file_name,pcl:PointCloud&cloud,const int offset=0)功能同上函数,只是带有
11、模板参数的成员函数。2.class pcl:FileWriter类FileWriter与FileReader对应,是写入PCD文件的类接口定义,可以作为其他写入类的父类。从它继承的子类必须实现自己的写入函数,即该类中的纯虚函数,其继承关系如图4-4所示。,13,ppt课件,类FileWriter关键成员函数:virtual int write(const std:string点云写入到对应文件的纯虚函数接口定义,其参数意义:file_name写入文件的文件名。cloud需要写入的点云对象。origin写入文件头的点云获取原点,默认为(0,0,0,0)。orientation写入文件头的点云获取
12、方向。binary设置写入时的类型(true为二进制,false为ASCII码,默认为ASCII码)。,14,ppt课件,templateintwrite(const std:string&file_name,const pcl:PointCloud&cloud,const bool binary=false)功能同上函数,只是添加了模板参数的模板成员函数。3.class pcl:Grabber类Grabber为PCL1.X对应的设备驱动接口的基类定义,继承关系如图4-5所示。,15,ppt课件,类Grabber关键成员函数:templateboost:signals2:connectionr
13、egisterCallback(const boost:function&callback)提供回调函数指针,当获取每帧图像或点云数据时都会启动回调函数:templatebool providesCallback()const判断是否提供回调函数:virtual void start()=0启动设备,开始传输数据流:virtual void stop()=0停止设备上的数据流传输:virtual std:string getName()const=0,16,ppt课件,返回明确的子类名字:virtual bool isRunning()const=0判断是否在传输数据流:virtual flo
14、at getFramesPerSecond()const=0获取FPS帧率,即每秒多少帧数据。4.class openni_wrapper:OpenNIDevice类OpenNIDevice定义OpenNI设备的基类,继承该基类可以实现不同的OpenNI设备子类,用于获取包括红外数据、RGB数据、深度图像数据等。继承关系如图4-6所示,目前包括如下设备Primesense PSDK,Microsoft Kinect,Asus Xtion Pro/Live。,17,ppt课件,类OpenNIDevice关键成员函数:bool findCompatibleImageMode(const XnMap
15、OutputMode&output_mode,XnMapOutputMode&mode)const throw()查询是否有与output_mode对应的图像模式匹配的输出模式,如果有则返回true并且存储兼容模式在mode中,否返回值为false。例如设备支持30Hz的VGA模式,而请求输出为30Hz的QVGA模式则通过下采样是可以兼容的,但是设备支持25Hz的VGA而请求为30Hz的SXGA就不兼容。bool findCompatibleDepthMode(const XnMapOutputMode&output_mode,XnMapOutputMode&mode)const throw(
16、)功能和参数同上,只是针对深度图像的模式,并非上述彩色图像的模式。bool isImageModeSupported(const XnMapOutputMode&output_mode)const throw(),18,ppt课件,只判断是否支持该output_mode所给定的图像模式,支持返回true,否则返回false。bool isDepthModeSupported(const XnMapOutputMode&output_mode)const throw()只判断是否支持该output_mode所给定的深度图像模式,支持返回true,否则返回false。const XnMapOutp
17、utMode&getDefaultImageMode()const throw()const XnMapOutputMode&getDefaultDepthMode()const throw()const XnMapOutputMode&getDefaultIRMode()const throw()以上三个函数分别是获取默认的RGB、深度、红外图像的输出模式。void setImageOutputMode(const XnMapOutputMode&output_mode),19,ppt课件,void setDepthOutputMode(const XnMapOutputMode&outpu
18、t_mode)void setIROutputMode(const XnMapOutputMode&output_mode)以上三个函数分别是设置RGB、深度、红外图像的输出模式。XnMapOutputMode getImageOutputMode()constXnMapOutputMode getDepthOutputMode()constXnMapOutputMode getIROutputMode()const以上三个函数分别是获取当前的RGB、深度、红外图像的输出模式。void setDepthRegistration(bool on_off)设置深度图像是否与RGB图像对齐。bool
19、 isDepthRegistrationSupported()const throw()判断设备是否支持深度图像与RGB图像对齐void setSynchronization(bool on_off),20,ppt课件,设置设备是否同步输出RGB和深度图像。bool isSynchronized()const throw()判断设备是否同步输出RGB和深度图像,如果是返回true,否则返回false。bool isSynchronizationSupported()const throw()判断设备是否支持同步输出RGB和深度图像。bool isDepthCropped()const返回深度图
20、像是否被裁剪过,是为true,否则为false。void setDepthCropping(unsigned x,unsigned y,unsigned width,unsigned height)打开深度图像的裁剪,x、y分别为两个方向上的起始裁剪位置,width和height分别为保留的x与y方向上的尺寸。float getImageFocalLength(int output_x_resolution=0)const throw(),21,ppt课件,获取RGB图像的焦距长度(像素)。float getDepthFocalLength(int output_x_resolution=0)
21、const throw()获取深度图像的焦距长度(像素)。float getBaseline()const throw()获取基线长度。virtual void startImageStream()virtual void stopImageStream()上面一对函数为启动和停止RGB数据流的采集。virtual void startDepthStream()virtual void stopDepthStream()上面一对函数为启动和停止深度数据流的采集。virtual void startIRStream()virtual void stopIRStream(),22,ppt课件,上面
22、一对函数为启动和停止红外数据流的采集。bool hasImageStream()const throw()bool hasDepthStream()const throw()bool hasIRStream()const throw()以上三个函数分别判断设备是否支持RGB、深度、红外图像数据采集,如果是返回true,否则返回false。virtual bool isImageStreamRunning()const throw()virtual bool isDepthStreamRunning()const throw()virtual bool isIRStreamRunning()co
23、nst throw()以上三个函数分别判断设备是否正在进行RGB、深度、红外图像数据采集。CallbackHandle registerImageCallback(const ImageCallbackFunction&callback,void*cookie=NULL)throw()bool unregisterImageCallback(const CallbackHandle&callbackHandle)throw(),23,ppt课件,上面一对函数分别为RGB图像数据流的回调函数注册与注销。CallbackHandle registerDepthCallback(const Dept
24、hImageCallbackFunction&callback,void*cookie=NULL)throw()bool unregisterDepthCallback(const CallbackHandle&callbackHandle)throw()上面一对函数分别为深度图像数据流的回调函数注册与注销。CallbackHandle registerIRCallback(const IRImageCallbackFunction&callback,void*cookie=NULL)throw()bool unregisterIRCallback(const CallbackHandle&c
25、allbackHandle)throw()上面一对函数分别为红外图像数据流的回调函数注册与注销。,24,ppt课件,const char*getSerialNumber()const throw()获取设备对应的序列号,注意该返回值有可能为空字符串。const char*getConnectionString()const throw()获取设备连接字符串,一般格式为vendorID/productIDBusID/DeviceID。const char*getVendorName()const throw()const char*getProductName()const throw()uns
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 点云库PCL学习教程 点云库PCL学习教程第4章 输入、输出IO课件 点云库 PCL 学习 教程 输入 输出 IO 课件
链接地址:https://www.31ppt.com/p-2167513.html