转自:http://blog.csdn.net/yake827/article/details/44983093

在上节已经实现了单张图片的ROS实现,而在现实中,我们一般是使用摄像头来获取图像,这次要实现在ROS中使用摄像头传输图像,我使用的是罗技的usb网络摄像头,首先我们需要获取摄像头的型号,如下所示:

[plain] view plaincopy
  1. yake@yake-K42JE:~$ lsusb
  2. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  3. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  4. Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
  5. Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
  6. Bus 001 Device 003: ID 04f2:b1e5 Chicony Electronics Co., Ltd
  7. Bus 002 Device 003: ID 046d:c058 Logitech, Inc. M115 Mouse
  8. Bus 002 Device 008: ID 046d:0825 Logitech, Inc. Webcam C270

我所使用的是罗技的C270网络摄像头.接下来我们要为摄像头安装驱动,我使用的是cheese点击打开链接,这个驱动的好处是在ubuntu环境下直接apt-get获得

[plain] view plaincopy
  1. yake@yake-K42JE:~$ sudo apt-get install cheese

安装完成后,插上摄像头可以发现在dev/目录下多了一个viedo0的设备,这个说明摄像头驱动已经安装完成.接下来开始在ROS中使用它.使用的方式是通过opencv函数来实现.

首先还是要创建一个包,写一个驱动摄像头的文件,命名为my_publisher.cpp,作用是获取图像并打包成ros格式发送出去,创建包的方法与单张图片一样,my_publisher.cpp内容如下:

[plain] view plaincopy
  1. #include <ros/ros.h>
  2. #include <image_transport/image_transport.h>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <cv_bridge/cv_bridge.h>
  5. #include <sstream> // for converting the command line parameter to integer
  6. int main(int argc, char** argv)
  7. {
  8. // Check if video source has been passed as a parameter
  9. if(argv[1] == NULL)
  10. {
  11. ROS_INFO("argv[1]=NULL\n");
  12. return 1;
  13. }
  14. ros::init(argc, argv, "image_publisher");
  15. ros::NodeHandle nh;
  16. image_transport::ImageTransport it(nh);
  17. image_transport::Publisher pub = it.advertise("camera/image", 1);
  18. // Convert the passed as command line parameter index for the video device to an integer
  19. std::istringstream video_sourceCmd(argv[1]);
  20. int video_source;
  21. // Check if it is indeed a number
  22. if(!(video_sourceCmd >> video_source))
  23. {
  24. ROS_INFO("video_sourceCmd is %d\n",video_source);
  25. return 1;
  26. }
  27. cv::VideoCapture cap(video_source);
  28. // Check if video device can be opened with the given index
  29. if(!cap.isOpened())
  30. {
  31. ROS_INFO("can not opencv video device\n");
  32. return 1;
  33. }
  34. cv::Mat frame;
  35. sensor_msgs::ImagePtr msg;
  36. ros::Rate loop_rate(5);
  37. while (nh.ok()) {
  38. cap >> frame;
  39. // Check if grabbed frame is actually full with some content
  40. if(!frame.empty()) {
  41. msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
  42. pub.publish(msg);
  43. //cv::Wait(1);
  44. }
  45. ros::spinOnce();
  46. loop_rate.sleep();
  47. }
  48. }

再写一个my_subscriber.cpp,作用是获取ROS图像并显示,内容如下:

[plain] view plaincopy
  1. #include <ros/ros.h>
  2. #include <image_transport/image_transport.h>
  3. #include <opencv2/highgui/highgui.hpp>
  4. #include <cv_bridge/cv_bridge.h>
  5. void imageCallback(const sensor_msgs::ImageConstPtr& msg)
  6. {
  7. try
  8. {
  9. cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
  10. // cv::WaitKey(30);
  11. }
  12. catch (cv_bridge::Exception& e)
  13. {
  14. ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  15. }
  16. }
  17. int main(int argc, char **argv)
  18. {
  19. ros::init(argc, argv, "image_listener");
  20. ros::NodeHandle nh;
  21. cv::namedWindow("view");
  22. cv::startWindowThread();
  23. image_transport::ImageTransport it(nh);
  24. image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
  25. ros::spin();
  26. cv::destroyWindow("view");
  27. }

接下来要把设计到的各种包和opencv在CmakeList中声明一下,添加以下语句

[plain] view plaincopy
  1. find_package(OpenCV REQUIRED)
  2. # add the publisher example
  3. add_executable(my_publisher src/my_publisher.cpp)
  4. target_link_libraries(my_publisher ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})
  5. # add the subscriber example
  6. add_executable(my_subscriber src/my_subscriber.cpp)
  7. target_link_libraries(my_subscriber ${catkin_LIBRARIES} ${OpenCV_LIBRARIES})

将这个包进行编译

[plain] view plaincopy
  1. yake@yake-K42JE:~/ros_ws$ catkin_make

编译过程可能会出现错误,其中一个就是cv::WaitKey不能识别,这个问题到最后依然没有解决,我是直接把它注释掉,这样也没什么影响.接下来开始运行程序,首先启动ROS.

[plain] view plaincopy
  1. yake@yake-K42JE:~$ roscore

运行my_publisher节点.(如果运行不起来,需要先source devel/setup.bash)

