ros使用opencv发布图片消息

 

目录

1.工作空间的创建

2. 编辑主函数代码

3 编辑 CmakeLists.txt

4 编译和运行

5.rviz 中显示

6. 从命令行传参发布指定图片


1.工作空间的创建

新建一个功能包叫 rosopencv,并进行初始化;

catkin_create_pkg rosopencv cv_bridge image_transport roscpp sensor_msgs std_msgs

2. 编辑主函数代码

主函数 rosopencv.cpp 内容如下:

#include 
#include 
#include 
#include 

#include 

int main(int argc, char** argv)
{
  ros::init(argc, argv, "image_publisher");
  ros::NodeHandle nh;
  image_transport::ImageTransport it(nh);
  image_transport::Publisher pub=it.advertise("camera/image",1);

  cv::Mat image = cv::imread("/home/zhitong/hi.jpeg", CV_LOAD_IMAGE_COLOR);
    if(image.empty()){
        printf("open error\n"); }
    sensor_msgs::ImagePtr msg=cv_bridge::CvImage(std_msgs::Header(),"bgr8",image).toImageMsg();
    ros::Rate loop_rate(5);
    while(nh.ok()){
        pub.publish(msg);
        ros::spinOnce;
        loop_rate.sleep();
    }
}

3 编辑 CmakeLists.txt

set(OpenCV_DIR /usr/local/share/OpenCV)

message(STATUS "version: ${OpenCV_VERSION}")

find_package(OpenCV REQUIRED)

add_executable(rosopencv src/rosopencv.cpp)

include_directories(${OpenCV_INCLUDE_DIRS})

target_link_libraries(rosopencv ${OpenCV_LIBS})

target_link_libraries(rosopencv ${catkin_LIBRARIES})

4 编译和运行

cd ~/dev/workspace/rosopencv

catkin_make

可运行代码:

rosrun rosopencv rosopencv

输入代码:

rostopic echo /camera/image

此时可以看到输出全是数字。

 

ros使用opencv发布图片消息_第1张图片

5.rviz 中显示

运行代码:

rosrun rviz rviz

左边点击 add,选中 image ,在 image 的 topic 选项中选 /camera/image,可以看到程序 中需要读取的本地电脑中的指定图片,如图所示:

ros使用opencv发布图片消息_第2张图片

6. 从命令行传参发布指定图片

代码:

   #include 
   #include 
   #include 
   #include 
     
   int main(int argc, char** argv){
      ros::init(argc, argv, "image_publisher");
      ros::NodeHandle nh;
      image_transport::ImageTransport it(nh);
      image_transport::Publisher pub = it.advertise("camera/image", 1);
      cv::Mat image = cv::imread(argv[1], CV_LOAD_IMAGE_COLOR);
      cv::waitKey(30);
      sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
      ros::Rate loop_rate(5);
      while (nh.ok()) {
        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
      }
  }

运行代码前话题列表:

ros使用opencv发布图片消息_第3张图片

运行程序指令:

rosrun rosopencv1 rosopencv1 /home/zhong/2.jpg

运行后话题列表:

ros使用opencv发布图片消息_第4张图片

然后我们还像原来一样打开rviz,已经看到新的图片显示出来了。

ros使用opencv发布图片消息_第5张图片

参考:

https://blog.csdn.net/weixin_39652282/article/details/116917514

 

 

 

你可能感兴趣的:(ros机器人,ros,opencv)