Reputation: 12379
I have the intrisic and extrinsic parameters of the camera. The extrinsic is a 4 x 4 matrix with rotation and translation.
I have sample data as under, I have this one per camera image taken.
2.11e-001 -3.06e-001 -9.28e-001 7.89e-001
6.62e-001 7.42e-001 -9.47e-002 1.47e-001
7.18e-001 -5.95e-001 3.60e-001 3.26e+000
0.00e+000 0.00e+000 0.00e+000 1.00e+000
I would like to plot the image as given on the Matlab calibration toolkit page or
However I'm unable to figure out the Math of how to plot these 2 images.
The only lead I have is from this page http://en.wikipedia.org/wiki/Camera_resectioning. Which tells me that the camera position can be found by C = − R` . T
Any idea how to achieve this task?
Upvotes: 11
Views: 13789
Reputation: 154
This is how you can plot the cameras. Red arrows are camera directions (-z or z), blue arrows are cameras orientations. All of example cameras point at [0,0,0].
Code:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def plot_cameras(extrinsic_matrices):
"""
Visualizes the extrinsics of multiple cameras in 3D space.
Parameters:
- extrinsic_matrices (numpy.ndarray): Array of camera extrinsics matrices (Nx4x4).
"""
ax = plt.figure().add_subplot(projection='3d')
for camera_extrinsics in extrinsic_matrices:
# Extract translation and rotation from camera extrinsics matrix
translation = camera_extrinsics[:3, 3]
rotation_matrix = camera_extrinsics[:3, :3]
# Plot camera position
ax.scatter(*translation, marker='o')
# Plot camera orientation axes
origin = translation
for i in range(3):
axis_direction = rotation_matrix[:,i]
if i == 0:
ax.quiver(*origin, *axis_direction, length=0.5, normalize=True)
else:
ax.quiver(*origin, *axis_direction, length=1, normalize=True)
# Plot camera direction
z = -1 * rotation_matrix[:,2]
ax.quiver(*origin, *z, length=1, normalize=True, color='r', alpha=0.5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Multiple Cameras Extrinsics Visualization')
ax.set_zlim(-2,2)
plt.show()
# List of extrinsic matrices or poses
# Example poses all pointing at [0,0,0]
poses = np.array([[
[-9.9990219e-01, 4.1922452e-03, -1.3345719e-02, -5.3798322e-02],
[-1.3988681e-02, -2.9965907e-01, 9.5394367e-01, 3.8454704e+00],
[-4.6566129e-10, 9.5403719e-01, 2.9968831e-01, 1.2080823e+00],
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.0000000e+00]],
[[-9.3054223e-01, 1.1707554e-01, -3.4696460e-01, -1.3986591e+00],
[-3.6618456e-01, -2.9751042e-01, 8.8170075e-01, 3.5542498e+00],
[ 7.4505806e-09, 9.4751304e-01, 3.1971723e-01, 1.2888215e+00],
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.0000000e+00]],
[[ 4.4296363e-01, 3.1377721e-01, -8.3983749e-01, -3.3854935e+00],
[-8.9653969e-01, 1.5503149e-01, -4.1494811e-01, -1.6727095e+00],
[ 0.0000000e+00, 9.3675458e-01, 3.4998694e-01, 1.4108427e+00],
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.0000000e+00]],
[[ 7.9563183e-01, 5.2092606e-01, -3.0920234e-01, -1.2464346e+00],
[-6.0578054e-01, 6.8418401e-01, -4.0610620e-01, -1.6370665e+00],
[-1.4901161e-08, 5.1041979e-01, 8.5992539e-01, 3.4664700e+00],
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.0000000e+00]],
[[-6.5665424e-01, -2.3678228e-01, 7.1605819e-01, 2.8865230e+00],
[ 7.5419182e-01, -2.0615987e-01, 6.2345237e-01, 2.5132170e+00],
[-1.4901163e-08, 9.4943780e-01, 3.1395501e-01, 1.2655932e+00],
[ 0.0000000e+00, 0.0000000e+00, 0.0000000e+00, 1.0000000e+00]]])
plot_cameras(poses)
Explanation why Z is where camera is pointing.
Upvotes: 1
Reputation: 3861
There is now an example in opencv for visualizing the extrinsics generated from their camera calibration example
It outputs something similar to the original questions ask:
Upvotes: 2
Reputation: 4901
Assume the corners of the plane that you want to draw are 3x1 column vectors, a = [0 0 0]', b = [w 0 0]', c = [w h 0]' and d = [0 h 0]'.
Assume that the calibration matrix that you provide is A and consists of a rotation matrix R = A(1:3, 1:3) and a translation T = A(1:3, 4).
To draw the first view For every pose A_i with rotation R_i and translation T_i, transform each corner x_w (that is a, b, c or d) of the plane to its coordinates x_c in the camera by
x_c = R_i*x_w + T_i
Then draw the plane with transformed corners.
To draw the camera, its centre of projection in camera coordinates is [0 0 0]' and the camera x axis is [1 0 0]', y axis is [0 1 0]' and z axis is [0 0 1]'.
Note that in the drawing, the camera y-axis is pointing down, so you might want to apply an additional rotation on all the computed coordinates by multiplication with B = [1 0 0; 0 0 1; 0 -1 0].
Draw the second view Drawing the plane is trivial since we are in world coordinates. Just draw the plane using a, b, c and d.
To draw the cameras, each camera centre is c = -R'*T. The camera axes are the rows of the rotation matrix R, so for instance, in the matrix you provided, the x-axis is [2.11e-001 -3.06e-001 -9.28e-001]'. You can also draw a camera by transforming each point x_c given in camera coordinates to world coordinates x_w by x_w = R'*(x_c - T) and draw it.
Upvotes: 5