Skip to main content

A 2D and 3D projective geometry library with Plücker coordinates and projection matrix, including (X-ray) source-detector geometry model.

Project description

ProjectiveGeometry23

Projective Geometry of Two- and Three-space

ProjectiveGeometry23 is a collection of numpy-based utilities for projective geometry of real two- and three-space, including homogeneous coordinates of point, lines and planes, Plücker coordinates and projection matrices.

The package has been converted from an existing C++ implementation LibProjectiveGeometry, which is well-tested and obviously faster.

The main use of this code is for the visualization or X-Ray source-detector geometries but applied generally to geometric computer vision problems.

Features:

  • Computing with points, lines and planes
  • Plücker coordinates, Plücker matrices
  • Projection matrices, intrinsic and extrinsic parameters
  • Decomposition of projection matrices, backprojection
  • Visualization of X-Ray source-detector geometries
  • (WIP) estimation based on direct linear transform, X-ray calibraion

General recommendation for better readibility of outputs:

from rich import print
np.set_printoptions(suppress=True)

Example of an interactive visualization, using the optional svg_snip package:

from svg_snip.Jupyter import CanvasWithOverlay
from svg_snip.Composer import Composer
import svg_snip.Elements as e2d
import svg_snip.Elements3D as e3d

from ProjectiveGeometry23.homography import rotation_x, rotation_z, scale
from ProjectiveGeometry23.svg_utils import svg_source_detector, svg_world_geometry
    
vis = CanvasWithOverlay(int(target.image_size[0]), int(target.image_size[1]))

# World transformation
ax, az = 0.5, 0.5
s = 0.2

def handle_draw(vis):
    global ax
    global az
    x,y = vis.mouse_state.pos()
    svg = Composer((vis.w, vis.h))

    svg.add(svg_world_geometry)
    svg.add(svg_source_detector, projection=target,
            draw_on_detector=svg_world_geometry,
            label_source='C0', label_detector='I0(u,v)')

    svg.add(e2d.star, x=x, y=y, size=8,
        fill="red" if vis.mouse_state.clicked else "blue")

    svg.add(e2d.text, x=10, y=20, content=f'ax={ax:.3} az={az:.3}')
            
    T = scale(s) @ rotation_x(ax) @ rotation_z(az)
    raw_svg_code = svg.render(P=target.P@T)
    vis.html_overlay.value = raw_svg_code
    
    if vis.mouse_state.clicked:
        az += vis.mouse_state.dx * 0.01
        ax += vis.mouse_state.dy * 0.01
    
vis.handle_draw = handle_draw

vis.display()

source_detector_geometry.png

Installation

Using pip

You can install ProjectiveGeometry23 using pip:

pip install ProjectiveGeometry23

Using setup.py

git clone https://github.com/aaichert/ProjectiveGeometry23
cd ProjectiveGeometry23
python setup.py install

Testing and Publication on PyPy

Two useful code snippets

python -m unittest discover tests
python setup.py sdist bdist_wheel
pip install twine
twine upload dist/*

References

  1. LibProjectiveGeometry (c++). GitHub https://github.com/aaichert/EpipolarConsistency/tree/master/code/LibProjectiveGeometry
  2. Hartley, Richard, and Andrew Zisserman. Multiple view geometry in computer vision. Cambridge university press, 2003. https://www.robots.ox.ac.uk/~vgg/hzbook/
  3. Coxeter, Harold Scott Macdonald. Projective geometry. Springer Science & Business Media, 2003.
  4. Stolfi, Jorge. "Oriented projective geometry." Proceedings of the third annual symposium on Computational geometry. 1987.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

projectivegeometry23-1.1.0.tar.gz (46.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

projectivegeometry23-1.1.0-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file projectivegeometry23-1.1.0.tar.gz.

File metadata

  • Download URL: projectivegeometry23-1.1.0.tar.gz
  • Upload date:
  • Size: 46.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for projectivegeometry23-1.1.0.tar.gz
Algorithm Hash digest
SHA256 72a1609f585f2088186f7b700e0bbd8990927ae420d021affc0d0de3c667bc65
MD5 6e0f91913323ed1dc24bf7d1eef4b968
BLAKE2b-256 199e32d0d0b0842c25a148f6d555d523e1cdd0923c02be41d8396d5e81eae408

See more details on using hashes here.

File details

Details for the file projectivegeometry23-1.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for projectivegeometry23-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9d24507603a96f8b89abd99e5b6c4bf5f79ad26d9e3c90e0865047540865876e
MD5 6d83b8ab93891c894ff47f9260172326
BLAKE2b-256 a932bfaab382d4e9ccba78e8840fddae8bf332f9e14cace4ef61cc58c261d1b8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page