用各種攝像頭獲取影象
可能有很多人想在ROS下學習視覺,先用攝像頭獲取影象,再用opencv做相應演算法處理,可是ROS下影象的採集可不像平常的read一下那麼簡單,需要藉助外部package的使用。而攝像頭即可以用筆記本自帶的攝像頭,也可以用外部的kinect,當然還可以是外部接入的usb介面的攝像頭。前兩者照著《ROS by Example 1》的 第10章來學習,安裝一下相應的package很容易上手。但是Lz在用ROS操作外部接入的攝像頭時遇到了一些問題,用書中的uvc_cam package讀入不了影象,Lz採用的鏡頭是SONY
的CCD鏡頭,然後接了一個UVC影象採集卡(關於這個採集卡,去淘寶搜就有,無需安裝驅動,在ubuntu下直接可以用),這個採集卡出來的影象格式是MJPEG。在廢了一些功夫後,解決了如何採集影象的問題,一一記錄下來。
本文將從兩個方向介紹如何採集影象到ROS下:
1、首先簡要介紹如何用筆記本自帶的攝像頭採集影象,這部分主要就是《ROS by example 1》中第10章的內容,但貼出了lz在使用過程中遇到的問題和解決辦法。
2、用ROS如何採集筆記本或桌上型電腦上上外部攝像頭的影象,硬體:ccd攝像頭+uvc影象採集卡(usb介面),出來的視訊流是MJPEG格式。
一、用筆記本自帶攝像頭採集影象。
筆記本自帶的攝像頭的裝置號一般為/dev/video0
第一步:安裝Webcam 驅動
[python] view plain copy- $sudo apt-get install git-core
- cd ~/catkin_ws/src
- git clone https://github.com/ericperko/uvc_cam.git
- rosmake uvc_cam
$ sudo apt-get install git-core
$ cd ~/catkin_ws/src
$ git clone https://github.com/ericperko/uvc_cam.git
$ rosmake uvc_cam
其中第二行 catkin_ws/src 對應你自己建立的catkin工作空間
在新的終端中輸入,假設你已經安裝了《ROS by example 1》中的rbx1 package:
- roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0
roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0
如果見到ERROR:cannot launch node of type [uvc_cam/uvc_cam_node]:uvc_can…..這個錯誤的話,如下圖。出現這個問題應該是你還沒有安裝uvc_camera 的驅動。
新建一個終端視窗輸入:
[python] view plain copy print?- sudo apt-get install ros-hydro-uvc-camera
sudo apt-get install ros-hydro-uvc-camera
hydro為的ros版本號,請替換為你自己的ROS版本。
現在重新輸入你之前的
[python] view plain copy print?- roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0
roslaunch rbx1_vision uvc_cam.launch device:=/dev/video0
這個時候在終端視窗中還會看到ERROR:Problem setting exposure….可以忽略。
新建終端輸入:
[python] view plain copy print?- rosrun image_view image_view image:=/camera/rgb/image_color
rosrun image_view image_view image:=/camera/rgb/image_color
這時候應該就可以看到彈出一個視窗,等待幾秒,就可以見到影象了。
二、用外部攝像頭採集影象
這部分廢了LZ一些時間,本來想直接用上面讀取筆記本自帶攝像頭的方法應該也可以用在這。於是,我直接按照上面的方式輸入:
[python] view plain copy print?- roslaunch rbx1_vision uvc_cam.launch device:=/dev/video1
- rosrun image_view image_view image:=/camera/rgb/image_color
roslaunch rbx1_vision uvc_cam.launch device:=/dev/video1
rosrun image_view image_view image:=/camera/rgb/image_color
結果,沒有影象,以為是影象寬度和高度設定錯誤,改成640*480,有了!結果是下面這樣:
由於UVC影象採集卡出來的視訊格式是MJPEG,lz查看了uvc_cam的程式以後,進行簡單修改,折騰一番後還是無功而返。
於是,開始排查問題,第一步看攝像頭採集卡有沒有問題:在軟體中心,查詢 guvcview ,安裝這個軟體,然後在video&Files中device一欄選擇為你的外部攝像頭,看有沒有影象。如果沒有影象,說明你的視訊採集卡有問題或者CCD攝像頭有問題。
硬體沒問題以後,只能從ROS的攝像頭驅動想辦法了,ROS支援的攝像頭開發包有很多,這裡有一個列表進行了羅列,還有這裡有一篇文章進行了各個驅動的簡單對比。在檢視usb_cam 的wiki說明的時候,發現pixel_format 一欄預設的是mjpeg,大喜!於是決定啟用這個package.
安裝usb_cam package的流程和上面的uvc_cam幾乎一樣:
[python] view plain copy print?-
cd/catkinws/src git clone https://github.com/bosch-ros-pkg/usb_cam.gitcd/catkinws catkin_make 安裝好以後就是如何使用了。在catkin_ws/src/rbx1/rbx1_vision/launch 下建立一個新的空白檔案,命名為usb_cam.launch,名字和資料夾是你自己設定的,前面是lz存放的方式。在usb_cam.launch檔案中輸入:
[python] view plain copy print?- <launch>
- <arg name=”device” default=“/dev/video0” />
- <node name=”usb_cam_node” pkg=“usb_cam” type=“usb_cam_node” output=“screen”>
- <remap from=“usb_cam_node/image_raw” to=“camera/rgb/image_color” />
- <param name=”video_device” value=“$(arg device)” />
- <param name=”image_width” value=“640” />
- <param name=”image_height” value=“480” />
- <param name=”framerate” value=“30” />
- <param name=”brightness” value=“128” />
- <param name=”contrast” value=“128” />
- <param name=”saturation ” value=“70” />
- </node>
- </launch>
其中:對比度,飽和度,亮度,那三個引數是LZ自己攝像頭上比較好的配置,根據guvcview那個軟體配置的,launch檔案中的remap 將image_raw 對映到image_color是為了和書中的內容對應。<launch> <arg name="device" default="/dev/video0" /> <node name="usb_cam_node" pkg="usb_cam" type="usb_cam_node" output="screen"> <remap from="usb_cam_node/image_raw" to="camera/rgb/image_color" /> <param name="video_device" value="$(arg device)" /> <param name="image_width" value="640" /> <param name="image_height" value="480" /> <param name="framerate" value="30" /> <param name="brightness" value="128" /> <param name="contrast" value="128" /> <param name="saturation " value="70" /> </node> </launch>
然後啟動:
[python] view plain copy print?- roslaunch rbx1_vision usb_cam.launch device:=/dev/video1
- rosrun image_view image_view image:=/camera/rgb/image_color
當然你也可以不用image_view去看,可以在終端中輸入: [python] view plain copy print?roslaunch rbx1_vision usb_cam.launch device:=/dev/video1 rosrun image_view image_view image:=/camera/rgb/image_color
- rqt
用rqt去檢視影象,如下:rqt
[python] view plain copy print?
注意:usb_cam這個驅動預設的視訊格式是mjpeg,如果你想用這個驅動來讀取筆記本自帶攝像頭的影象,需要usb_cam.launch中修改視訊畫素格式,在launch檔案中新增如下語句:- <param name=“pixel_format ” value=“yuyv” />
<param name="pixel_format " value="yuyv" />
其中筆記本的視訊格式yuyv是通過guvcview軟體檢視獲得。
這個渣渣影象,是一開始usb_cam預設引數配置的結果。一開始遇到的時候,把lz嚇壞了,這畫素用來做演算法會是個坑啊。於是lz關閉所有ROS節點,將攝像頭斷電,uvc影象採集卡拔下來重新插上,重新給攝像頭上電,然後啟動guvcview,會出來一套預設的引數,效果很好,於是記下了那幾個引數,就是前面的對比度(128),亮度(128),飽和度(70).將這幾個引數修改以後,果然好了很多。
至此,無論是關於外部攝像頭(實驗室大多數情況)採集影象還是用筆記本攝像頭採集影象,都已經解決了,下面就是在ROS下操作opencv寫演算法了,照著《ROS by example 1》中第10章學習就行了。
文章為轉載,
請注重博主勞動成果,
錯誤請指出,轉載請註明。
–白巧克力