Skip to main content

Projective geometry in 2D and 3D with homogeneous and Plücker coordinates, projection matrices, and visualization.

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-0.1.0.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

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

projectivegeometry23-0.1.0-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for projectivegeometry23-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8a10f3f8ba46056e3c007cd649a3ee9c55ea51d5e167370dbd6993829170e738
MD5 9fa75c05b45380c503af2488137d7768
BLAKE2b-256 89ae16d1c88ce58cedc4cb05a20326f9a1d2f0c342f9c29710ee5a243c8f2513

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for projectivegeometry23-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a2ad44ebdcb9ce0c4f1f02b9fe8bb15922cbf4dd22fee9839f91bf304e22cc40
MD5 69cd52cb921e07d4299d44dbef30593f
BLAKE2b-256 6d71badb215f75a4e8be2bf89efc5dcccd9f0d94fedc943c93785687faa7d81d

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