motion-sampler
Motion Sampler Skill
Version: 1.0 Type: Video Frame Extraction Purpose: Extract representative frame samples from dashcam videos to understand motion and trajectory without storing full videos
Overview
The Motion Sampler extracts frames at regular intervals from dashcam videos to create a compact visual summary of vehicle movement and location changes. This achieves 90-95% storage reduction compared to keeping original videos while preserving spatial and temporal context.
Use Cases
- Motion trajectory analysis - Understand vehicle path through a sequence of locations
- Storage optimization - Reduce dashcam archive size by 90%+ while retaining visual record
- Quick visual review - Browse through hours of footage via representative frames
- Location identification - Identify where vehicle was at specific times
- Event timeline - Create visual timeline of trips without watching full videos
Natural Language Interface
Use natural language to request frame extraction:
Example Requests:
Extract frames every 10 seconds from all Movie_F videos in the CARDV folder.
Sample frames from Movie_R dashcam videos, one frame every 15 seconds.
Create motion samples for all parking camera videos with 5-second intervals.
Extract representative frames from Movie_F and Movie_R for July 27-29, 2025.
Parameters
Required
-
camera (string): Camera type to process
- Options:
Movie_F,Movie_R,Park_F,Park_R, orall - Default:
Movie_F
- Options:
-
source_dir (path): Root directory containing camera folders
- Example:
C:\Users\yousu\Desktop\CARDV
- Example:
Optional
-
sample_interval (float): Seconds between extracted frames
- Range: 1.0 - 60.0
- Default: 10.0
- Examples: 5.0 (dense sampling), 15.0 (sparse sampling)
-
output_dir (path): Where to save extracted frames
- Default:
{source_dir}/MOTION_SAMPLES
- Default:
-
jpeg_quality (int): JPEG compression quality
- Range: 50 - 100
- Default: 92 (visually lossless)
- Lower = smaller files, slightly reduced quality
-
max_workers (int): Parallel processing threads
- Range: 1 - 8
- Default: 4
- Higher = faster but more CPU usage
-
date_filter (string): Only process videos from specific date(s)
- Format:
YYYYMMDDorYYYYMMDD-YYYYMMDD(range) - Example:
20250727or20250727-20250729
- Format:
-
min_duration (float): Skip videos shorter than this (seconds)
- Default: 3.0
Advanced (Future GPU Enhancement)
-
use_nvdec (bool): Use NVIDIA hardware decoding
- Default: false (CPU-only in v1.0)
- Future: true for 3-5x speedup
-
gpu_id (int): CUDA device ID if multiple GPUs
- Default: 0
Output Format
Directory Structure
{output_dir}/
├── INDEX.csv # Comprehensive metadata
├── 20250727150654_052278A_F001_001000ms.jpg # Frame 1 at 1s
├── 20250727150654_052278A_F002_011000ms.jpg # Frame 2 at 11s
├── 20250727150654_052278A_F003_021000ms.jpg # Frame 3 at 21s
└── ...
Filename Format
{YYYYMMDDHHMMSS}_{FILEIDA/B}_{POSITION}_{TIMESTAMP_MS}ms.jpg
Example: 20250727150654_052278A_F003_021000ms.jpg
└─────┬─────┘ └──┬──┘ └┬┘ └───┬───┘
Date/Time FileID Pos Timestamp
Components:
- YYYYMMDDHHMMSS: Video start time
- FILEIDA/B: Camera file ID + suffix (A=front, B=rear)
- F###: Frame position (F001, F002, F003...)
- ######ms: Milliseconds into video
INDEX.csv Schema
original_video,frame_file,camera,date,position,timestamp_ms,timestamp_s,frame_number,file_size_kb
20250727150654_052278A.MP4,20250727150654_052278A_F001_001000ms.jpg,Movie_F,20250727,F001,1000,1.0,24,1713.06
Columns:
original_video: Source MP4 filenameframe_file: Extracted JPEG filenamecamera: Camera type (Movie_F/Movie_R/Park_F/Park_R)date: YYYYMMDDposition: Frame position (F001, F002...)timestamp_ms: Milliseconds into videotimestamp_s: Seconds into videoframe_number: Frame number in video (at 24fps)file_size_kb: JPEG file size in KB
Performance Metrics
Current (CPU-only v1.0)
- Throughput: 6-8 videos/second (4 workers, Intel i7/i9)
- Speedup: 4x with multi-threading
- Memory: ~500 MB
- GPU Usage: 0% (CPU-only)
Projected (GPU-accelerated v2.0)
- Throughput: 20-30 videos/second (NVDEC + multi-threading)
- Speedup: 10-15x vs single-threaded CPU
- Memory: ~1-2 GB
- GPU Usage: 30-50% (NVDEC decoder only)
Storage Examples
Input: 418 Movie_F/R videos, 60s avg, ~45 GB total
| Interval | Frames/Video | Total Frames | Storage | Reduction |
|---|---|---|---|---|
| 5s | 12 | 5,016 | 9 GB | 80% |
| 10s | 7 | 2,926 | 5 GB | 89% |
| 15s | 5 | 2,090 | 3.7 GB | 92% |
| 30s | 3 | 1,254 | 2.2 GB | 95% |
Assumes 1.7 MB per frame average at 4K resolution
Algorithm Details
Frame Sampling Strategy
For each video:
- Skip buffer zones: Start at 1.0s, end at duration-1.0s (avoids black frames)
- Calculate sample timestamps: Every N seconds starting from 1.0s
- Always include end frame: Last frame at duration-1.0s
- Example for 60s video, 10s interval:
- F001: 1s, F002: 11s, F003: 21s, F004: 31s, F005: 41s, F006: 51s, F007: 59s
Pseudo-code
timestamps = []
current_time = 1.0 # start offset
while current_time < (duration - 1.0):
timestamps.append(current_time)
current_time += sample_interval
timestamps.append(duration - 1.0) # always include end
Error Handling
Automatic Handling
- Short videos (<3s): Skipped with warning
- Corrupted files: Logged as error, processing continues
- Unreadable frames: Frame skipped, next frame attempted
- Disk full: Graceful termination with partial results saved
Error Messages
SKIP: video.MP4 too short (2.1s)
ERROR: Cannot open corrupted_video.MP4
WARNING: Failed to read frame 120 from video.MP4
Example Usage
Request 1: Standard Extraction
Use the motion-sampler skill to extract frames every 10 seconds from all Movie_F videos
in C:\Users\yousu\Desktop\CARDV. Save to MOTION_SAMPLES folder.
Execution:
- Camera: Movie_F
- Source: C:\Users\yousu\Desktop\CARDV\Movie_F\
- Output: C:\Users\yousu\Desktop\CARDV\MOTION_SAMPLES\
- Interval: 10.0s
- Quality: 92
Request 2: Dense Sampling for Specific Date
Extract frames every 5 seconds from Movie_R videos on July 27, 2025.
Execution:
- Camera: Movie_R
- Date filter: 20250727
- Interval: 5.0s
- Only processes videos matching
20250727*.MP4
Request 3: Sparse Sampling for Long-term Archive
Create motion samples with 30-second intervals for all parking cameras (Park_F and Park_R)
to minimize storage while keeping a visual record.
Execution:
- Camera: Park_F, Park_R (both)
- Interval: 30.0s
- Expected: ~3 frames per 60s video
- Storage: Minimal (~1-2 GB for thousands of videos)
Troubleshooting
Issue: Processing Very Slow
Solution: Increase max_workers to 6-8 (if you have 8+ CPU cores)
Issue: Large Output Size
Solution: Reduce jpeg_quality to 85 or increase sample_interval to 15-20s
Issue: Missing Some Videos
Cause: Videos shorter than min_duration (default 3s) are skipped
Solution: Lower min_duration to 1.0s if you need very short clips
Issue: Out of Memory
Cause: Too many parallel workers on low-RAM system
Solution: Reduce max_workers to 2
Future Enhancements (v2.0 Roadmap)
GPU Acceleration
- NVDEC hardware video decoding (5-10x speedup)
- GPU-accelerated JPEG encoding
- Multi-GPU support for massive archives
- Automatic GPU/CPU fallback
Advanced Features
- Smart sampling (detect motion, skip static scenes)
- Face/person detection integration
- GPS overlay preservation
- Thumbnail strip generation
- Web viewer for browsing samples
Optimization
- Incremental processing (skip already-processed videos)
- Resume from interruption
- S3/cloud storage output
- Real-time progress dashboard
Technical Dependencies
Required
- Python 3.8+
- opencv-python (cv2) >= 4.8
- numpy >= 1.24
- pandas >= 2.0 (for INDEX.csv)
Optional (for future GPU support)
- cuda >= 11.0
- opencv-contrib-python (CUDA build)
File Locations
G:\My Drive\PROJECTS\skills\motion-sampler\
├── skill.md # This file
├── README.md # Quick start guide
├── SKILL_MANIFEST.md # File inventory & testing
├── scripts/
│ ├── extract_motion_samples.py # Main extraction script
│ └── analyze_results.py # Post-processing analysis
├── assets/
│ ├── config_template.json # Default configuration
│ └── camera_mapping.json # Camera ID mapping
└── references/
├── SAMPLING_ALGORITHM.md # Detailed algorithm docs
└── PERFORMANCE_BENCHMARKS.md # Speed/storage benchmarks
JSON API Contract
For programmatic invocation:
{
"camera": "Movie_F",
"source_dir": "C:\\Users\\yousu\\Desktop\\CARDV",
"output_dir": "C:\\Users\\yousu\\Desktop\\CARDV\\MOTION_SAMPLES",
"sample_interval": 10.0,
"jpeg_quality": 92,
"max_workers": 4,
"date_filter": null,
"min_duration": 3.0,
"use_nvdec": false
}
Response:
{
"status": "success",
"videos_processed": 2146,
"frames_extracted": 15022,
"total_size_mb": 26750.5,
"avg_frames_per_video": 7.0,
"processing_time_s": 305.2,
"throughput_videos_per_sec": 7.03,
"output_dir": "C:\\Users\\yousu\\Desktop\\CARDV\\MOTION_SAMPLES",
"index_file": "C:\\Users\\yousu\\Desktop\\CARDV\\MOTION_SAMPLES\\INDEX.csv"
}
License & Attribution
Part of the dashcam analysis suite. Designed for personal dashcam archive management and motion trajectory analysis.