Examples#

Working scripts in examples/.

basic_usage.py#

#!/usr/bin/env python3
"""Basic usage example for PanoOCR.

This script demonstrates the simplest way to run OCR on a panorama image.

Usage:
    python basic_usage.py path/to/panorama.jpg

Prerequisites:
    pip install "panoocr[macocr]"  # For macOS
    # or
    pip install "panoocr[easyocr]"  # For cross-platform
"""

import sys
from pathlib import Path


def main():
    if len(sys.argv) < 2:
        print("Usage: python basic_usage.py <panorama_image>")
        print("\nExample:")
        print("  python basic_usage.py panorama.jpg")
        sys.exit(1)

    image_path = Path(sys.argv[1])
    if not image_path.exists():
        print(f"Error: File not found: {image_path}")
        sys.exit(1)

    # Import panoocr
    from panoocr import PanoOCR, PerspectivePreset

    # Try to import an OCR engine (prefer MacOCR on macOS, fall back to EasyOCR)
    engine = None

    try:
        from panoocr.engines.macocr import MacOCREngine

        print("Using MacOCR engine (Apple Vision Framework)")
        engine = MacOCREngine()
    except ImportError:
        pass

    if engine is None:
        try:
            from panoocr.engines.easyocr import EasyOCREngine

            print("Using EasyOCR engine")
            engine = EasyOCREngine()
        except ImportError:
            pass

    if engine is None:
        print("Error: No OCR engine available.")
        print("\nInstall an OCR engine with:")
        print("  pip install 'panoocr[macocr]'  # For macOS")
        print("  pip install 'panoocr[easyocr]'  # For cross-platform")
        sys.exit(1)

    # Create the PanoOCR pipeline
    pano = PanoOCR(
        engine,
        perspectives=PerspectivePreset.DEFAULT,
    )

    # Run OCR
    print(f"\nProcessing: {image_path}")
    result = pano.recognize(str(image_path))

    # Print results
    print(f"\nFound {len(result.results)} text regions:")
    print("-" * 60)

    for i, r in enumerate(result.results, 1):
        print(f"\n[{i}] {r.text}")
        print(f"    Position: yaw={r.yaw:.1f}°, pitch={r.pitch:.1f}°")
        print(f"    Size: {r.width:.1f}° x {r.height:.1f}°")
        print(f"    Confidence: {r.confidence:.2f}")

    # Save results
    output_path = image_path.with_suffix(".ocr.json")
    result.save_json(str(output_path))
    print(f"\nResults saved to: {output_path}")
    print(f"View with: preview/index.html (drag and drop image + JSON)")


if __name__ == "__main__":
    main()

multi_engine.py#

Compare results from different OCR engines on the same panorama.

#!/usr/bin/env python3
"""Multi-engine comparison example for PanoOCR.

This script compares OCR results from different engines on the same panorama.

Usage:
    python multi_engine.py path/to/panorama.jpg

Prerequisites:
    pip install "panoocr[full]"  # Install all engines
"""

import sys
from pathlib import Path
from typing import Dict, Any


def get_available_engines() -> Dict[str, Any]:
    """Get all available OCR engines."""
    engines = {}

    try:
        from panoocr.engines.macocr import MacOCREngine

        engines["macocr"] = MacOCREngine()
    except ImportError:
        print("MacOCR not available (requires macOS)")

    try:
        from panoocr.engines.easyocr import EasyOCREngine

        engines["easyocr"] = EasyOCREngine()
    except ImportError:
        print("EasyOCR not available (pip install 'panoocr[easyocr]')")

    try:
        from panoocr.engines.paddleocr import PaddleOCREngine

        engines["paddleocr"] = PaddleOCREngine()
    except ImportError:
        print("PaddleOCR not available (pip install 'panoocr[paddleocr]')")

    try:
        from panoocr.engines.florence2 import Florence2OCREngine

        engines["florence2"] = Florence2OCREngine()
    except ImportError:
        print("Florence2 not available (pip install 'panoocr[florence2]')")

    return engines


def main():
    if len(sys.argv) < 2:
        print("Usage: python multi_engine.py <panorama_image>")
        print("\nExample:")
        print("  python multi_engine.py panorama.jpg")
        sys.exit(1)

    image_path = Path(sys.argv[1])
    if not image_path.exists():
        print(f"Error: File not found: {image_path}")
        sys.exit(1)

    from panoocr import PanoOCR, PerspectivePreset

    # Get available engines
    print("Detecting available OCR engines...")
    engines = get_available_engines()

    if not engines:
        print("\nError: No OCR engines available.")
        print("Install engines with: pip install 'panoocr[full]'")
        sys.exit(1)

    print(f"\nAvailable engines: {', '.join(engines.keys())}")
    print("=" * 60)

    # Run OCR with each engine
    for name, engine in engines.items():
        print(f"\n[{name.upper()}]")
        print("-" * 40)

        pano = PanoOCR(
            engine,
            perspectives=PerspectivePreset.DEFAULT,
        )

        result = pano.recognize(str(image_path), show_progress=True)

        print(f"Found {len(result.results)} text regions")

        # Show first 5 results
        for i, r in enumerate(result.results[:5], 1):
            text_preview = r.text[:40] + "..." if len(r.text) > 40 else r.text
            print(f"  {i}. {text_preview} (conf: {r.confidence:.2f})")

        if len(result.results) > 5:
            print(f"  ... and {len(result.results) - 5} more")

        # Save results
        output_path = image_path.with_suffix(f".{name}.json")
        result.save_json(str(output_path))
        print(f"Saved: {output_path}")

    print("\n" + "=" * 60)
    print("Comparison complete!")
    print("\nView results with: preview/index.html")
    print("Drag and drop the panorama image + any JSON results file")


if __name__ == "__main__":
    main()