上篇文章我们介绍了怎么用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操作系统,也不是我们正常所定义的操作系统,两者当真如出一辙。

 

其余格式摄像头以后会逐步补充上来。