Adaptive video frame extraction for Structure from Motion, Gaussian Splatting, photogrammetry, and related 3D reconstruction workflows.
Frame Extractor turns video into image sequences for reconstruction pipelines such as COLMAP and Gaussian Splatting.
Unlike conventional fixed-interval extraction, it can select keyframes dynamically based on camera motion. This reduces redundant images when the camera is stationary or moving slowly, while extracting frames more frequently during fast movement or rotation.
The result is a smaller, more useful image set with better overlap between neighboring views.

A typical video-to-SfM workflow extracts every Nth frame:
Video → every 10th frame → images → SfM / Gaussian Splatting
The problem is that camera motion is rarely constant.
When the camera stops or moves slowly, fixed sampling creates many nearly identical images. When it moves or rotates quickly, the same interval may leave too much change between frames, making feature matching and pose recovery harder.
Frame Extractor adapts the spacing automatically:
Slow motion: ● ● ●
Fast motion: ● ● ● ● ● ● ● ●
Frame Extractor is written in C++20 and is designed to be fast and easy to use without requiring Python or command-line setup.
The current test release is v0.2.0-rc.2:
See GitHub Releases for all available versions.
These builds are not yet production-signed releases. On macOS, you may need to right-click the application and select Open the first time.
macOS is currently the primary tested platform. Windows and Linux builds are also covered by automated tests.
For adaptive extraction, Low, Medium, and High control how densely keyframes are selected.
You can also navigate frame-by-frame and use Extract to save individual frames manually.
Each run creates a timestamped directory containing the extracted images and metadata:
20260827_120000/
config.yaml
keyframes.csv
summary.txt
keyframes/
keyframe_0000_000000.jpg
keyframe_0001_000037.jpg
...
A CLI is included for scripted workflows:
./build/release/frame-extractor input.mp4 --output-dir output
Run the following for all available options:
./build/release/frame-extractor --help
Frame Extractor uses C++20, CMake, FFmpeg, OpenCV, SDL3, Dear ImGui, yaml-cpp, and Catch2.
See the development guide for complete build instructions for macOS, Windows, and Ubuntu Linux. Maintainer packaging and release details are in the release guide.
Frame Extractor is released under the MIT License. Distributed packages also contain third-party software covered by the third-party notices.
Bug reports and contributions are welcome. See CONTRIBUTING.md. Please report suspected security vulnerabilities privately as described in SECURITY.md.
4 commits
C++
89.6%
CMake
8.6%
Shell
1.6%
Adaptive video frame extraction for Structure from Motion, Gaussian Splatting, photogrammetry, and related 3D reconstruction workflows.
Frame Extractor turns video into image sequences for reconstruction pipelines such as COLMAP and Gaussian Splatting.
Unlike conventional fixed-interval extraction, it can select keyframes dynamically based on camera motion. This reduces redundant images when the camera is stationary or moving slowly, while extracting frames more frequently during fast movement or rotation.
The result is a smaller, more useful image set with better overlap between neighboring views.

A typical video-to-SfM workflow extracts every Nth frame:
Video → every 10th frame → images → SfM / Gaussian Splatting
The problem is that camera motion is rarely constant.
When the camera stops or moves slowly, fixed sampling creates many nearly identical images. When it moves or rotates quickly, the same interval may leave too much change between frames, making feature matching and pose recovery harder.
Frame Extractor adapts the spacing automatically:
Slow motion: ● ● ●
Fast motion: ● ● ● ● ● ● ● ●
Frame Extractor is written in C++20 and is designed to be fast and easy to use without requiring Python or command-line setup.
The current test release is v0.2.0-rc.2:
See GitHub Releases for all available versions.
These builds are not yet production-signed releases. On macOS, you may need to right-click the application and select Open the first time.
macOS is currently the primary tested platform. Windows and Linux builds are also covered by automated tests.
For adaptive extraction, Low, Medium, and High control how densely keyframes are selected.
You can also navigate frame-by-frame and use Extract to save individual frames manually.
Each run creates a timestamped directory containing the extracted images and metadata:
20260827_120000/
config.yaml
keyframes.csv
summary.txt
keyframes/
keyframe_0000_000000.jpg
keyframe_0001_000037.jpg
...
A CLI is included for scripted workflows:
./build/release/frame-extractor input.mp4 --output-dir output
Run the following for all available options:
./build/release/frame-extractor --help
Frame Extractor uses C++20, CMake, FFmpeg, OpenCV, SDL3, Dear ImGui, yaml-cpp, and Catch2.
See the development guide for complete build instructions for macOS, Windows, and Ubuntu Linux. Maintainer packaging and release details are in the release guide.
Frame Extractor is released under the MIT License. Distributed packages also contain third-party software covered by the third-party notices.
Bug reports and contributions are welcome. See CONTRIBUTING.md. Please report suspected security vulnerabilities privately as described in SECURITY.md.
4 commits
C++
89.6%
CMake
8.6%
Shell
1.6%