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