ROS订阅两个图像节点

Posted kekeoutlook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS订阅两个图像节点相关的知识,希望对你有一定的参考价值。

双目相机左右视图获取

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <sstream> // for converting the command line parameter to integer

char command;
cv::Mat left,right;

void imageCallbackLeft(const sensor_msgs::ImageConstPtr &msg)
{
   try
   {
       left = cv_bridge::toCvShare(msg,"bgr8")->image;
       cv::imshow("left",left );
       command=cv::waitKey(1);
       if(command == ‘ ‘)
       {
	 cv::imwrite("left.jpg",left);
         cv::imwrite("right.jpg",right);
       }
   }
   catch(cv_bridge::Exception &e)
   {
    
   }
}

void imageCallbackRight(const sensor_msgs::ImageConstPtr &msg)
{
   try
   {
       right =  cv_bridge::toCvShare(msg,"bgr8")->image;
       cv::imshow("right",right);
       //cv::waitKey(1);
   }
   catch(cv_bridge::Exception &e)
   {
    
   }
}

int main(int argc, char** argv)
{

  ros::init(argc, argv, "video_publish");
  ros::NodeHandle nh("~");
  image_transport::ImageTransport it(nh);
  image_transport::Subscriber sub_left = it.subscribe("/left/image_rect_color", 1,imageCallbackLeft);
  image_transport::Subscriber sub_right = it.subscribe("/right/image_rect_color", 1,imageCallbackRight);

 ros::spin();

     
}

  

ROS发布图像

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <sstream> // for converting the command line parameter to integer

int main(int argc, char** argv)
{

  ros::init(argc, argv, "video_publish");
  ros::NodeHandle nh("~");
  image_transport::ImageTransport it(nh);
  image_transport::Publisher pub = it.advertise("/usb_cam/image_raw", 1);

  std::string device_name;
  //nh.param<std::string>("device_name",device_name,"");

 // nh.param<std::string>( "device_name", device_name, device_name );
    //std::cout << "device_name = "<< device_name  << std::endl;
  cv::VideoCapture cap(0);
  // Check if video device can be opened with the given index
  //cap.set(CV_CAP_PROP_FRAME_WIDTH,1280);
  //cap.set(CV_CAP_PROP_FRAME_HEIGHT,720);
  
if(!cap.isOpened())
  {
    std::cout << "can‘t open video stream..." << std::endl;
     return 1;
  }
  cv::Mat frame;
  sensor_msgs::ImagePtr msg;

  ros::Rate loop_rate(25);


  
  //cv::namedWindow("src",0);
  //cv::resizeWindow("src",640,480);

  int count = 0;
  char frame_count[256];

  while (nh.ok()) {
    cap >> frame;

    resize(frame,frame,cv::Size(1280,720));
    // Check if grabbed frame is actually full with some content
    if(!frame.data) {
     cap.open(device_name);
     continue;
     //break;
    }
    msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", frame).toImageMsg();
    pub.publish(msg);

    //sprintf(frame_count,"frame # %d",count++);
   // cv::putText(frame,frame_count,cv::Point(20,20),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar(255,0,255),4,8);
    cv::imshow("src",frame);
    cv::waitKey(1);
    
    ros::spinOnce();
    loop_rate.sleep();
  }
   cv::destroyAllWindows();
   pub.shutdown();
   return 0;
}

  

 

以上是关于ROS订阅两个图像节点的主要内容,如果未能解决你的问题,请参考以下文章

ROS 订阅图像节点

ROS Image 订阅者延迟

ROS2&AI电脑摄像头intel-D435,利用ros2发布订阅图像(Python)

为什么ROS发布者不发布第一条消息?

ROS-4 : ROS节点和主题

ros 发布节点和订阅节点