panorai


Namepanorai JSON
Version 1.4.3 PyPI version JSON
download
home_pagehttps://github.com/RobinsonGarcia/PanorAi
SummaryA Python package for panoramic image projection and blending using Gnomonic (and other) projections.
upload_time2025-02-19 19:41:39
maintainerNone
docs_urlNone
authorRobinson Luiz Souza Garcia
requires_python>=3.7
licenseMIT
keywords panorama image processing projection gnomonic computer vision
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Panorai

**Panorai** is a Python package for spherical (360°) image processing, specifically focusing on sampling, projection, forward/backward transformations, and unsharp masking for panoramic or spherical data. It provides a modular pipeline to handle various steps, including:

- Resizing input images  
- Sampling tangent points on a sphere (e.g., cube-based, Fibonacci-based)  
- Projecting spherical images into local tangential (rectilinear) planes  
- Re-projecting these rectilinear images back into the equirectangular space  
- Configuring and applying unsharp masking to sharpen the projected images  
- Logging and comparing configuration results (e.g., MSE) via an automated test suite  

This README will guide you through the repository structure, installation, usage, and testing of **Panorai**.

---

## Table of Contents

1. [Overview](#overview)  
2. [Directory Structure](#directory-structure)  
3. [Installation](#installation)  
4. [Examples](#examples)  
5. [Key Modules and Classes](#key-modules-and-classes)  
6. [Running Tests](#running-tests)  
7. [Extending Panorai](#extending-panorai)  
8. [License](#license)

---

## Overview

**Panorai** is a Python library designed for advanced geometric transformations, projections, and sampling on spherical and equirectangular data. It provides a highly modular framework for implementing gnomonic projections, backward projections, and blending strategies, suitable for 360-degree image processing and panoramic data transformations.

---

## Directory Structure

```markdown
/
├── panorai/
│   ├── __pycache__/
│   ├── common/
│   │   ├── __pycache__/
│   │   ├── __init__.py
│   │   └── shared_config.py
│   ├── pipeline/
│   │   ├── __pycache__/
│   │   ├── utils/
│   │   │   ├── __pycache__/
│   │   │   ├── __init__.py
│   │   │   └── resizer.py
│   │   ├── __init__.py
│   │   ├── pipeline.py
│   │   ├── pipeline_data.py
│   │   └── pipeline_old.py
│   ├── projection/
│   │   ├── __pycache__/
│   │   ├── utils/
│   │   │   ├── __pycache__/
│   │   │   ├── __init__.py
│   │   │   ├── remapper.py
│   │   │   └── unsharp.py
│   │   ├── __init__.py
│   │   ├── projector.py
│   │   └── projector_deprecated.py
│   ├── readme/
│   │   └── gnomonic.md
│   ├── sampler/
│   │   ├── __pycache__/
│   │   ├── __init__.py
│   │   └── sampler.py
│   ├── __init__.py
├── panorai.egg-info/
│   ├── dependency_links.txt
│   ├── PKG-INFO
│   ├── SOURCES.txt
│   └── top_level.txt
├── tests/
│   ├── __pycache__/
│   └── test_config_params.py
├── .gitignore
├── best_configs_chart.png
├── requirements.txt
├── setup.py
└── test_results.db
```

### Notable Contents

- **panorai/**  
  Main package directory containing submodules:
  
  - **pipeline/**: The pipeline logic for forward/backward projection and data handling, plus utility functions like `resizer`.  
  - **projection/**: Projector classes (e.g., `GnomonicProjector`) and remapping/unsharp utility code.  
  - **sampler/**: Sphere sampling strategies (cube, icosahedron, Fibonacci).  
  - **readme/**: Additional notes/documentation (e.g., gnomonic.md).  

- **setup.py**  
  A setuptools-based installation script.

- **requirements.txt**  
  Lists dependencies needed to run the code (e.g., NumPy, OpenCV, etc.).

---

## Installation

1. Clone the Repository:
   ```bash
   git clone https://github.com/yourusername/panorai.git
   cd panorai
   ```

2. Install Dependencies:
   ```bash
   pip install -r requirements.txt
   ```

3. Install Panorai (Editable Mode or Standard):
   ```bash
   pip install -e .
   # or
   python setup.py install
   ```

---

## Examples

### 1. Data Preparation

Start by loading your input data, typically stored in an `.npz` file containing `rgb`, `depth`, and other channels.

```python
import numpy as np
from panorai.pipeline.pipeline_data import PipelineData

# Load data from an NPZ file
filename = 'path/to/sample.npz'  # Replace with your file path
arr = np.load(filename)

rgb = arr['rgb']  # Shape: (H, W, 3)
depth = np.sqrt(np.sum(arr['z']**2, axis=-1))[:, :, None]  # Shape: (H, W, 1)
xyz = arr['z']  # Shape: (H, W, 3)

# Create a PipelineData instance
data = PipelineData.from_dict({
    "rgb": rgb,
    "depth": depth,
    "xyz_depth": xyz
})
```

### 2. Preprocessing Data

Adjust for shadow angle and optionally rotate the equirectangular image:

```python
from panorai.pipeline.utils.preprocess_eq import PreprocessEquirectangularImage

# Visualize the original data
import matplotlib.pyplot as plt
plt.imshow(data.data['rgb'])
plt.show()

# Preprocess the data (e.g., handle shadow angle)
data.preprocess(shadow_angle=30)
plt.imshow(data.data['rgb'])
plt.show()
```

### 3. Using Projections

#### 3.1. Forward Projection

Project equirectangular data into a gnomonic projection.

```python
from panorai.submodules.projections import ProjectionRegistry

# Access the gnomonic projection
proj = ProjectionRegistry.get_projection('gnomonic', return_processor=True)

# Perform forward projection
face = proj.forward(data.data['rgb'])
plt.imshow(face)
plt.show()
```

#### 3.2. Backward Projection

Reconstruct the equirectangular image from a projection:

```python
# Perform backward projection
eq_img = proj.backward(face)
plt.imshow(eq_img)
plt.show()
```

### 4. Using the ProjectionPipeline

The `ProjectionPipeline` provides a high-level API for projections.

```python
from panorai.pipeline.pipeline import ProjectionPipeline

# Initialize the pipeline
pipe = ProjectionPipeline(projection_name='gnomonic')

# Forward projection
face = pipe.project(data)
plt.imshow(face['rgb'].astype(np.uint8))
plt.show()
```

#### 4.1. Using Samplers

Use samplers to generate multiple projections (e.g., cube or icosahedron samplers):

```python
pipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='CubeSampler')
faces = pipe.project(data)

# Visualize a specific face
plt.imshow(faces['point_1']['rgb'].astype(np.uint8))
plt.show()
```

#### 4.2. Blending Projections

Blend multiple projections into a seamless equirectangular image:

```python
# Reconstruct equirectangular image
reconstructed = pipe.backward(faces)
plt.imshow(reconstructed['stacked'])
plt.show()
```

#### 4.3. Custom Configurations

Modify the pipeline configuration to customize the behavior:

```python
pipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='IcosahedronSampler')
faces = pipe.project(data, subdivisions=2, fov_deg=40)
reconstructed = pipe.backward(faces)
plt.imshow(reconstructed['stacked'])
plt.show()
```

---

## Key Modules and Classes

1. **PipelineData**  
   A container for storing and stacking multiple image channels (e.g., `rgb`, `depth`).


2. **ProjectionPipeline**  
   Manages the forward/backward transformations using a chosen sampler and projector.


3. **Samplers**  
   - CubeSampler: Tangent points for cube-based projections.
   - IcosahedronSampler: Icosahedron-based tangent points.
   - FibonacciSampler: Fibonacci sphere sampling for uniform distribution.

4. **ProjectionRegistry**  
   - Project that implements the projection modules
   https://github.com/RobinsonGarcia/projections/tree/main

---

## Extending Panorai

- **Add new samplers**: Implement a new class inheriting from `Sampler` and register it in `SAMPLER_CLASSES`.
- **Add new projectors**: Implement a new class inheriting from `ProjectionStrategy` and add it to `PROJECTOR_CLASSES`.
- **HF integration to handle depth estimation**: Implement seamless integration with HF to load and run DA inference


---

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.

---

## TODO

List all configuration options:
method: it can select wither ndimage remap or cv2 remap. With cv2 one has more control and can adjust interpolation c, borderMode and borderValue
interpolation: affects the interpolation method during the projection stages
    INTER_NEAREST      = 0,
    INTER_LINEAR       = 1,
    INTER_CUBIC        = 2,
    INTER_AREA         = 3,
    INTER_LANCZOS4     = 4,
    INTER_MAX          = 7,
    WARP_FILL_OUTLIERS = 8,
    WARP_INVERSE_MAP   = 16
   e.g panorai-cli --input someimage.jpeg --sampler_name=CubeSampler --blender_name=ClosestBlender --delta_lon=45 --delta_lat=0 --fov_deg=90 --kwargs method=cv2 interpolation=0
borderMode:
   Python: cv.BORDER_CONSTANT
   iiiiii|abcdefgh|iiiiiii with some specified i
   BORDER_REPLICATE 
   aaaaaa|abcdefgh|hhhhhhh
   BORDER_REFLECT 
   Python: cv.BORDER_REFLECT
   fedcba|abcdefgh|hgfedcb
   BORDER_WRAP 
   Python: cv.BORDER_WRAP
   cdefgh|abcdefgh|abcdefg
   BORDER_REFLECT_101 
   Python: cv.BORDER_REFLECT_101
   gfedcb|abcdefgh|gfedcba
   BORDER_TRANSPARENT 
   Python: cv.BORDER_TRANSPARENT
   uvwxyz|abcdefgh|ijklmno - Treats outliers as transparent.
   BORDER_REFLECT101 
   Python: cv.BORDER_REFLECT101
   same as BORDER_REFLECT_101
   BORDER_DEFAULT 
   Python: cv.BORDER_DEFAULT
   same as BORDER_REFLECT_101
   BORDER_ISOLATED 
   Python: cv.BORDER_ISOLATED
   Interpolation restricted within the ROI boundaries.
   SOURCE: opencv-python
sampler_name: Selects one of the available sampling strategies (as of today: 'CubeSampler', 'IcosahedronSampler', 'FibonacciSampler')
   panorai-cli --list-samplers

blender_name: ['FeatheringBlender', 'GaussianBlender', 'AverageBlender', 'ClosestBlender']
---

## Contact

For questions or feedback, contact the maintainers:

- **Your Name**: rlsgarcia@icloud.com
- **GitHub**: [https://github.com/RobinsonGarcia](https://github.com/RobinsonGarcia)

---

Enjoy using Panorai for your panoramic image processing!



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/RobinsonGarcia/PanorAi",
    "name": "panorai",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "panorama, image processing, projection, gnomonic, computer vision",
    "author": "Robinson Luiz Souza Garcia",
    "author_email": "rlsgarcia@icloud.com",
    "download_url": "https://files.pythonhosted.org/packages/57/d4/bf64218ec0a37de92bf033cc9aedfabca3bb54ae926f33557731d86d0868/panorai-1.4.3.tar.gz",
    "platform": null,
    "description": "# Panorai\n\n**Panorai** is a Python package for spherical (360\u00b0) image processing, specifically focusing on sampling, projection, forward/backward transformations, and unsharp masking for panoramic or spherical data. It provides a modular pipeline to handle various steps, including:\n\n- Resizing input images  \n- Sampling tangent points on a sphere (e.g., cube-based, Fibonacci-based)  \n- Projecting spherical images into local tangential (rectilinear) planes  \n- Re-projecting these rectilinear images back into the equirectangular space  \n- Configuring and applying unsharp masking to sharpen the projected images  \n- Logging and comparing configuration results (e.g., MSE) via an automated test suite  \n\nThis README will guide you through the repository structure, installation, usage, and testing of **Panorai**.\n\n---\n\n## Table of Contents\n\n1. [Overview](#overview)  \n2. [Directory Structure](#directory-structure)  \n3. [Installation](#installation)  \n4. [Examples](#examples)  \n5. [Key Modules and Classes](#key-modules-and-classes)  \n6. [Running Tests](#running-tests)  \n7. [Extending Panorai](#extending-panorai)  \n8. [License](#license)\n\n---\n\n## Overview\n\n**Panorai** is a Python library designed for advanced geometric transformations, projections, and sampling on spherical and equirectangular data. It provides a highly modular framework for implementing gnomonic projections, backward projections, and blending strategies, suitable for 360-degree image processing and panoramic data transformations.\n\n---\n\n## Directory Structure\n\n```markdown\n/\n\u251c\u2500\u2500 panorai/\n\u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u251c\u2500\u2500 common/\n\u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u2514\u2500\u2500 shared_config.py\n\u2502   \u251c\u2500\u2500 pipeline/\n\u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u251c\u2500\u2500 utils/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 resizer.py\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u251c\u2500\u2500 pipeline.py\n\u2502   \u2502   \u251c\u2500\u2500 pipeline_data.py\n\u2502   \u2502   \u2514\u2500\u2500 pipeline_old.py\n\u2502   \u251c\u2500\u2500 projection/\n\u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u251c\u2500\u2500 utils/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 remapper.py\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 unsharp.py\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u251c\u2500\u2500 projector.py\n\u2502   \u2502   \u2514\u2500\u2500 projector_deprecated.py\n\u2502   \u251c\u2500\u2500 readme/\n\u2502   \u2502   \u2514\u2500\u2500 gnomonic.md\n\u2502   \u251c\u2500\u2500 sampler/\n\u2502   \u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u2502   \u2514\u2500\u2500 sampler.py\n\u2502   \u251c\u2500\u2500 __init__.py\n\u251c\u2500\u2500 panorai.egg-info/\n\u2502   \u251c\u2500\u2500 dependency_links.txt\n\u2502   \u251c\u2500\u2500 PKG-INFO\n\u2502   \u251c\u2500\u2500 SOURCES.txt\n\u2502   \u2514\u2500\u2500 top_level.txt\n\u251c\u2500\u2500 tests/\n\u2502   \u251c\u2500\u2500 __pycache__/\n\u2502   \u2514\u2500\u2500 test_config_params.py\n\u251c\u2500\u2500 .gitignore\n\u251c\u2500\u2500 best_configs_chart.png\n\u251c\u2500\u2500 requirements.txt\n\u251c\u2500\u2500 setup.py\n\u2514\u2500\u2500 test_results.db\n```\n\n### Notable Contents\n\n- **panorai/**  \n  Main package directory containing submodules:\n  \n  - **pipeline/**: The pipeline logic for forward/backward projection and data handling, plus utility functions like `resizer`.  \n  - **projection/**: Projector classes (e.g., `GnomonicProjector`) and remapping/unsharp utility code.  \n  - **sampler/**: Sphere sampling strategies (cube, icosahedron, Fibonacci).  \n  - **readme/**: Additional notes/documentation (e.g., gnomonic.md).  \n\n- **setup.py**  \n  A setuptools-based installation script.\n\n- **requirements.txt**  \n  Lists dependencies needed to run the code (e.g., NumPy, OpenCV, etc.).\n\n---\n\n## Installation\n\n1. Clone the Repository:\n   ```bash\n   git clone https://github.com/yourusername/panorai.git\n   cd panorai\n   ```\n\n2. Install Dependencies:\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n3. Install Panorai (Editable Mode or Standard):\n   ```bash\n   pip install -e .\n   # or\n   python setup.py install\n   ```\n\n---\n\n## Examples\n\n### 1. Data Preparation\n\nStart by loading your input data, typically stored in an `.npz` file containing `rgb`, `depth`, and other channels.\n\n```python\nimport numpy as np\nfrom panorai.pipeline.pipeline_data import PipelineData\n\n# Load data from an NPZ file\nfilename = 'path/to/sample.npz'  # Replace with your file path\narr = np.load(filename)\n\nrgb = arr['rgb']  # Shape: (H, W, 3)\ndepth = np.sqrt(np.sum(arr['z']**2, axis=-1))[:, :, None]  # Shape: (H, W, 1)\nxyz = arr['z']  # Shape: (H, W, 3)\n\n# Create a PipelineData instance\ndata = PipelineData.from_dict({\n    \"rgb\": rgb,\n    \"depth\": depth,\n    \"xyz_depth\": xyz\n})\n```\n\n### 2. Preprocessing Data\n\nAdjust for shadow angle and optionally rotate the equirectangular image:\n\n```python\nfrom panorai.pipeline.utils.preprocess_eq import PreprocessEquirectangularImage\n\n# Visualize the original data\nimport matplotlib.pyplot as plt\nplt.imshow(data.data['rgb'])\nplt.show()\n\n# Preprocess the data (e.g., handle shadow angle)\ndata.preprocess(shadow_angle=30)\nplt.imshow(data.data['rgb'])\nplt.show()\n```\n\n### 3. Using Projections\n\n#### 3.1. Forward Projection\n\nProject equirectangular data into a gnomonic projection.\n\n```python\nfrom panorai.submodules.projections import ProjectionRegistry\n\n# Access the gnomonic projection\nproj = ProjectionRegistry.get_projection('gnomonic', return_processor=True)\n\n# Perform forward projection\nface = proj.forward(data.data['rgb'])\nplt.imshow(face)\nplt.show()\n```\n\n#### 3.2. Backward Projection\n\nReconstruct the equirectangular image from a projection:\n\n```python\n# Perform backward projection\neq_img = proj.backward(face)\nplt.imshow(eq_img)\nplt.show()\n```\n\n### 4. Using the ProjectionPipeline\n\nThe `ProjectionPipeline` provides a high-level API for projections.\n\n```python\nfrom panorai.pipeline.pipeline import ProjectionPipeline\n\n# Initialize the pipeline\npipe = ProjectionPipeline(projection_name='gnomonic')\n\n# Forward projection\nface = pipe.project(data)\nplt.imshow(face['rgb'].astype(np.uint8))\nplt.show()\n```\n\n#### 4.1. Using Samplers\n\nUse samplers to generate multiple projections (e.g., cube or icosahedron samplers):\n\n```python\npipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='CubeSampler')\nfaces = pipe.project(data)\n\n# Visualize a specific face\nplt.imshow(faces['point_1']['rgb'].astype(np.uint8))\nplt.show()\n```\n\n#### 4.2. Blending Projections\n\nBlend multiple projections into a seamless equirectangular image:\n\n```python\n# Reconstruct equirectangular image\nreconstructed = pipe.backward(faces)\nplt.imshow(reconstructed['stacked'])\nplt.show()\n```\n\n#### 4.3. Custom Configurations\n\nModify the pipeline configuration to customize the behavior:\n\n```python\npipe = ProjectionPipeline(projection_name='gnomonic', sampler_name='IcosahedronSampler')\nfaces = pipe.project(data, subdivisions=2, fov_deg=40)\nreconstructed = pipe.backward(faces)\nplt.imshow(reconstructed['stacked'])\nplt.show()\n```\n\n---\n\n## Key Modules and Classes\n\n1. **PipelineData**  \n   A container for storing and stacking multiple image channels (e.g., `rgb`, `depth`).\n\n\n2. **ProjectionPipeline**  \n   Manages the forward/backward transformations using a chosen sampler and projector.\n\n\n3. **Samplers**  \n   - CubeSampler: Tangent points for cube-based projections.\n   - IcosahedronSampler: Icosahedron-based tangent points.\n   - FibonacciSampler: Fibonacci sphere sampling for uniform distribution.\n\n4. **ProjectionRegistry**  \n   - Project that implements the projection modules\n   https://github.com/RobinsonGarcia/projections/tree/main\n\n---\n\n## Extending Panorai\n\n- **Add new samplers**: Implement a new class inheriting from `Sampler` and register it in `SAMPLER_CLASSES`.\n- **Add new projectors**: Implement a new class inheriting from `ProjectionStrategy` and add it to `PROJECTOR_CLASSES`.\n- **HF integration to handle depth estimation**: Implement seamless integration with HF to load and run DA inference\n\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n---\n\n## TODO\n\nList all configuration options:\nmethod: it can select wither ndimage remap or cv2 remap. With cv2 one has more control and can adjust interpolation c, borderMode and borderValue\ninterpolation: affects the interpolation method during the projection stages\n    INTER_NEAREST      = 0,\n    INTER_LINEAR       = 1,\n    INTER_CUBIC        = 2,\n    INTER_AREA         = 3,\n    INTER_LANCZOS4     = 4,\n    INTER_MAX          = 7,\n    WARP_FILL_OUTLIERS = 8,\n    WARP_INVERSE_MAP   = 16\n   e.g panorai-cli --input someimage.jpeg --sampler_name=CubeSampler --blender_name=ClosestBlender --delta_lon=45 --delta_lat=0 --fov_deg=90 --kwargs method=cv2 interpolation=0\nborderMode:\n   Python: cv.BORDER_CONSTANT\n   iiiiii|abcdefgh|iiiiiii with some specified i\n   BORDER_REPLICATE \n   aaaaaa|abcdefgh|hhhhhhh\n   BORDER_REFLECT \n   Python: cv.BORDER_REFLECT\n   fedcba|abcdefgh|hgfedcb\n   BORDER_WRAP \n   Python: cv.BORDER_WRAP\n   cdefgh|abcdefgh|abcdefg\n   BORDER_REFLECT_101 \n   Python: cv.BORDER_REFLECT_101\n   gfedcb|abcdefgh|gfedcba\n   BORDER_TRANSPARENT \n   Python: cv.BORDER_TRANSPARENT\n   uvwxyz|abcdefgh|ijklmno - Treats outliers as transparent.\n   BORDER_REFLECT101 \n   Python: cv.BORDER_REFLECT101\n   same as BORDER_REFLECT_101\n   BORDER_DEFAULT \n   Python: cv.BORDER_DEFAULT\n   same as BORDER_REFLECT_101\n   BORDER_ISOLATED \n   Python: cv.BORDER_ISOLATED\n   Interpolation restricted within the ROI boundaries.\n   SOURCE: opencv-python\nsampler_name: Selects one of the available sampling strategies (as of today: 'CubeSampler', 'IcosahedronSampler', 'FibonacciSampler')\n   panorai-cli --list-samplers\n\nblender_name: ['FeatheringBlender', 'GaussianBlender', 'AverageBlender', 'ClosestBlender']\n---\n\n## Contact\n\nFor questions or feedback, contact the maintainers:\n\n- **Your Name**: rlsgarcia@icloud.com\n- **GitHub**: [https://github.com/RobinsonGarcia](https://github.com/RobinsonGarcia)\n\n---\n\nEnjoy using Panorai for your panoramic image processing!\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A Python package for panoramic image projection and blending using Gnomonic (and other) projections.",
    "version": "1.4.3",
    "project_urls": {
        "Bug Tracker": "https://github.com/RobinsonGarcia/PanorAi/issues",
        "Documentation": "https://github.com/RobinsonGarcia/PanorAi/wiki",
        "Homepage": "https://github.com/RobinsonGarcia/PanorAi",
        "Source Code": "https://github.com/RobinsonGarcia/PanorAi"
    },
    "split_keywords": [
        "panorama",
        " image processing",
        " projection",
        " gnomonic",
        " computer vision"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8b45b2f786b6e7be3b6cc9af54d75be97c58166ffbf2c1b0c534ccfaf5efed42",
                "md5": "d77931b19ce2b05f547f18ac48320e8c",
                "sha256": "3453e9b2a503a31934c54f3950cc8b20c6ea40fcb20f8452735662660d3e463e"
            },
            "downloads": -1,
            "filename": "panorai-1.4.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d77931b19ce2b05f547f18ac48320e8c",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 34016,
            "upload_time": "2025-02-19T19:41:37",
            "upload_time_iso_8601": "2025-02-19T19:41:37.281953Z",
            "url": "https://files.pythonhosted.org/packages/8b/45/b2f786b6e7be3b6cc9af54d75be97c58166ffbf2c1b0c534ccfaf5efed42/panorai-1.4.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "57d4bf64218ec0a37de92bf033cc9aedfabca3bb54ae926f33557731d86d0868",
                "md5": "cfeccd86c9cd2e3347db3e17a867dee0",
                "sha256": "38485261cedebbb8e9733fb775d7392c9986cf24afb29247cb1bbcd87fd89ea7"
            },
            "downloads": -1,
            "filename": "panorai-1.4.3.tar.gz",
            "has_sig": false,
            "md5_digest": "cfeccd86c9cd2e3347db3e17a867dee0",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 31866,
            "upload_time": "2025-02-19T19:41:39",
            "upload_time_iso_8601": "2025-02-19T19:41:39.653825Z",
            "url": "https://files.pythonhosted.org/packages/57/d4/bf64218ec0a37de92bf033cc9aedfabca3bb54ae926f33557731d86d0868/panorai-1.4.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-02-19 19:41:39",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "RobinsonGarcia",
    "github_project": "PanorAi",
    "github_not_found": true,
    "lcname": "panorai"
}
        
Elapsed time: 0.85941s