rosbag_to_video_cpp

#include <ros/ros.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;

cv::VideoWriter video_out("/home/uav/catkin_ws/src/ros_bag_to_video_cpp/src/out.avi",CV_FOURCC('M','J','P','G'),10, cv::Size(640,480),true);


void imagecompressedCallback(const sensor_msgs::CompressedImageConstPtr& msg)
{
  try
  {
    cv::Mat image = cv::imdecode(cv::Mat(msg->data),1);//convert compressed image data to cv::Mat
    cv::imshow("view", image);
    video_out.write(image);
    cv::waitKey(10);
  }
  catch (cv_bridge::Exception& e)
  {
    ROS_ERROR("Could not convert to image!");
  }
}

int main(int argc, char **argv)
{
  ros::init(argc, argv, "image_listener");
  ros::NodeHandle nh;//管理内部的引用计数,如果内部节点没有开始,ros::NodeHandle会开始节点
  cv::namedWindow("view");//新建一个显示窗口。可以指定窗口的类型。
  cv::startWindowThread();//“及时刷新窗口”,且该函数的优先级高于cv::waitKey()。
  ros::Subscriber sub = nh.subscribe("/raspicam_node/image/compressed", 1, imagecompressedCallback);//声明了一个ros::Subscriber类的对象sub,调用了nh.subscribe作为构造函数,这个构造函数有三个形参,第一个形参表示要订阅的主题名,第二个形参表示队列的容量,第三个形参是指向回调函数的指针,代表着发生事件后的响应函数,注意不要在函数名后面加括号()。
  ros::spin();//ROS消息回调处理函数,通常会出现在ROS的主循环中。ros::spin() 在调用后不会再返回,也就是你的主程序到这儿就不往下执行了
  cv::destroyWindow("view");//关闭特定窗口
}

转自链接:https://github.com/snakehaihai/rosbag_to_video_cpp/blob/master/ros_bag_to_video_cpp/src/out.avi

发布了23 篇原创文章 · 获赞 3 · 访问量 616

猜你喜欢

转载自blog.csdn.net/weixin_43042467/article/details/103864100
cpp