yair-mv 8fece16ca7 Add timestamp overlay feature for video mode
- Add --timestamp / --ts flag to embed frame count on bottom left corner
- Implement add_timestamp_overlay() function with large, visible text
- Yellow text on black background for good visibility
- Shows 'Frame: X/Y' format with current and total frame counts
- Works with both column and row video modes
- Applied after rotation for proper positioning
- Update documentation with timestamp examples and parameter descriptions
- Tested successfully with sample video files
2025-11-08 12:26:11 +02:00
2025-11-04 11:46:12 +02:00
2025-11-02 10:40:57 +02:00
2025-11-02 10:45:11 +02:00
2025-10-26 10:12:28 +02:00
2025-10-26 10:12:28 +02:00

Strip Photography / Slit Photography

A digital implementation of strip photography (also called slit photography) that captures a two-dimensional image as a sequence of one-dimensional images over time.

demo

Strip photography records a moving scene over time by extracting the same line position from each video frame and assembling them into a composite image where:

  • One axis represents space (the slit/line being observed)
  • The other axis represents time (progression through video frames)
  • Moving objects appear as visible shapes, stationary objects as stripes
  • Object width is inversely proportional to speed (faster = narrower, slower = wider)

Usage

Basic Usage - Uses smart defaults (yrow=8, auto output to results/):

uv run main.py .\line500fps32pix.mp4

Output: results/line500fps32pix_a3f2_t0_01.jpg (auto-generated with UUID and threshold)

Row Mode - Extract horizontal lines with custom settings:

uv run main.py .\line500fps32pix.mp4 --yrow 16 --threshold 0.005

With Relax - Include extra frames around threshold frames for smoother transitions:

uv run main.py .\line500fps32pix.mp4 --relax 5
# or use default relax value (100):
uv run main.py .\line500fps32pix.mp4 --relax

Video Mode - Generate MJPEG video showing accumulated scan lines over time:

uv run main.py .\line500fps32pix.mp4 --video --fps 30

Output: results/video/line500fps32pix_a3f2_t0_01_fps30_0.avi

Video with Timestamp - Add frame count overlay to video:

uv run main.py .\line500fps32pix.mp4 --video --fps 30 --timestamp

Debug Mode - Analyze changes and generate threshold recommendations:

uv run main.py .\line500fps32pix.mp4 --debug

Output: results/debug/line500fps32pix_7c91_t0_01_changes.png debug view

Debug mode generates PowerShell commands to test all suggested thresholds:

0.0087,0.0098,0.0112,0.0121,0.0159 | %{uv run .\main.py video.mp4 --threshold $_}

Setup

Install dependencies with uv:

uv sync

Parameters

Required

  • video_file - Path to input video file

Optional

  • --xcolumn N - Extract vertical line at x-coordinate (column mode)
  • --yrow N - Extract horizontal line at y-coordinate (row mode, default: 8)
  • --output PATH - Output file path (default: auto-generated to results/ with UUID)
  • --threshold N - Change threshold 0-1 for frame inclusion (default: 0.01)
  • --relax [N] - Include N extra frames before/after threshold frames (default: 0, or 100 if flag used without value)
  • --debug - Analyze changes without creating strip image, outputs to results/debug/
  • --video - Generate MJPEG video showing accumulated scan lines over time
  • --fps N - Output video frame rate (default: 30.0, only used with --video)
  • --timestamp / --ts - Embed frame count on bottom left corner (video mode only)
  • --timeline - Overlay frame numbers as timeline/ruler on output image (image mode only)
  • --start N - Start frame number (0-based, default: 0)
  • --end N - End frame number (0-based, default: last frame)

Output Modes

  • Image mode (default): Creates static strip photography image
    • Column mode: Extracts vertical line (--xcolumn) → Width = frames, Height = video height
    • Row mode: Extracts horizontal line (--yrow, default) → Rotated 90° CW for proper orientation
  • Video mode (--video): Creates MJPEG video showing scan line accumulation over time
    • Each frame shows accumulated scan lines up to that point in time
    • Final frame shows complete strip photography image
    • Video dimensions automatically determined by input video and number of significant frames

Features

Smart Defaults:

  • Defaults to row mode at y=8 if no mode specified
  • Auto-generates output filename with UUID and threshold: results/video_a3f2_t0_01.jpg
  • Automatically appends .jpg extension if none provided
  • Row mode output is rotated 90° clockwise for proper viewing

Change Detection: Automatically filters frames with minimal changes using configurable thresholds

  • Use --threshold (0-1) to control sensitivity
  • --debug mode provides threshold recommendations and change analysis
  • Higher thresholds = more compression, fewer frames

Relax Feature: Include extra frames around significant changes for smoother transitions

  • --relax 5 includes 5 frames before/after each threshold frame
  • --relax without value defaults to 100 frames

Threshold Guide:

  • 0.001-0.005: High sensitivity (10-30% compression)
  • 0.005-0.02: Medium sensitivity (30-70% compression)
  • 0.02+: Low sensitivity (70%+ compression)

Output Organization:

  • Image mode: results/ folder
  • Video mode: results/video/ folder
  • Debug mode: results/debug/ folder

Video Mode Features:

  • Creates MJPEG AVI files showing scan line accumulation over time
  • Each video frame shows the progressive build-up of the strip photography effect
  • Configurable frame rate with --fps parameter
  • Optional timestamp overlay with --timestamp / --ts showing frame count in bottom left corner
  • Video dimensions automatically calculated based on input video and scan line count
  • Compatible with both row and column extraction modes
  • Timeline overlay not supported in video mode (use image mode with --timeline instead)
Description
No description provided
Readme 1.9 MiB
Languages
Python 100%