ROS学习—opencv使用之图片传输

ROS学习—opencv使用之图片传输

前提操作:ros已安装,opencv已安装。
首先在工作空间中新建一个功能包rosopencv

catkin_create_pkg rosopencv sensor_msgs cv_bridge roscpp std_msgs image_transport

编译一下catkin_make,新建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;
  image_transport::ImageTransport it(nh);//用之前声明的节点句柄初始化it
  image_transport::Publisher pub = it.advertise("camera/image", 1);
 
  cv::Mat image = cv::imread("/home/ubuntu/Pictures/dog.jpg", CV_LOAD_IMAGE_COLOR);
  cv::Mat image1 = cv::imread("/home/ubuntu/Pictures/cat.jpg", CV_LOAD_IMAGE_COLOR);
  if(image.empty()||image1.empty())
  {
    
    
    printf("open error\n");
  }
  cv::imshow("",image);
  cv::waitKey(3000);
  //cv::imshow("",image1);
  //cv::waitKey(3000);
  cv::destroyWindow("");
  sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();//图像格式转换
  //sensor_msgs::ImagePtr msg1 = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image1).toImageMsg();
 
  ros::Rate loop_rate(1);//每秒1帧
  while (nh.ok()) 
  {
    
    
    pub.publish(msg);
    //sleep(0.5);
    //pub.publish(msg1);
    ros::spinOnce();
    loop_rate.sleep();
  }
}

代码很简单,注释的几句是实现两张图片切换发送的功能,可以去除注释。
在CMake文件添加

find_package(OpenCV REQUIRED)#注意此处的REQUIRED,没有编译会报错
include_directories(${
    
    catkin_INCLUDE_DIRS} ${
    
    OpenCV_INCLUDE_DIRS})
add_executable(rosopencv ./src/rosopencv.cpp)
target_link_libraries(rosopencv ${
    
    OpenCV_LIBS})
target_link_libraries(rosopencv ${
    
    catkin_LIBRARIES})

下面是接收的程序,新建接收功能包,并且接收的cmake文件修改与上述类似改之。
catkin_create_pkg recieve sensor_msgs cv_bridge roscpp std_msgs image_transport

#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)
{
    
    
  cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
  cv::waitKey(400);
}
 
int main(int argc, char **argv)
{
    
    
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;
  image_transport::ImageTransport it(nh);
  image_transport::Subscriber sub = it.subscribe("camera/image", 1, imageCallback);
  ros::spin();
}

效果,两张图片切换发送与显示
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44859952/article/details/111592010