1. 程式人生 > >用各種攝像頭獲取影象

用各種攝像頭獲取影象

可能有很多人想在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
print?
  1. $sudo apt-get install git-core
  2. cd ~/catkin_ws/src  
  3. git clone https://github.com/ericperko/uvc_cam.git  
  4. 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:

[python] view plain copy print?
  1. 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?
  1. sudo apt-get install ros-hydro-uvc-camera  
sudo apt-get install ros-hydro-uvc-camera
hydro為的ros版本號,請替換為你自己的ROS版本。

    現在重新輸入你之前的

[python] view plain copy print?
  1. 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?
  1. 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?
  1. roslaunch rbx1_vision uvc_cam.launch device:=/dev/video1  
  2. 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?
  1. cd/catkinws/src git clone https://github.com/bosch-ros-pkg/usb_cam.git cd/catkinws catkin_make 安裝好以後就是如何使用了。

    在catkin_ws/src/rbx1/rbx1_vision/launch 下建立一個新的空白檔案,命名為usb_cam.launch,名字和資料夾是你自己設定的,前面是lz存放的方式。在usb_cam.launch檔案中輸入:

    [python] view plain copy print?
    1. <launch>  
    2.     <arg name=”device” default=“/dev/video0” />  
    3.     <node name=”usb_cam_node” pkg=“usb_cam” type=“usb_cam_node” output=“screen”>  
    4.     <remap from=“usb_cam_node/image_raw” to=“camera/rgb/image_color” />  
    5.         <param name=”video_device” value=“$(arg device)” />  
    6.         <param name=”image_width” value=“640” />  
    7.         <param name=”image_height” value=“480” />  
    8.         <param name=”framerate” value=“30” />  
    9.         <param name=”brightness” value=“128” />  
    10.         <param name=”contrast” value=“128” />  
    11.         <param name=”saturation ” value=“70” />  
    12.     </node>  
    13. </launch>  
    <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是為了和書中的內容對應。

    然後啟動:

    [python] view plain copy print?
    1. roslaunch rbx1_vision usb_cam.launch device:=/dev/video1  
    2. rosrun image_view image_view image:=/camera/rgb/image_color  
    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?
    1. rqt  
    rqt
    用rqt去檢視影象,如下:


        注意:usb_cam這個驅動預設的視訊格式是mjpeg,如果你想用這個驅動來讀取筆記本自帶攝像頭的影象,需要usb_cam.launch中修改視訊
    畫素格式,在launch檔案中新增如下語句:

    [python] view plain copy print?
    1. <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章學習就行了。

    文章為轉載,

    請注重博主勞動成果,

    錯誤請指出,轉載請註明。

                                    –白巧克力