bag包提取图片以及图片的发布和订阅

ROS进行bag包图片信息提取和图片发布以及订阅时,cmake文件内容。

cmake_minimum_required(VERSION 3.0.2)
project(bag_images)

find_package(catkin REQUIRED COMPONENTS
cv_bridge
roscpp
rospy
sensor_msgs
std_msgs
image_transport
)

find_package(OpenCV REQUIRED)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES bag_images
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)


include_directories(
include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)

add_executable( ima_sub_node src/ima_sub.cpp)
add_executable( ima_pub_node src/ima_pub.cpp)


target_link_libraries(ima_sub_node
  ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}
)
target_link_libraries(ima_pub_node
  ${catkin_LIBRARIES} ${OpenCV_LIBRARIES}
)

bag包的信息提取出图片

#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include "ros/time.h"

//接收bag包发布的信息,提取图片
static const char WINDOW[] = "Image window";
char base_name[256];
ros::Time time1;
double time2;

void imageCallback(const sensor_msgs::Image::ConstPtr &msg)
 {
    ROS_INFO_STREAM("Get Msg");
    time1 = msg->header.stamp;
    time2 = time1.toSec();
    try {
        sprintf(base_name,"/home/h/图像数据包/图像提取2/frame%f.jpg",time2);
        cv::imwrite(base_name, cv_bridge::toCvShare(msg, "bgr8")->image);
        cv::imshow(WINDOW, cv_bridge::toCvShare(msg, "bgr8")->image);
    } 
        catch (cv_bridge::Exception &e) {
        ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
    }
}
int main(int argc, char **argv)
 {
  ros::init(argc, argv, "ima_sub");
  ros::NodeHandle nh;
 cv::namedWindow(WINDOW);

  // 在调用cv::startWindowThread();后,即使没有调用waitKey()函数,图片也依然实时刷新。大家知道,opencv的imshow()函数调用以后,并不立即刷新显示图片,
  // 而是等到waitKey()后才会刷新图片显示,所以我猜测cv::startWindowThread();是新开一个线程实时刷新图片显示。
  cv::startWindowThread();
  image_transport::ImageTransport it(nh);
  image_transport::Subscriber sub = it.subscribe("cam_raw_data1", 10, imageCallback);
  ros::spin();
  cv::destroyWindow(WINDOW);
}

图片的发布

#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <ros/ros.h>
#include "std_msgs/String.h"
#include <sstream>

#include <sensor_msgs/image_encodings.h>
std::stringstream ss;
std_msgs::String msg;

int count = 1;
int main(int argc, char **argv)
{
  ros::init(argc, argv, "image_pub");
  // Convert OpenCV image to ROS message
  ros::NodeHandle node;
  image_transport::ImageTransport transport(node);
  image_transport::Publisher image_pub;
  image_pub = transport.advertise("cam_raw_data", 1000);
  ros::Time time = ros::Time::now();
  ros::Rate rate(10.0);  //10HZ  一秒发布十次
  while (ros::ok())
  {
    ss << "/home/h/图像数据包/图像提取1/frame" << count++ << ".jpg";

    msg.data = ss.str();
    // stringstream.str(std::string())的作用是清空stringstream内部的字符串内容,
    // stringstream.clear()的作用是将该流中所有的状态位复位,将流的状态设置为有效。
    ss.str(std::string());
    ss.clear();
    // Reading an image from the file
    cv::Mat cv_image = cv::imread(msg.data.c_str());
    if (cv_image.empty())
    {
      ROS_INFO("发送的消息:%s", msg.data.c_str());
      ROS_FATAL("Read the picture failed!");
      return -1;
    }
    else
    {
      ROS_INFO("发送的消息:%s", msg.data.c_str());
      ROS_INFO_STREAM("Read the picture successful!");
    }
    cv_bridge::CvImage cvi;
    cvi.header.stamp = time;
    cvi.header.frame_id = "test_image";
    cvi.encoding = "bgr8";
    cvi.image = cv_image;
    sensor_msgs::Image im;
    cvi.toImageMsg(im);

    ROS_INFO_STREAM("publish");
    image_pub.publish(im);
    rate.sleep();
  }
  return 0;
}

图片的订阅

#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include "ros/time.h"

//接收bag包发布的信息,提取图片
static const char WINDOW[] = "Image window";
char base_name[256];
ros::Time time1;
double time2;
int count=0;

void imageCallback(const sensor_msgs::Image::ConstPtr &msg)
{
    ROS_INFO_STREAM("Get Msg");
    time1 = msg->header.stamp;
    time2 = time1.toSec();
    try
    {
        sprintf(base_name, "/home/h/图像数据包/图像提取3/frame%d.jpg", ++count);
        cv::imshow(WINDOW, cv_bridge::toCvShare(msg, "bgr8")->image);
        cv::imwrite(base_name, cv_bridge::toCvShare(msg, "bgr8")->image);
    }
    catch (cv_bridge::Exception &e)
    {
        ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
    }
}
int main(int argc, char **argv)
{
    ros::init(argc, argv, "image_sub");
    ros::NodeHandle nh;
    cv::namedWindow(WINDOW);
    // 在调用cv::startWindowThread();后,即使没有调用waitKey()函数,图片也依然实时刷新。大家知道,opencv的imshow()函数调用以后,并不立即刷新显示图片,
    // 而是等到waitKey()后才会刷新图片显示,所以我猜测cv::startWindowThread();是新开一个线程实时刷新图片显示。
    cv::startWindowThread();
    image_transport::ImageTransport it(nh);
    image_transport::Subscriber sub = it.subscribe("cam_raw_data", 1000, imageCallback);
    ros::spin();
    cv::destroyWindow(WINDOW);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值