How to extract images from a rosbag file and convert them to video
UPDATE (June 2014): bag_tools ROS package includes a node called make_video.py which converts images inside a bag file into a video, similar to the manual workflow described in this post.
Pre-requirements
The methods described below has been tested using ROS Fuerte on a 64bit Ubuntu 12.04 machine. However it should work fine on ROS Electric and/or other Linux distros.
- A rosbag file with an image topic inside it
- MJPEG Tools [Ubuntu:
sudo apt-get install mjpegtools
] - ffmpeg [Ubuntu:
sudo apt-get install ffmpeg
] or - mencoder [Ubuntu:
sudo apt-get install mencoder
] prefered
Extract the images
- Create a folder for the extracted images and
cd
in there. - Execute
rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE>
- On the other terminal window, run
rosbag play <BAGFILE>
- A sequence of images will be created.
You can check if the number of frames created is the same as the number of messages in the .bag file using rosbag info
command. If the number is less, decrease the _sec_per_frame
value.
Note: The images have been named using this printf style pattern: frame%04d.jpg
Making the video file (Mencoder)
Determine the fps of the rosbag file. Use
rosbag info
, then divide number of messages for image topic by the duration (in seconds). This step is very important.Use this
mencoder
command in the folder you stored the images:
mencoder -nosound mf://*.jpg -mf w=<WIDTH>:h=<HEIGHT>:type=jpg:fps=<FPS> \
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=<BITRATE>\
:mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o\
<OUTPUT>.avi
For the <FPS>
use the number obtained in step 1, for the <BITRATE>
check the Notes section below.
Making the video file (FFMPEG)
Determine the FPS of the rosbag file. Use
rosbag info
, then divide number of messages for image topic by the duration (in seconds). This step is very important.Use this command
ffmpeg
command in the folder you stored the images:
ffmpeg -r <FPS> -b <BITRATE> -i frame%04d.jpg <OUTPUT>.avi
For the <FPS>
use the number obtained in step 1, for the <BITRATE>
check the Notes section below.
Notes
BITRATE determines the quality. For ffmpeg use KiloBytes/Sec, for mencoder use KiloBits/Sec (e.g 2400 Kbps vs 300 KBps). Numbers greater that 1800 KBits usually works fine.
The resulting video file will be a MPEG4 encoded AVI file.
References
Written by Mani Monajjemi
Related protips
5 Responses
It's mjpegtools, not mjpeg-tools.
@ecuzzillo Thanks, edited.
I am using ROS hydro Ubuntu 12.04 and I'm having an error when running"ffmpeg -r <FPS> -b <BITRATE> -i frame%04d.jpg <OUTPUT>.avi" The thing is I am not seeing the sequence of images.I ran rosbag info <BAGFILE> to obtain the topic in the bag file but when I run "rosrun rqtgraph rqtgraph" the /extract_image frame node is there all by itself.It's getting messy.What am I doing wrong?
@leyonce Does the extract_image
step work? I will test the method on Hydro/12.04 soon and will update this guide if needed.
Hi,
I am getting below error and I am using ROS-kinetic.
terminate called after throwing an instance of 'imagetransport::TransportLoadException'
what(): Unable to load plugin for transport '/home/user/Videos/Recordedvideo/image2.bag', error string:
According to the loaded plugin descriptions the class imagetransport//home/user/Videos/Recordedvideo/image2.bagsub with base class type imagetransport::SubscriberPlugin does not exist. Declared types are imagetransport/compressedDepthsub imagetransport/compressedsub imagetransport/rawsub imagetransport/theorasub
Aborted (core dumped)