0

I wish to project an image taken with a camera for which I know all parameters (focal length, sensor size, X, Y, Z, rotation (omega, phi, kappa) on a 2D plane. I know that I need to construct a camera matrix before being able to do the planar homography, but how?

I've successfully produced a matrix using 4 known pairs of points on each plane following this answer, but it's not the way I want to do it. I've looked at this video that give me almost all my answers, hovewer the matrix named "extrinsic parameters" is not enterely described. How the rotation matrix R and the matrix T of the camera position should be constructed?

With the final camera matrix in hand, is suppose I will be able to take each parameter and feed them to PIL.Image.transform. I'm also open to using the python OpenCV library.

Here is some exemple data:

Original image here (4288 x 2848 pixels)

#Camera position
X:   72003 m
Y: 1070100 m
Z:    1243 m

#Rotation of camera
Omega:    0°
Phi:     27°
Kappa:  -38°

Focal length: 26 mm
Pixel size on sensor: 0.00551 mm

1 Answers1

2

The camera matrix P is a 4x3 matrix of the form P = K[R t]:

  • K is a 3x3 matrix containing the intrinsic parameters (principal point and focal length in pixels)
  • [R t] is a 3x4 matrix obtained by concatenating R, a 3x3 matrix representing the rotation from the camera frame to the world frame, and t, a 3-vector which represents the position of the origin of the world in the camera frame.

This means that the parameters you have, which seem to be the position of the camera in the world frame, have to be inverted. The inverse of [R t] is [R' t'] where R' = inverse(R) = transpose(R) and t' = -inverse(R)t.

You would first have to know how to compute the 3x3 camera rotation matrix from the three angles you have, and there are many possible representations of a rotation matrix from three angles. The most common are yaw/pitch/roll, and Euler angles with all possible rotation orders.

The 3x3 intrinsics matrix K is [[f 0 cx][0 f cy][0 0 1]], where f = 26/0.00551 = 4719 and (cx,cy) is the principal point, which you can take as the center of the image (4288/2,2848/2).

Then to compute the homography (3x3 matrix) that goes from the plane at world height Z0 to your image, you multiply P by (X,Y,Z0,1), which gives you an expression of the form Xv1 + Yv2 + v3 where v1, v2, and v3 are 3-vectors. The matrix H=[v1 v2 v3] is the homography you are looking for. The 8 coefficients for PIL.Image.transform should be the first 8 coefficients from that matrix, divided by the 9th one.

  • Perhaps see https://en.wikipedia.org/wiki/Camera_matrix and http://ksimek.github.io/2012/08/22/extrinsic/ – fmw42 Aug 16 '19 at 17:24
  • I understand a bit better the Extrinsic Camera Matrix now. I need to use the transpose of *[Rc, C]* to get *[R, t]* and in my case, *C* would be *[72003, 1070100, 1243]* but I'am still isn't sure about the combination of rotation matrix, As I understand it, those are not commutative so is Rx · Ry · Rz the right order [like in this answer](https://math.stackexchange.com/questions/1882276/combining-all-three-rotation-matrices)? – Jean-François Bourdon Aug 16 '19 at 18:50
  • @Jean-FrançoisBourdon you have to figure out the right order from the documentation you have. As explained in https://en.wikipedia.org/wiki/Euler_angles , "there exist twelve possible sequences of rotation axes". – Frédéric Devernay Sep 08 '19 at 00:41