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}")