Llinux+ROS+OpenCV開發環境配置筆記
阿新 • • 發佈:2019-01-31
ROS中的三個重要計算機視覺的包分別為:OpenCV,(OpenNI2+OpenKinect) 和 PCL。OpenCV主要負責2D影象處理,OpenNI2和OpenKinect則是以Kinect為攝像頭的深度視覺庫,PCL是用於處理3D粒子群的庫。
1.首先配置好ROS,若還沒配置好ROS,參見ROS和Android的配置筆記。
2.然後安裝上面提及的這些包:
$ sudo apt-get install ros-indigo-openni-* ros-indigo-openni2-* \ros-indigo-freenect-*
$ rospack profile
3.安裝攝像頭的驅動,這裡有很多方法,一個簡易的方法(不一定適用於所有攝像頭),是使用usb_cam包:
$ cd ~/catkin_ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ~/catkin_ws
$ catkin_make
$ rospack profile
免Linux的驅動攝像頭最好,可以通過 ls dev/ 看目錄下有無檢測到video0(一般為攝像頭)。
如果usb_cam包無效,可以試一下Linux UVC包。
可以使用luvcview去測試linux下攝像頭的安裝是否正確。
4.安裝rbx1包,這是ROS by Example的原始碼:
$ cd ~/catkin_ws/src
$ cd rbx1
$ git checkout indigo-devel
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
$ rospack profile
5.先測試連線Kinect(沒有Kinect可以跳過):
$ roslaunch freenect_launch freenect-registered-xyzrgb.launch
如果沒有Kinect,可以在初始化結束之後ctrl+C退出。
6.測試
VMWare Workstation 虛擬機器對攝像頭支援不好。如果攝像頭不支援,好像目前無解!
$ roslaunch rbx1_vision usb_cam.launch video_device:=/dev/video0
這會讓攝像頭publish影象到/camera/rgb/image_raw話題。
若提示沒有找到包,試一下如下:
具體請參考這個script。
$ cd ~/catkin_ws $ source ~/catkin_ws/devel/setup.bash然後用image_view訂閱該話題,即可顯示攝像頭的輸入。 在新的terminal中: $ rosrun image_view image_view image:=/camera/rgb/image_raw 若能看到攝像頭輸入,說明ROS已經能夠正確讀取攝像頭輸入。 7.下面我們安裝OpenCV。 $ sudo apt-get install ros-indigo-vision-opencv libopencv-dev \python-opencv $ rospack profile #檢視已經安裝的包 8.測試python是否能呼叫OpenCV: $ python >>> from cv2 import cv 如果能夠import說明安裝成功 >>> quit() 9. ROS與OpenCV之間的影象格式轉換由 cv_bridge 包負責,我們看下這個包怎麼運作: $ roslaunch rbx1_vision usb_cam.launch video_device:=/dev/video0 $ $rosrun rbx1_vision cv_bridge_demo.py Github的程式碼已經更新,這裡面我們需要手動改一些這個python script的語句,注意,這個檔案的路徑在:catkin_ws/src/rbx1/rbx1_vision/nodes下。 將其中的 input_rgb_image,input_depth_image全部改為/camera/rgb/image_raw。以上兩個是jade裡的更新的主題名,但在indigo裡,還是以/camera/rgb/image_raw為主題名。 這個python script裡面幾個關鍵的語句: # 建立CvBridge物件 self.bridge = CvBridge() # 將ros_image通過藍綠紅8位色空間轉換為OpenCV影象,結果返回給frame frame = self.bridge.imgmsg_to_cv2(ros_image,"bgr8") # 最後將frame用numpy轉換成numpy數列,OpenCV這樣大部分的函式才能夠處理 frame = np.array(frame,dtype = np.uint8) 到這一步,ROS和OpenCV的配置基本完成,接下來OpenCV的開發可以基於ros2opencv2.py(catkin_ws/src/rbx1/rbx1_vision/src/rbx1_vision/ros2opencv2.py),改寫其中的process_image()和process_depth_image()函式即可。在訂閱主題的同時,這個節點也會發布資訊到/roi(關注域,region of interest)主題下。 其具體的格式為: uint32 x_offset uint32 y_offset uint32 height uint32 width bool do_rectify
具體請參考這個script。
References:
《ROS by Example》Chapter 10