ROS&OpenCV进行摄像头数据的采集与订阅发布(转)

 一銤阳光原文链接  点击打开链接

依赖 
opencv库 
ros-indigo-image-transport

首先用openCV来捕获视频流,然后转换成ROS图像的传输格式

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

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

  // Open camera with CAMERA_INDEX (webcam is typically #0).
  const int CAMERA_INDEX = 0;
  cv::VideoCapture capture( CAMERA_INDEX ); //摄像头视频的读操作
  if( not capture.isOpened() )
  {
    ROS_ERROR_STREAM(
      "Failed to open camera with index " << CAMERA_INDEX << "!"
    );
    ros::shutdown();
  }
  //1 捕获视频

  //2 创建ROS中图像的发布者
  image_transport::ImageTransport it( n ); 
  image_transport::Publisher pub_image = it.advertise( "camera", 1 );


  //cv_bridge功能包提供了ROS图像和OpenCV图像转换的接口,建立了一座桥梁
  cv_bridge::CvImagePtr frame = boost::make_shared< cv_bridge::CvImage >();
  frame->encoding = sensor_msgs::image_encodings::BGR8;

  while( ros::ok() ) {
    capture >> frame->image; //流的转换

    if( frame->image.empty() )
    {
      ROS_ERROR_STREAM( "Failed to capture frame!" );
      ros::shutdown();
    }
    //打成ROS数据包
    frame->header.stamp = ros::Time::now();
    pub_image.publish( frame->toImageMsg() );

    cv::waitKey( 3 );//opencv刷新图像 3ms
    ros::spinOnce();
  }

  capture.release();  //释放流
  return EXIT_SUCCESS;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

OpenCV可以捕获摄像头数据,或者从文件中读取数据 
cv::VideoCapture capture( const string& filename, // 输入文件名 ); 
cv::VideoCapture capture( int device // 视频捕捉设备 id ); 设备号从0开始往后排


再写一个节点来订阅这个ROS发布的图像话题

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

void imageCallback(const sensor_msgs::ImageConstPtr& msg)  
{  
//sensor_msgs::Image ROS中image传递的消息形式
  try  
  {  
    cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);  
   // cv::WaitKey(3);  
  }  
  catch (cv_bridge::Exception& e)  
  {  
    ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());  
  }  
}  

int main(int argc, char **argv)  
{  
  ros::init(argc, argv, "image_sub_node");  
  ros::NodeHandle nh;  
  cv::namedWindow("view");  
  cv::startWindowThread();  
  image_transport::ImageTransport it(nh);  
  image_transport::Subscriber sub = it.subscribe("camera", 1, imageCallback);  
  ros::spin();  
  cv::destroyWindow("view");  //窗口
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

还可以通过 web_video_server 把image通过网络进行传输


编译出错 cannot find -lopencv_dep_cudart

catkin_make 本质上还是make文件 
Cmakelists.txt中做相应的修改,

在cmake编译时 加参数 -D CUDA_USE_STATIC_CUDA_RUNTIME=OFF 
或者直接在Cmakelist.txt文件中修改, 
CMakeLists.txt中find_package(OpenCV REQUIRED)之前加上:set(CUDA_USE_STATIC_CUDA_RUNTIME OFF)


  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中使用OpenCV摄像头可以通过以下步骤实现: 1. 安装ros-opencv包:在终端中执行以下命令 ``` sudo apt-get install ros-<distro>-opencv ``` 其中`<distro>`是你正在使用的ROS发行版的名称,例如`melodic`或`noetic`。 2. 创建ROS包并添加依赖项:在终端中执行以下命令 ``` cd ~/catkin_ws/src catkin_create_pkg opencv_camera rospy cv_bridge image_transport ``` 这将在`catkin_ws/src`目录下创建名为`opencv_camera`的新ROS包,并为其添加依赖项。 3. 编写ROS节点:打开一个新的终端窗口,输入以下命令,创建一个名为`camera_node.py`的Python脚本文件,并将其放入`opencv_camera/src`文件夹中。 ``` cd ~/catkin_ws/src/opencv_camera/src touch camera_node.py chmod +x camera_node.py ``` 然后使用你喜欢的文本编辑器打开`camera_node.py`文件,并将以下代码粘贴到文件中: ```python #!/usr/bin/env python import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError bridge = CvBridge() def publish_camera(): rospy.init_node('camera_node', anonymous=True) pub = rospy.Publisher('camera/image_raw', Image, queue_size=10) cap = cv2.VideoCapture(0) rate = rospy.Rate(30) # 30 Hz while not rospy.is_shutdown(): ret, frame = cap.read() if not ret: break try: pub.publish(bridge.cv2_to_imgmsg(frame, "bgr8")) except CvBridgeError as e: print(e) rate.sleep() cap.release() if __name__ == '__main__': try: publish_camera() except rospy.ROSInterruptException: pass ``` 该节点将打开计算机上的默认摄像头,并将每个帧发布到`/camera/image_raw`主题中。 4. 编译ROS包:在终端中执行以下命令 ``` cd ~/catkin_ws catkin_make ``` 这将编译`opencv_camera`包。 5. 运行ROS节点:在终端中输入以下命令 ``` rosrun opencv_camera camera_node.py ``` 这将启动ROS节点并开始发布摄像头图像。 6. 查看摄像头图像:打开一个新的终端窗口,输入以下命令 ``` rosrun image_view image_view image:=/camera/image_raw ``` 这将打开一个图像查看器,其中将显示从摄像头发布的图像。 现在,你已经成功地将OpenCV摄像头集成到ROS中,并且可以在其他ROS节点中使用该摄像头

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值