版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第4章 輸入、輸出(IO)1ppt課件PCL中所有的處理都是基于點云展開的,利用不同的設備獲取點云、存儲點云等都是點云處理前后必須做的流程,PCL中有自己設計的內部PCD文件格式,為此,設計讀寫該格式以及與其他3D文件格式之間進行轉化的接口類都是很必要的,目前PCL內部支持對常用的3D格式文件的打開和存儲操作,以及與PCD內部格式之間的互相轉化。本章首先對PCL中支持的點云獲取設備(如kinect)以及OpenNI開源框架作一個基本介紹,其次對PCL中的I/O模塊及相關類進行簡單說明,最后通過應用實例來展示如何對PCL中I/O模塊進行靈活運用。2ppt課件本章各小節(jié)目錄4.1 I/O涉及的設備
2、及相關概念簡介4.2 PCL中I/O模塊及類介紹4.3 應用實例解析3ppt課件4.1 I/O涉及的設備及相關概念簡介4ppt課件4.1.1 OpenNI開源框架OpenNI(開放式自然交互)來源于由業(yè)界領導的一個非營利性組織,創(chuàng)建于2010年11月,專注于提高和改善自然交互設備與應用軟件的互操作能力。其官方網站于12月8號正式公開,主要成員之一是PrimeSense公司(Kinect的核心芯片正是由這家公司提供),其他成員還包括開發(fā)ROS的機器人公司Willow Garage,以及游戲公司Side-Kick等。OpenNI是一個多語言、跨平臺的框架,它定義了一套用于編寫通用自然交互應用的AP
3、I。OpenNI的主要目的就是形成標準的API,便于下面兩個接口之間進行通信:(1)視覺和音頻傳感器(用來感知周圍環(huán)境信息)。5ppt課件(2)視覺和音頻感知中間件(用來對應用場景中所記錄的音頻和視覺數據進行分析與理解,例如能夠接收一份可見的圖像數據并返回從中檢測到的手掌位置信息)。OpenNI提供了一組基于傳感器設備實現的API和另外一組由中間件組件實現的API,打破了傳感器和中間件之間的依賴關系。這樣,使用OpenNI API開發(fā)應用程序時就不需要在各種中間件模塊的上層操作上浪費時間,可以做到一次編寫、隨處部署。OpenNI的這種分層設計機制允許中間件開發(fā)者可以直接基于最原始的數據格式編寫
4、算法,而不管這些數據是由何種傳感器設備產生,同時也讓傳感器生產商制造的設備能用于任何OpenNI兼容的應用程序。OpenNI的這套標準化API使得自然交互應用開發(fā)人員6ppt課件可以利用由傳感器輸入并計算過的數據類型,很方便地跟蹤處理現實生活中的場景(例如,可以是表示人體全身的數據,也可以是表示手的位置數據,或者僅僅是深度圖里面的一組像素等)。這樣可以保證編寫應用程序的時候,不用考慮傳感器或中間件供應商相關的細節(jié)。圖4-1展示了OpenNI框架的應用概念,分為三層:(1)應用層:基于OpenNI實現的自然交互應用軟件。(2)中間件接口層:代表OpenNI本身,提供了傳感器和中間件之間的交互接口
5、。(3)硬件設備層:列出了捕捉視覺和音頻數據的多種硬件設備。7ppt課件4.1.2 OpenNI兼容設備OpenNI目前已成為PCL集成進來的第一個設備相關的第三方庫,用來抓取OpenNI兼容設備中的點云數據。上節(jié)描述的OpenNI應用框架說明,只要底層的設備傳感器設備與OpenNI兼容,都可以作為點云數據輸入源,圖4-2則展示了目前流行的OpenNI兼容設備。其中,Primesense Reference Design、Microsoft Kinect和Asus XtionPro這3種攝像頭設備均進行了OpenNI兼容性測試。選擇其中任何一個設備進行點云數據采集,都可以經OpenNI處理后轉
6、化為標準數據供上層應用使用。如今,OpenNI已成為微軟xbox360配件kinect在PC上的開源驅動中必須安裝的一個API。8ppt課件4.2 PCL中I/O模塊及類介紹PCL中I/O庫提供了點云文件輸入輸出相關的操作類,并封裝了OpenNI兼容的設備源數據獲取接口,可直接從眾多感知設備獲取點云圖像等數據。I/O模塊利用21個類與28個函數實現了對點云的獲取、讀入、存儲等相關操作,其依賴于pcl_common和pcl_octree模塊以及OpenNI外部開發(fā)包。9ppt課件4.2.1 I/O模塊中類以及全局函數說明I/O模塊中目前共有21個類,隨著RGDB設備的流行必將引入更多的設備相關的
7、I/O擴展,以后有可能增加以下幾類。1. class pcl:FileReader類FileReader定義了PCD文件的讀取接口,主要用做其他讀取類的父類。從它繼承的子類必須實現自己的讀取函數,即該類中的純虛函數其繼承關系如圖4-3所示。但為了保持向后兼容,提供了FILE_V6版本文件讀取的實現函數。10ppt課件類FileReader關鍵成員函數:virtual intreadHeader(const std:string& file_name, sensor_msgs:PointCloud2& cloud, Eigen:Vector4f& origin, Eigen:Quaternion
8、f& 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_version文件版本(FILE_
9、V7或者FILE_V6)。11ppt課件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不包含傳感器原點和方向數據,若讀取高版本數據會產生警告信息)。12ppt課件templateint read(const std:string& file_name, pcl:PointCloud& cloud, const int offset=0)功能同上函數,只是帶有模板參數
11、的成員函數。2. class pcl:FileWriter類FileWriter與FileReader對應,是寫入PCD文件的類接口定義,可以作為其他寫入類的父類。從它繼承的子類必須實現自己的寫入函數,即該類中的純虛函數,其繼承關系如圖4-4所示。13ppt課件類FileWriter關鍵成員函數:virtual int write(const std:string& file_name, const sensor_msgs:PointCloud2& cloud, const Eigen:Vector4f& origin=Eigen:Vector4f:Zero(), const Eigen:Qu
12、aternionf& orientation=Eigen:Quaternionf:Identity(), const bool binary=false)=0;點云寫入到對應文件的純虛函數接口定義,其參數意義:file_name寫入文件的文件名。cloud需要寫入的點云對象。origin寫入文件頭的點云獲取原點,默認為(0, 0, 0, 0)。orientation寫入文件頭的點云獲取方向。binary設置寫入時的類型(true為二進制,false為ASCII碼,默認為ASCII碼)。14ppt課件templateintwrite(const std:string& file_name, co
13、nst pcl:PointCloud& cloud, const bool binary=false)功能同上函數,只是添加了模板參數的模板成員函數。3. class pcl:Grabber類Grabber為PCL1.X對應的設備驅動接口的基類定義,繼承關系如圖4-5所示。15ppt課件類Grabber關鍵成員函數:templateboost:signals2:connectionregisterCallback(const boost:function& callback)提供回調函數指針,當獲取每幀圖像或點云數據時都會啟動回調函數:templatebool providesCallback
14、() const判斷是否提供回調函數:virtual void start()=0啟動設備,開始傳輸數據流:virtual void stop()=0停止設備上的數據流傳輸:virtual std:string getName() const = 016ppt課件返回明確的子類名字:virtual bool isRunning() const = 0判斷是否在傳輸數據流:virtual float getFramesPerSecond() const = 0獲取FPS幀率,即每秒多少幀數據。4. class openni_wrapper:OpenNIDevice類OpenNIDevice定義O
15、penNI設備的基類,繼承該基類可以實現不同的OpenNI設備子類,用于獲取包括紅外數據、RGB數據、深度圖像數據等。繼承關系如圖4-6所示,目前包括如下設備Primesense PSDK,Microsoft Kinect,Asus Xtion Pro/Live。17ppt課件類OpenNIDevice關鍵成員函數:bool findCompatibleImageMode(const XnMapOutputMode& output_mode, XnMapOutputMode& mode)const throw()查詢是否有與output_mode對應的圖像模式匹配的輸出模式,如果有則返回tru
16、e并且存儲兼容模式在mode中,否返回值為false。例如設備支持30Hz的VGA模式,而請求輸出為30Hz的QVGA模式則通過下采樣是可以兼容的,但是設備支持25Hz的VGA而請求為30Hz的SXGA就不兼容。bool findCompatibleDepthMode(const XnMapOutputMode& output_mode, XnMapOutputMode& mode)const throw()功能和參數同上,只是針對深度圖像的模式,并非上述彩色圖像的模式。bool isImageModeSupported(const XnMapOutputMode& output_mode)
17、const throw()18ppt課件只判斷是否支持該output_mode所給定的圖像模式,支持返回true,否則返回false。bool isDepthModeSupported(const XnMapOutputMode& output_mode) const throw()只判斷是否支持該output_mode所給定的深度圖像模式,支持返回true,否則返回false。const XnMapOutputMode& getDefaultImageMode() const throw()const XnMapOutputMode& getDefaultDepthMode() const
18、throw()const XnMapOutputMode& getDefaultIRMode() const throw()以上三個函數分別是獲取默認的RGB、深度、紅外圖像的輸出模式。void setImageOutputMode(const XnMapOutputMode& output_mode)19ppt課件void setDepthOutputMode(const XnMapOutputMode& output_mode)void setIROutputMode(const XnMapOutputMode& output_mode)以上三個函數分別是設置RGB、深度、紅外圖像的輸出模
19、式。XnMapOutputMode getImageOutputMode() constXnMapOutputMode getDepthOutputMode() constXnMapOutputMode getIROutputMode() const以上三個函數分別是獲取當前的RGB、深度、紅外圖像的輸出模式。void setDepthRegistration(bool on_off)設置深度圖像是否與RGB圖像對齊。bool isDepthRegistrationSupported() const throw()判斷設備是否支持深度圖像與RGB圖像對齊void setSynchronizat
20、ion(bool on_off)20ppt課件設置設備是否同步輸出RGB和深度圖像。bool isSynchronized() const throw()判斷設備是否同步輸出RGB和深度圖像,如果是返回true,否則返回false。bool isSynchronizationSupported() const throw()判斷設備是否支持同步輸出RGB和深度圖像。bool isDepthCropped() const返回深度圖像是否被裁剪過,是為true,否則為false。void setDepthCropping(unsigned x, unsigned y, unsigned width
21、, unsigned height)打開深度圖像的裁剪,x、y分別為兩個方向上的起始裁剪位置,width和height分別為保留的x與y方向上的尺寸。float getImageFocalLength(int output_x_resolution=0) const throw()21ppt課件獲取RGB圖像的焦距長度(像素)。float getDepthFocalLength(int output_x_resolution=0) const throw()獲取深度圖像的焦距長度(像素)。float getBaseline() const throw()獲取基線長度。virtual void
22、startImageStream()virtual void stopImageStream()上面一對函數為啟動和停止RGB數據流的采集。virtual void startDepthStream()virtual void stopDepthStream()上面一對函數為啟動和停止深度數據流的采集。virtual void startIRStream()virtual void stopIRStream()22ppt課件上面一對函數為啟動和停止紅外數據流的采集。bool hasImageStream() const throw()bool hasDepthStream() const th
23、row()bool hasIRStream() const throw()以上三個函數分別判斷設備是否支持RGB、深度、紅外圖像數據采集,如果是返回true,否則返回false。virtual bool isImageStreamRunning() const throw()virtual bool isDepthStreamRunning() const throw()virtual bool isIRStreamRunning() const throw()以上三個函數分別判斷設備是否正在進行RGB、深度、紅外圖像數據采集。CallbackHandle registerImageCallb
24、ack(const ImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregisterImageCallback(const CallbackHandle& callbackHandle) throw()23ppt課件上面一對函數分別為RGB圖像數據流的回調函數注冊與注銷。CallbackHandle registerDepthCallback(const DepthImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregister
25、DepthCallback(const CallbackHandle& callbackHandle) throw()上面一對函數分別為深度圖像數據流的回調函數注冊與注銷。CallbackHandle registerIRCallback(const IRImageCallbackFunction& callback, void* cookie=NULL) throw()bool unregisterIRCallback(const CallbackHandle& callbackHandle)throw()上面一對函數分別為紅外圖像數據流的回調函數注冊與注銷。24ppt課件const cha
26、r* getSerialNumber() const throw()獲取設備對應的序列號,注意該返回值有可能為空字符串。const char* getConnectionString() const throw()獲取設備連接字符串,一般格式為vendorID/productIDBusID/DeviceID。const char* getVendorName() const throw()const char* getProductName() const throw()unsigned short getVendorID() const throw()unsigned short getPr
27、oductID() const throw()以上4個函數分別獲取廠商和產品的名字字符串及ID編號。unsigned char getBus() const throw()獲取設備所在的USB總線。25ppt課件unsigned char getAddress() const throw()獲取設備所在USB地址。void setRGBFocalLength(float focal_length)void setDepthFocalLength(float focal_length)以上兩個函數分別設定RGB與深度圖像獲取時的焦距大小。5. class openni_wrapper:Devic
28、eKinect6. class openni_wrapper:DevicePrimesense7. class openni_wrapper:DeviceXtionPro以上3個類分別封裝了Kinect、Primesense、XtionPro相關設備操作和數據獲取操作實現,其詳細接口參考其父類OpenNIDevice的關鍵函數說明。8. Class openni_wrapper:DeviceONI26ppt課件封裝了利用ONI文件回放虛擬類kinect設備的操作和數據獲取操作實現,其詳細接口參考其父類OpenNIDevice的關鍵函數說明。9. Class openni_wrapper:Ope
29、nNIDriver類OpenNIDriver采用單例模式實現對底層驅動的封裝,里面包含一xn:Context對象,提供給所有設備使用。該類提供了枚舉和訪問所有設備的方法實現。類OpenNIDevice關鍵成員函數:unsigned updateDeviceList()枚舉所有系統(tǒng)可以獲取的設備列表,返回獲取設備的數目。unsigned getNumberDevices() const throw()獲取系統(tǒng)可用設備的數目。27ppt課件boost:shared_ptr createVirtualDevice(const std:string& path, bool repeat, bool s
30、tream) const從ONI文件創(chuàng)建一虛擬設備,其中path為ONI文件的路徑,repeat設置是否虛擬設備支持無限循環(huán)從ONI文件獲取數據,stream設置虛擬設備是支持數據流形式的數據獲取還是引發(fā)式的數據獲取。boost:shared_ptr getDeviceByIndex(unsigned index) const返回一設備,index為給定的設備索引。boost:shared_ptr getDeviceBySerialNumber(const std:string& serial_number) const返回一設備,serial_number為給定的設備的序列號。boost:s
31、hared_ptr getDeviceByAddress(unsigned char bus, unsigned char address) const28ppt課件返回一設備,bus為USB設備總線號,address為USB設備地址。const char* getSerialNumber(unsigned index) const throw()獲取索引為index的設備序列號,但該設備未被創(chuàng)建。const char* getConnectionString(unsigned index) const throw()獲取索引為index的設備連接字符串,但該設備未被創(chuàng)建。void stopA
32、ll()停止所有設備。static OpenNIDriver& getInstance()為靜態(tài)成員函數,獲取唯一的設備實例。static void getDeviceType(const std:string&connection_string, unsigned short&vendorId, unsigned short& productId);為靜態(tài)成員函數,獲取設備連接字符串存儲在connection_string,設備廠商及產品ID,存儲在29ppt課件為靜態(tài)成員函數,獲取設備連接字符串存儲在connection_string,設備廠商及產品ID,存儲在vendorId、produ
33、ctId中。10. Class openni_wrapper:OpenNIException類OpenNIException封裝一般的異常處理實現,其關鍵成員函數如下:virtual const char* what() const throw()返回異常消息字符串。const std:string &getFunctionName() const throw()返回發(fā)生異常的函數名。const std:string &getFileName() const throw()返回發(fā)生異常的文件名。unsigned getLineNumber() const throw()返回發(fā)生異常的行號。30
34、ppt課件11. Class openni_wrapper:Image類Image是簡單的圖像數據封裝基類,其繼承關系如圖4-7所示。virtual bool isResizingSupported(unsigned input_width, unsigned input_height, unsigned output_width, unsigned output_height) const = 0純虛函數,具體實現見子類,判斷圖像是否支持尺寸變換,input_width、input_height為設定的寬度和高度,output_width、output_height變換后的寬度和高度。31p
35、pt課件virtual void fillRGB(unsigned width, unsigned height, unsigned char *rgb_buffer, unsigned rgb_line_step=0) const = 0用RGB數據填充用戶給定的rgb_buffer,返回圖像的寬度和高度為width、height,隔rgb_line_step行輸出到輸出緩存中。virtual Encoding getEncoding() const = 0返回原始編碼的方式。void fillRaw(unsigned char *rgb_buffer) const throw()用原始數據
36、填充用戶給定的rgb_buffer。virtual void fillGrayscale(unsigned width, unsigned height, unsigned char* gray_buffer, unsigned gray_line_step=0)const = 0用灰度數據填充給定的gray_buffer,其他參數參考函數32ppt課件fillRGB。unsigned getWidth() const throw()unsigned getHeight() const throw()以上兩個函數分別獲取圖像寬度和高度。unsigned getFrameID() const t
37、hrow()獲取幀的ID號。Unsigned longgetTimeStamp() const throw()獲取圖像的時間戳。const xn:ImageMetaData &getMetaData() const throw()獲取圖像原始OpenNI格式數據。12. Class openni_wrapper:ImageBayerGRBG13. Class openni_wrapper:ImageRGB2433ppt課件14. Class openni_wrapper:ImageYUV422以上3個類分別實現了對原始數據BayerGRBG、RGB24、YUV422到圖像轉化接口,詳細參考其父
38、類關鍵函數說明。15. Class pcl:OpenNIGrabber類OpenNIGrabber實現對OpenNI設備(例如Primesense PSDK,Microsoft Kinect,Asus XTion Pro/Live)數據的采集接口,詳細參考其父類Grabber關鍵函數說明。16. class pcl:PCDReader17. class pcl:PLYReader以上兩個類分別是PCD、PLY文件格式讀入接口的實現,詳細參考其父類pcl:FileReader。18. class pcl:PLYWriter19. Class pcl:PCDWriter以上兩個類分別是PCD、PL
39、Y文件格式寫出接口的實現,34ppt課件詳細參考其父類pcl:FileWriter。20. Class pcl:PCLIOException類PCLIOException是I/O相關的異常處理接口實現,詳細參考其父類PCLException。35ppt課件4.2.2 I/O模塊其他關鍵成員說明PCL_EXPORTS int pcl:io:saveOBJFile(const std:string& file_name, const pcl:TextureMesh& tex_mesh, unsigned precision=5)該函數實現對TextureMesh保存到OBJ文件,file_name
40、為OBJ文件名,tex_mesh為網格模型數據,precision為保存時的精度(默認為5)。PCL_EXPORTS int pcl:io:saveOBJFile(const std:string& file_name, const pcl:PolygonMesh& mesh, unsigned precision=5)功能同上,存儲對象為PolygonMesh。int pcl:io:loadPCDFile(const std:string& file_name, sensor_msgs:PointCloud2& cloud)36ppt課件打開一版本V6.0的PCD文件,file_name為文
41、件名,cloud存儲讀入的點云數據。templateint pcl:io:loadPCDFile(const std:string& file_name, pcl:PointCloud& cloud)打開任何類型的PCD點云文件,file_name為文件名,cloud存儲讀入的點云數據。int pcl:io:savePCDFile(const std:string& file_name, const sensor_msgs:PointCloud2& cloud, constEigen:Vector4f& origin=Eigen:Vector4f:Zero(), const Eigen:Qua
42、ternionf& orientation=Eigen:Quaternionf:Identity(), const bool binary_mode=false)保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據,origin為獲取點云的原點,orientation為獲取點云的方向,binary_mode設置是否保存為二進37ppt課件制格式,默認為false。templateint pcl:io:savePCDFile(const std:string& file_name, const pcl:PointCloud& cloud, bool binary_mode
43、=false)保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據,binary_mode設置是否保存為二進制格式,默認為false。templateint pcl:io:savePCDFileASCII(const std:string& file_name, const pcl:PointCloud& cloud)以ASCII方式保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據。templateint pcl:io:savePCDFileBinary(const std:string& file_name, const38ppt課件pcl
44、:PointCloud& cloud)以二進制方式保存點云到PCD文件,file_name文件名,cloud需要保存的點云數據。void pcl:throwPCLIOException(const char function_name, const char file_name, unsigned line_number, const char format, )異常處理函數,function_name發(fā)生異常的函數名,file_name發(fā)生異常的文件名,發(fā)生異常的行號line_number,發(fā)生異常的拋出消息format。templateint pcl:io:loadPLYFile(cons
45、t std:string& file_name, pcl:PointCloud& cloud)打開ply文件,file_name文件名,cloud保存打開的點云數據。template39ppt課件int pcl:io:savePLYFile(const std:string& file_name, const pcl:PointCloud& cloud, bool binary_mode=false)保存點云到PLY文件,file_name文件名,cloud需要保存的點云數據,binary_mode設置是否保存為二進制格式,默認為false。templateint pcl:io:savePLY
46、FileASCII(const std:string& file_name, const pcl:PointCloud& cloud)templateint pcl:io:savePLYFileBinary(const std:string& file_name, const pcl:PointCloud& cloud)以上兩個函數分別以為ASCII和二進制方式保存點云到ply文件,file_name文件名,cloud需要保存的點云數據。PCL_EXPORTS int pcl:io:savePLYFile(const std:string&40ppt課件file_name, const pcl
47、:PolygonMesh& mesh, unsigned precision=5)保存PolygonMesh對象到PLY文件,file_name為PLY文件名,mesh為需要保存的對象數據,precision為保存精度(默認為5)。CL_EXPORTS void pcl:io:saveRgbPNGFile(const std:string &file_name, const unsigned char rgb_image, int width, int height)保存RGB數據為PNG文件,file_name為PNG文件名,rgb_image為RGB數據,width、height為圖像數據
48、的寬度和高度。PCL_EXPORTS void pcl:io:saveMonoPNGFile(const std:string& file_name, const unsigned char mono_image, int width, int height)功能同上,只是保存的數據為灰度圖像格式。PCL_EXPORTS void pcl:io:saveShortPNGFile(const std:string& file_name, const unsigned short short_image, int width, int 41ppt課件height)功能同上,只是保存的數據為16位灰
49、度圖像格式。templatevoid pcl:io:savePNGFile(const std:string& file_name, const pcl:PointCloud& cloud)保存點云中RGB域為png文件,cloud為包含RGB域的點云對象,file_name為png文件名。PCL_EXPORTS int pcl:io:saveVTKFile(const std:string& file_name, const pcl:PolygonMesh& triangles, unsigned precision=5)保存PolygonMesh對象數據為VTK文件,file_name為V
50、TK文件名,triangles為需要保存的數據,precision為保存精度(默認為5)。42ppt課件4.3 應用實例解析43ppt課件4.3.1 PCD(點云數據)文件格式本小節(jié)描述PCD(點云數據)文件格式,及其他在點云庫(PCL)中應用的方法。1. 為什么用一種新的文件格式?PCD文件格式并非白費力氣地做重復工作,現有的文件結構因本身組成的原因不支持由PCL庫引進n維點類型機制處理過程中的某些擴展,而PCD文件格式能夠很好地補足這一點。PCD不是第一個支持3D點云數據的文件類型,尤其是計算機圖形學和計算幾何學領域,已經創(chuàng)建了很多格式來描述任意多邊形和激光掃描儀獲取的點云。包括下面幾種格
51、式:(1)PLY是一種多邊形文件格式,由Stanford大學的Turk等人設計開發(fā)。(2)STL是3D Systems公司創(chuàng)建的模型文件格式,主要應用于CAD、CAM領域;44ppt課件(3)OBJ是從幾何學上定義的文件格式,首先由Wavefront Technologies開發(fā);(4)X3D是符合ISO標準的基于XML的文件格式,表示3D計算機圖形數據;(5)其他許多種格式。以上所有的文件格式都有缺點,在下一節(jié)會講到。這是很自然的,因為它們是在不同時間為了不同的使用目的所創(chuàng)建的,那時今天的新的傳感器技術和算法都還沒有發(fā)明出來。2. PCD版本在點云庫(PCL)1.0版本發(fā)布之前,PCD文件格
52、式有不同的修訂號。這些修訂號用PCV_Vx來編號(例如,PCD_V5、PCD_V6、PCD_V7等等),代表PCD文件的0.x版本號。然而PCL中PCD文件格式的正式發(fā)布是0.745ppt課件版本(PCD_V7)。3. 文件頭格式每一個PCD文件包含一個文件頭,它確定和聲明文件中存儲的點云數據的某種特性。PCD文件頭必須用ASCII碼來編碼。PCD文件中指定的每一個文件頭字段以及ascii點數據都用一個新行(n)分開了,從0.7版本開始,PCD文件頭包含下面的字段:(1)VERSION指定PCD文件版本。(2)FIELDS指定一個點可以有的每一個維度和字段的名字。例如:FIELDS x y z
53、 #XYZ dataFIELDS x y z rgb #XYZ+colorsFIELDS x y z normal_x normal_y normal_z #XYZ+surface normalsFIELDS j1 j2 j346ppt課件(3)SIZE用字節(jié)數指定每一個維度的大小。例如:unsigned char/char? has 1 byteunsigned short/short? has 2 bytesunsigned int/int/float? Has 4 bytesdouble?has 8 bytes(4)TYPE用一個字符指定每一個維度的類型。現在被接受的類型有:I表示有符號
54、類型int8(char)、int16(short)和int32(int);U表示無符號類型uint8(unsigned char)、uint16(unsigned short)和uint32(unsigned int);F表示浮點類型。(5)COUNT指定每一個維度包含的元素數目。例如,47ppt課件X這個數據通常有一個元素,但是像VFH這樣的特征描述子就有308個。實際上這是在給每一點引入n維直方圖描述符的方法,把它們當做單個的連續(xù)存儲塊。默認情況下,如果沒有COUNT,所有維度的數目被設置成1。(6)WIDTH用點的數量表示點云數據集的寬度。數據是有序點云還是無序點云,WIDTH有兩層解釋
55、:它能確定無序數據集的點云中點的個數(和下面的POINTS一樣)。它能確定有序點云數據集的數據(一行中點的數目)。注意:有序點云數據集,意味著點云是類似于圖像(或者矩陣)的結構,數據分為行和列。這種點云的實例包括立體攝像機和時間飛行攝像機生成的數據。有序數據集的優(yōu)勢在于,預先了解相鄰點(和像素點)的48ppt課件關系,鄰域操作更加高效,這樣就加速了計算并降低了PCL中某些算法的成本。例如:WIDTH 640 #每行有640個點(7)HEIGHT用點的數目表示點云數據集的高度。類似于WIDTH,HEIGHT也有兩層解釋:它表示有序點云數據集的高度(行的總數);對于無序數據集它被設置成1(被用來檢
56、查一個數據集是有序還是無序)。有序點云例子:WIDTH 640 #像圖像一樣的有序結構,有640行和480列HEIGHT 480 #這樣該數據集中共有640 480=307200個點無序點云例子:49ppt課件WIDTH 307200HEIGHT 1 #有307200個點的無序點云數據集(8)VIEWPOINT指定數據集中點云的獲取視點。VIEWPOINT有可能在不同坐標系之間轉換的時候應用,在輔助獲取其他特征時也比較有用,例如曲面法線,在判斷方向一致性時,需要知道視點的方位,視點信息被指定為平移(txtytz)+四元數(qwqxqyqz)。默認值是:VIEWPOINT 0 0 0 1 0 0
57、 0(9)POITNS指定點云中點的總數。從0.7版本開始該字段就有點多余了,因此有可能在將來的版本中將它移除。例子:POINTS 307200 #點云中點的總數為30720050ppt課件(10)DATA指定存儲點云數據的數據類型。從0.7版本開始支持兩種數據類型:ASCII碼和二進制。查看下一節(jié)可以獲得更多細節(jié)。注意:文件頭最后一行(DATA)的下一個字節(jié)就被看成是點云的數據部分了,它會被解釋為點云數據。警告:PCD文件的文件頭部分必須以上面的順序精確指定,也就是如下順序:VERSION、FIELDS、SIZE、TYPE、COUNT、WIDTH、HEIGHT、VIEWPOINT、POINT
58、S、DATA之間用換行隔開。4. 數據存儲類型在0.7版本中,PCD文件格式用兩種模式存儲數據:如果以ASCII形式,每一點占據一個新行:p_1p_251ppt課件p_n注意:從PCL1.0.1版本開始,用字符串“nan”表示NaN,此字符表示該點的值不存在或非法等。如果以二進制形式,這里數據是數組(向量)pcl:PointCloud.points的一份完整拷貝,在Linux系統(tǒng)上,我們用mmap/munmap操作來盡可能快地讀寫數據,存儲點云數據可以用簡單的ASCII形式,每點占據一行,用空格鍵或Tab鍵分開,沒有其他任何字符。也可以用二進制存儲格式,它既簡單又快速,當然這依賴于用戶應用。A
59、SCII格式允許用戶打開點云文件,使用例如gunplot這樣的標準軟件工具更改點云文件數據,或者用sed、awk等工具來對它們進行操作。5. 相對其他文件格式的優(yōu)勢提高適用性和速度。52ppt課件(1)存儲和處理有序點云數據集的能力(2)二進制mmap/munmap數據類型是把數據下載和存儲到磁盤上最快的方法;(3)存儲不同的數據類型(4)特征描述子的n維直方圖另一個優(yōu)勢是通過控制文件格式,我們能夠使其最大程度上適應PCL,這樣能獲得PCL應用程序的最好性能,而不用把一種不同的文件格式改變成PCL的內部格式,這樣的話通過轉換函數會引起額外的延時。注意:盡管PCD(點云數據)是PCL中的內部文件
60、格式,pcl_I/O庫也提供在前面提到的所有其他文件格式中保存和加載數據。6. 例子53ppt課件下面是PCD文件的一個片段。把它留給讀者以解析這些數據,看看它的組成。#.PCD v.7 Point Cloud Data file formatVERSION .7FIELDS x y z rgbSIZE 4 4 4 4TYPE F FFFCOUNT 1 1 1 1 WIDTH 213HEIGHT 1VIEWPORT 0 0 0 1 0 0 0 POINTS 213DATA ascii0.93773 0.33763 0 4.2108e+060.90805 0.35641 0 4.2108e+06
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《戰(zhàn)略采購管理》課件
- 二項式系數的性質課件
- 結腸癌手術案例分析
- 油藏地球物理一體化地震正演軟件ColchisFM介紹
- 工廠證件轉讓合同范例
- 消防監(jiān)測合同范例
- 商務代理合同范例
- 住房押金合同范例
- 鞋類訂貨合同范例
- 團員勞動合同范例
- 2024-2030年中國船舶用傳動軸行業(yè)市場研究及發(fā)展前景預測報告
- CJT272-2008 給水用抗沖改性聚氯乙烯(PVCM)管材及管件
- 深圳市 2022-2023 學年七年級上學期期末地理試題【帶答案】
- 2024年黑龍江省齊齊哈爾市中考數學試題
- 2024年長沙電力職業(yè)技術學院單招職業(yè)技能測試題庫附答案
- 美學導論智慧樹知到期末考試答案章節(jié)答案2024年山東工藝美術學院
- 裝修設計招標評標辦法
- 乒乓球校隊選拔方案
- 熱水供水系統(tǒng)運營維護服務投標方案(技術方案)
- 現實與理想-西方古典繪畫 課件-2023-2024學年高中美術人美版(2019)美術鑒賞
- 快遞安全教育培訓課件
評論
0/150
提交評論