天天看點

ROS關于cv_brige的使用

最近想使用OpenCV 和ROS實作點雲的拼接,實作三維重建,那麼在學習了kinect的基本的使用方法以後我們知道,直接使用ROS 的包即可得到點雲,深度圖,rgb圖等資訊,

roslaunch openni_launch openni.launch(深度圖彩色圖,還有點雲都擷取了)

rosrun openni_camera openni_node   (深度圖與彩色圖)

那麼實作點雲的拼接就需要使用cv_bridge把ROS 的資料格式轉為Opencv可以使用的資料格式。即是一個提供ROS和OpenCV庫提供之間的接口的開發包。

ROS關于cv_brige的使用

(1) 将ROS圖像資訊轉換為OpenCV圖像

cvbridge定義了一個opencv圖像cvimage的類型、包含了編碼和ROS的資訊頭。cvimage包含準确的資訊sensor_msgs /image,是以我們可以将兩種資料類型進行轉換。cvimage類格式:

當要把一個ROS 的sensor_msgs /image 資訊轉化為一cvimage,cvbridge有兩個不同的使用情況:

(1)如果要修改某一位的資料。我們必須複制ROS資訊資料的作為副本。

(2)不修改資料。可以安全地共享的ROS資訊,而不是複制的資料。

cvbridge轉換為CvImage提供了以下功能:

輸入是圖像消息指針,以及可選的編碼參數。編碼是指cvimage的類型。

tocvcopy複制從ROS消息的圖像資料,可以自由修改傳回的cvimage。即使當源和目的編碼比對。

tocvshare将避免複制,在ROS的消息資料把指針傳回的 cv::mat,,如果源和目的編碼比對。隻要你保持一份傳回的cvimage,ROS的消息資料将不會釋放。如果編碼不比對時,它将配置設定一個新的緩沖區,執行轉換。将不得修改傳回的cvimage,因為它可能與ROS的圖像資訊共享資料,這反過來又可能與其他回調函數共享。注:對tocvshare二次過載更友善,轉換當一個指針指向其他資訊類型(如stereo_msgs / disparityimage)包含一個sensor_msgs /image。

如果沒有編碼(或更确切地說,空字元串),則目标圖像編碼将與圖像消息編碼相同。在這種情況下tocvshare保證不複制圖像資料。圖像編碼可以是以下任何一個opencv圖像編碼:

8UC[1-4]

8SC[1-4]

16UC[1-4]

16SC[1-4]

32SC[1-4]

32FC[1-4]

64FC[1-4]

介紹集中cvbridge 中常見的資料編碼的形式,cv_bridge可以有選擇的對顔色和深度資訊進行轉化。為了使用指定的特征編碼,就有下面集中的編碼形式:

mono8:  CV_8UC1, 灰階圖像

mono16: CV_16UC1,16位灰階圖像

bgr8: CV_8UC3,帶有顔色資訊并且顔色的順序是BGR順序

rgb8: CV_8UC3,帶有顔色資訊并且顔色的順序是RGB順序

bgra8: CV_8UC4, BGR的彩色圖像,并且帶alpha通道

rgba8: CV_8UC4,CV,RGB彩色圖像,并且帶alpha通道

注:這其中mono8和bgr8兩種圖像編碼格式是大多數OpenCV的編碼格式。

bayer_rggb8

bayer_bggr8

bayer_gbrg8

bayer_grbg8

1.把Opencv圖像轉換為ROS圖像格式

To convert a CvImage into a ROS image message, use one the toImageMsg() member function:

舉個例子

首先要在建立的包CMakeLists.txt裡添加依賴包。分别如下:

 在src檔案下建立一個cv_ros_beginner.cpp檔案檔案内容如下

然後在CMakeLists.txt添加,

  add_executable(cv_ros_beginner src/cv_ros_beginner.cpp)

 target_link_libraries(cv_ros_beginner

   ${catkin_LIBRARIES}

 )

傳回catin_ws 下catkin_make即可生成可執行檔案

那麼我們在檢視結果的時候就是要把

image_sub_ = it_.subscribe("/rgb/image_raw", 1, &ImageConverter::imageCb, this);                 

把訂閱的節點換成之前我們需要訂閱的節點即可實作    在訂閱的圖像上畫一個小圓圈,并且可視化出來。

ROS關于cv_brige的使用

 (小技巧記錄:如果你的工作空間下包很多,每次都使用catkin_make的話效率十分低下,因為這種編譯方法會編譯工作空間下的所有的包,特别是我們在調試程式是會經常修改CMakeLists.txt檔案裡的内容,這樣每次都會要編譯整個工作空間,那麼是以我們可以使用ROS的catkin_Make的功能編譯一個或者多個包,具體的指令是:catkin_make -DCATKIN_WHITELIST_PACKAGES=" 你的包名"),例如:catkin_make -DCATKIN_WHITELIST_PACKAGES="ros_slam"

如果需要編譯兩個或者多個隻需要中間加分号即可catkin_make -DCATKIN_WHITELIST_PACKAGES="ros_slam;cv_bridge",

隻是搬運以下官網的程式,當然你可以實作更多的處理

那麼有關于ROS以及PCL的使用的興趣者掃描二維碼關注一起與我交流分享

ROS關于cv_brige的使用

繼續閱讀