#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