opencv获取相机图像并发布为ROS节点

  ##仅记录工程中的使用

  完整代码请查看:https://github.com/chx725/cv_and_ros

  ROS是最普遍使用的机器人系统之一,提供了各种功能包,仿真环境,模型,可视化工具等,为项目开发提供方便,加速开发流程,opencv是流行的计算机视觉库,两者的交互十分重要。

一、opencv获取图像

  opencv使用VideoCapture来获取相机图像,具体的应用可以查看opencv官网的tutorial,以下只是简单的说明使用过程:

VideoCapture capture;
if (!capture.open(camera_id)) {//打开摄像头
    std::cout << "Capture from camera " << camera_id << " didn't work" << std::endl;
    return -1;
}
if (capture.isOpened()) {//设置frame格式
   capture.set(CV_CAP_PROP_FRAME_WIDTH,camera_width*2);//  1280x720
   capture.set(CV_CAP_PROP_FRAME_HEIGHT,camera_height);
   capture.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
   capture.set(CV_CAP_PROP_FPS, 60);
// capture.set(CV_CAP_PROP_FOURCC,CV_FOURCC('Y','V','1','2'));
// capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('Y', 'U', 'Y', 'V'));
}
capture >> frame;
if( frame.empty() ){
   ROS_ERROR("get frame empty");
   break;
}
//这里以双目为例,从frame中获取左右图像
left_img = frame(Rect(0,0, frame.cols / 2, frame.rows));
right_img = frame(Rect(frame.cols / 2, 0, frame.cols / 2, frame.rows));

二、CV和ROS图像的转换

  ROS中的图像用sensor_msgs/Image表示,CV中使用Mat表示图像,两者的转换使用ROS中提供的CvBridge(http://wiki.ros.org/cv_bridge),框架如下:

                                      cv::Mat ——>  ROS CvBridge ——> ROS Image Message

#include <cv_bridge/cv_bridge.h>

sensor_msgs::ImagePtr left_msg = cv_bridge::CvImage(std_msgs::Header(),
    "bgr8", left_img).toImageMsg();
sensor_msgs::ImagePtr right_msg = cv_bridge::CvImage(std_msgs::Header(),
    "bgr8", right_img).toImageMsg();

三、ROS中图像的发布

  ROS中提供了image_transport(http://wiki.ros.org/image_transport)专门用于图像sensor_msgs/Image的订阅和发布,该包的使用和publisher和subscriber一样(也可以使用publisher和subscriber对图像进行订阅和发布等)。

#include <image_transport/image_transport.h>

image_transport::ImageTransport it(n);
image_transport::Publisher left_image_pub = it.advertise("camera/left/image_raw", 1);
image_transport::Publisher right_image_pub = it.advertise("camera/right/image_raw", 1);

猜你喜欢

转载自blog.csdn.net/chx725/article/details/81143033