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.2.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.2.0-py3-none-any.whl (22.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: projectivegeometry23-1.2.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.2.0.tar.gz
Algorithm Hash digest
SHA256 af2b5e78d315ccf8f91f65c8f589c421808e2360b70a4ca131990b47769d6f07
MD5 6dbaac9134b12eb7f1ec790708117f5c
BLAKE2b-256 2cf547301e90a5b188509555338ac6c7b80d7f495885ae691abb4ef8e585e59e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for projectivegeometry23-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9ddb200b463dc8447ff914606af5d8263095432567d126fdee7e137d7deb4082
MD5 862a759b0f4cf99e6ac5b36c45ad8ff6
BLAKE2b-256 876c147066236aaf798a6dd969cf756697727d42b644481a3bfdcf30be2a1a00

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