Important
Repository Archived
This repository has been archived and is no longer actively maintained. You are welcome to explore the code, but please note that no further updates, issues, or pull requests will be accepted.
Thank you for your interest and contributions.
Given a GoPro movie with metadata (gpmf format), the application extracts images with the given framerate and interpolates the GPS coordinates, speed, accelerometer, gyro, and any other desired metadata.
- Boost (for filesystem stuff):
$ sudo apt install libboost-all-dev
-
Opencv3: Link
-
libyaml-cpp for yaml file creation and parsing: Link:
-
Ubuntu 16.04 (apt-get installs v0.5.2):
$ sudo apt-get install libyaml-cpp-dev
-
Ubuntu 14.04 (apt-get installs v0.5.1 which does not contain yaml-cpp-config.cmake):
$ git clone https://github.com/jbeder/yaml-cpp.git $ cd yaml-cpp/ $ mkdir build $ cd build/ $ cmake .. $ make -j $ sudo make install
-
This code uses the gpmf-parser so that submodule has to be cloned into its folder (../gpmf-parser):
$ git submodule init
$ git submodule update
After that we can compile and run the script, which parses the metadata in video.mp4 at a frame rate of 3fps, and it saves images and yaml file to folder /tmp/output:
$ cd img_gps_extractor
$ mkdir build && cd build
$ cmake ..
$ make -j
$ ./img_gps_extractor -i video.mp4 -f 3 -o /tmp/output
As a design choice, the GoPro never saves videos bigger than 4Gb (not even when SD is extFat). If a video is bigger than this, it splits it into sub videos, with a sort of complicated way to handle the metadata. If this is the case, use the -d option, instead of the -i option.
The following example gets all the videos that correspond to one video in the folder /tmp/input and it deals with everything so that you don't have to merge them externally (not even ffmpeg is currently able to merge gopro videos keeping the metadata):
$ ./img_gps_extractor -d /tmp/input -f 3 -o /tmp/output
The directory should look something like this:
$ tree /tmp/input
/tmp/input
├── GOPRXXXX.MP4
├── GP01XXXX.MP4
└── GP02XXXX.MP4
The only check that we do is for the .MP4 extension and then we order in alphabetical order to recover the order structure, so don't rename the files please :)
This is temporary, but it gives an idea of how the final one will look like:
- ts is timestamp in seconds
- gps is:
- lat (degrees)
- long (degrees)
- altitude (meters)
- 2D earth speed magnitude (m/s)
- 3D speed magnitude (m/s)
000000.jpg: # Original File: /tmp/input/GOPRXXXX.MP4, Frame rate: 0.020000
ts: 0
gps:
lat: 50.72745
long: 7.087335
alt: 121.54
2dv: 0.061
3dv: 0.11
000001.jpg:
ts: 50.00829
gps:
lat: 50.72681
long: 7.088741
alt: 117.3692
2dv: 7.321869
3dv: 7.33
000002.jpg: # Original File: /tmp/input/GP01XXXX.MP4, Frame rate: 0.020000 (-< when the video it was taken from changes, we comment!)
ts: 99.99573
gps:
lat: 50.7245
long: 7.09001
alt: 91.91341
2dv: 7.956978
3dv: 7.976304
To parse the yaml file from python:
import yaml
with open("metadata.yaml", 'r') as stream:
data= yaml.load(stream)
data['000001.jpg']['gps']['lat'] #latitude gps of image 000001.jpg
data['000034.jpg']['ts'] #timestamp for image 000034.jpg
-
Only gps extraction is implemented so far. More metadata extraction will be added.
-
Libraries used: