Python example: mrpt_img_example.py

Creates and draws on images, NumPy conversion and camera models with mrpt.img.

Modules: mrpt.img

 1#!/usr/bin/env python3
 2"""
 3Creates and draws on images, NumPy conversion and camera models with mrpt.img.
 4
 5Demonstrates:
 6  - CImage: create from numpy, draw shapes, convert back to numpy
 7  - TCamera: intrinsic parameter matrix
 8  - TStereoCamera: stereo rig parameters
 9  - TColor / TPixelCoord helper types
10
11Optional OpenCV display if cv2 is available.
12"""
13
14import numpy as np
15from mrpt.img import CImage, TCamera, TStereoCamera, TColor, TPixelCoord, TPixelCoordf
16
17# ---------------------------------------------------------------------------
18# TColor and TPixelCoord helper types
19# ---------------------------------------------------------------------------
20red   = TColor(255, 0, 0)
21green = TColor(0, 255, 0)
22blue  = TColor(0, 0, 255, 128)   # semi-transparent
23print(f"TColor red:   R={red.R} G={red.G} B={red.B} A={red.A}")
24print(f"TColor blue (alpha=128): A={blue.A}")
25
26coord = TPixelCoord(320, 240)
27print(f"TPixelCoord: x={coord.x} y={coord.y}")
28
29# ---------------------------------------------------------------------------
30# CImage — create from a NumPy array (HxWxC uint8)
31# ---------------------------------------------------------------------------
32np_img = np.zeros((480, 640, 3), dtype=np.uint8)
33np_img[100:200, 100:200] = [64, 128, 192]    # fill a rectangle
34
35mrpt_img = CImage(np_img)
36print(f"\nCImage: {mrpt_img.getWidth()}x{mrpt_img.getHeight()}, color={mrpt_img.isColor()}")
37
38# Draw a circle and overlay text
39mrpt_img.drawCircle(TPixelCoord(320, 240), 50, red, 3)
40mrpt_img.textOut(TPixelCoord(10, 10), "MRPT Python", green)
41
42# Convert back to numpy
43back = np.array(mrpt_img)
44print(f"  back to numpy: shape={back.shape}, dtype={back.dtype}")
45assert back.shape == (480, 640, 3)
46assert back.dtype == np.uint8
47print("  numpy round-trip ✓")
48
49# Optional OpenCV display
50try:
51    import cv2
52except ImportError:
53    cv2 = None
54if cv2 is None:
55    print("  (cv2 not available: skipping display)")
56else:
57    try:
58        cv2.imshow("mrpt_img_example", back)
59        cv2.waitKey(1500)
60        cv2.destroyAllWindows()
61        print("  (displayed via cv2)")
62    except cv2.error:
63        print("  (cv2 has no GUI support, e.g. opencv-python-headless: skipping display)")
64
65# ---------------------------------------------------------------------------
66# CImage.from_numpy — static constructor
67# ---------------------------------------------------------------------------
68img2 = CImage.from_numpy(np_img)
69print(f"\nCImage.from_numpy: {img2.getWidth()}x{img2.getHeight()}")
70
71# ---------------------------------------------------------------------------
72# TCamera — monocular intrinsic calibration
73# ---------------------------------------------------------------------------
74cam = TCamera()
75cam.ncols, cam.nrows = 640, 480
76cam.fx = 525.0
77cam.fy = 525.0
78cam.cx = 319.5
79cam.cy = 239.5
80cam.dist = [0.1, -0.05, 0.0, 0.0, 0.0]   # k1 k2 p1 p2 k3 (use .dist, not .distortion)
81
82import numpy as np
83K = np.array(cam.intrinsicParams())  # 3x3 numpy array (intrinsicParams returns list-of-lists)
84print(f"\nTCamera intrinsic matrix K:\n{K}")
85assert K.shape == (3, 3)
86assert abs(K[0, 0] - 525.0) < 1e-6
87print("  intrinsic matrix ✓")
88
89# ---------------------------------------------------------------------------
90# TStereoCamera — stereo rig
91# ---------------------------------------------------------------------------
92sc = TStereoCamera()
93sc.leftCamera  = cam
94sc.rightCamera = cam
95print(f"\nTStereoCamera:\n{sc}")