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 <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);
  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

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

 

5.rviz 中显示

运行代码:

rosrun rviz rviz

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

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

代码:

   #include <ros/ros.h>
   #include <image_transport/image_transport.h>
   #include <opencv2/highgui/highgui.hpp>
   #include <cv_bridge/cv_bridge.h>
     
   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();
      }
  }

运行代码前话题列表:

运行程序指令:

rosrun rosopencv1 rosopencv1 /home/zhong/2.jpg

运行后话题列表:

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

参考:

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

 

 

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen953

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值