[plain] view plaincopy
  1. yake@yake-K42JE:~/video_ros$ rosrun learning_image_transport my_publisher 0

这时候会看到我们的摄像头灯已经亮起来了,0代表默认摄像头,如果有多个摄像头,则第二个是1,依次类推.

接下来运行my_subscriber节点来接收图像

[plain] view plaincopy
  1. yake@yake-K42JE:~/video_ros$ rosrun learning_image_transport my_subscriber

这时候如果没有错误的话就会弹出图像窗口


可以看到我们摄像头传输出来的图像,到此,整个程序结束!

在ROS中使用USB网络摄像头传输图像相关推荐

  1. linux获取网络摄像头视频教程,在Linux中读取USB网络摄像头的输出

    我在C中用fread和fwrite进行了一些实验,所以我在C中写了这个小程序,从网络摄像头获取数据并将其转储到一个文件中.以下是来源: #include #include #define SIZE 3 ...

  2. java捕捉摄像头画面_在java中捕获来自网络摄像头的图像?

    一只萌萌小番薯 这个JavaCV实现工作正常.码:import org.bytedeco.javacv.*;import static org.bytedeco.javacpp.opencv_core ...

  3. usb网络linux系统安装教程,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...

    Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...

  4. Linux有问必答:如何在树莓派上安装USB网络摄像头

    https://linux.cn/article-5312-1.html 2015-4-20 17:38    收藏: 4 参考原文:http://ask.xmodulo.com/install-us ...

  5. 2022年全球市场Type-C USB网络摄像头总体规模、主要生产商、主要地区、产品和应用细分研究报告

    本文研究全球市场.主要地区和主要国家Type-C USB网络摄像头的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,Type-C USB网络摄像头销量.价格.收入和市场份额等.针对 ...

  6. linux usb 网络摄像头,树莓派|Linux有问必答:如何在树莓派上安装USB网络摄像头...

    Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...

  7. 网络摄像头的linux系统,Linux系统入门学习:如何在树莓派上安装USB网络摄像头...

    Question: 我可以在树莓派上使用标准的USB网络摄像头么?我该如何检查USB网络摄像头与树莓派是否兼容?另外我该如何在树莓派上安装它? 如果你想在树莓上拍照或者录影,你可以安装树莓派的摄像头板 ...

  8. 在ubuntu中设置使用网络摄像头

    介绍 目录 选择网络摄像头 使用Cheese测试您的网络摄像头 网络摄像头软件 配置网络摄像头软件 VLC FFmpeg的 MPlayer的 MEncoder的 Skype的 飘带 识别您的网络摄像头 ...

  9. STM32F746G-Disco和Stm32Fdis-Cam(OV9655)组合成USB网络摄像头

    手上有如下硬件,今天把它们组合成一台USB网络摄像头: 1.意法半导体ST公司出的开发板:Stm32f746g-Disco 2.Omnivision公司出的摄像头:Stm32f4dis-Cam(OV9 ...

最新文章

  1. 如何快速设计元器件原理图库和PCB封装库?
  2. axios不发起请求_axios 发 post 请求的问题
  3. python基本数据类型选择题-python基础学习——基础数据类型练习题(二)
  4. java中范型的限定
  5. 液化气调压阀爆炸及使用问题分析
  6. mnesia mysql性能_Mnesia
  7. 《转》在c/s中,登录成功后如何关闭登录窗体显示主窗体
  8. 人工智能发展历史与常见名词解释
  9. 2353410-03-2,TCO-PEG8-acid末端羧酸(CO2H)可在活化剂(例如EDC或HATU)存在下与伯胺基反应以形成稳定键
  10. 【多场景建模】CIKM2021 阿里妈妈多场景CTR预估模型STAR 论文精读
  11. Codeforces 484A - Bits (贪心)
  12. java判断硬盘为固态硬盘_怎么看电脑是不是固态硬盘|查询电脑硬盘是HDD还是SSD的方法-系统城...
  13. 携程2018 秋招编程题 - java
  14. mac 蓝牙搜索不到SONY WI-1000X 耳机型号
  15. 1683. Fridge
  16. matlab基于遗传算法的最大熵值法的双阈值图像分割
  17. 视频教程-学校网管员培训视频教程-网络技术
  18. 【TIOBE 2月编程语言排行榜新鲜出炉!Python获1.77%增长率!】
  19. 【NLP】seq2seq 由浅入深——基于Rnn和Cnn的处理方式
  20. css lt;igt;,Tailwind CSS v2.0重磅更新~

热门文章

  1. 大白话btree和b+tree
  2. 大头儿子小头爸爸计算机音乐,幼儿园大班音乐教案:《大头儿子小头爸爸》插曲...
  3. SpringMVC_初级总结
  4. 苹果承认iOS源代码泄露,对iOS 11.2.5的有没有影响
  5. GNN论文周报 | 来自北航、中科院、MSRA、新加坡国立大学、慕尼黑工业大学等机构前沿论文研究...
  6. Ubuntu下使用ROS moveit 连接ABB机器人
  7. anaconda新手使用心得
  8. Linux云计算之OpenStack(Keyston - 认证服务)
  9. 张宇:2020版数学1000题勘误及公告
  10. 【转】LVTTL与LVCMOS区别