1. 程式人生 > >ROS系統學習6---攝像頭影象資料的採集

ROS系統學習6---攝像頭影象資料的採集

上篇文章我們介紹了怎麼用OpenCV開啟影象並將影象資料傳送出去, 這解決了一部分問題。但實際工程應用中,我們經常需要實時獲取影象資料,因此僅僅讀取本地的圖片是不夠的。本篇我們將研究如何獲取以USB/rtsp等格式傳輸的攝像頭的資料,與上一篇文章相互呼應。

USB攝像頭:

首先,我們要有一個USB攝像頭。確保了這一點後將攝像頭插上去,輸入命令:

ls /dev/v*

如果看到"/dev/video0",則表示攝像頭被成功驅動了。 

為了驗證上面的說法,我們可以下載個程式看看攝像頭拍到的畫面:

sudo apt-get install camorama

裝完輸入

camorama

正常的話就可以看到畫面了。

到此,準備工作做完。ROS有很多的開源包提供讀取USB資料的功能,比如usb_cam和gscam等,但本人嘗試過後都存在這不程度的問題(可能是本人用的攝像頭比較神奇),因此本人直接用OpenCV讀取來處理,簡單粗暴,效果迷人!只需要把上篇文章的rosOpenCV.cpp的程式碼改寫下即可:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_publisher");
  ros::NodeHandle nh;

  cv::Mat image;
  cv::VideoCapture cap(0);//0為要索引的攝像頭
  if(!cap.isOpened()) 
  {
      ROS_INFO("can not opencv video device\n");
      return 1;
  }
  while (nh.ok()) 
  {
    cap >> image;//從攝像頭抓取一幀影象
    cv::imshow("",image);
    cv::waitKey(3);
  }

  ros::spin();
}

由上面也可以看出,我們很多時候說的“ROS驅動程式”,不過就是讀取資料的一個ROS節點,並不是我們通常所定義的那種連線軟硬體的程式。當然ROS作業系統,也不是我們正常所定義的作業系統,兩者當真如出一轍。

其餘格式攝像頭以後會逐步補充上來。