То, что вы хотите, довольно просто, можете загрузить сумку для меня, чтобы посмотреть ??Я могу помочь дать вам простой узел для получения данных
Если вы хотите попробовать сами, следуйте приведенным ниже инструкциям.
Сначала вы должны убедиться, что в сумке есть действительные данные и действительная упаковка.Например, данные не повреждены или связанный с OCV пакет segfault
Во-вторых, выясните тип изображения.это sensor_msgs Изображение или сжатое изображение.Есть разница при конвертации
В-третьих, наименее вероятно, но вы уверены, что opencv imwrite правильно работает в ROS?У меня была забавная ошибка ввода-вывода и графического интерфейса пользователя раньше, когда я использовал свой собственный opencv, связанный с ros.
РЕДАКТИРОВАТЬ
используйте пакет ros ниже.
https://github.com/snakehaihai/rosbag_to_video_cpp
Я уже создал один пакет для вас.а у тебя видео в
https://github.com/snakehaihai/rosbag_to_video_cpp/blob/master/ros_bag_to_video_cpp/src/out.avi
#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("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;
cv::namedWindow("view");
cv::startWindowThread();
ros::Subscriber sub = nh.subscribe("/raspicam_node/image/compressed", 1, imagecompressedCallback);
ros::spin();
cv::destroyWindow("view");
}