An essential matrix relates corresponding points between two images assuming that a camera satisfies the pinhole camera model, and can be expressed as: $$E=K'^TFK$$

where K is the calibration and F is the fundamental matrix.

There are many tools to compute the essential matrix, one of them using OpenCV's function findEssentialMat. You are typically returned a 3x3 matrix which contains the transformation (or the $$E=R[t]_x$$ camera pose version). Typically, the translation is directly extracted from the t part, and the rotation matrix has more than one solution.

However, how is scaling represented in the essential matrix?

In case it is, how can one extract it? In case it isn't, how come it isn't> And how should one include it to properly state the total motion between the images' points?


1 Answer 1


The Essential matrix is defined only up to scale, so you cannot extract scale from it. In other words, if you multiply $t$ and all the 3D world points in your scene by a constant factor, the essential matrix will be the same.

If you have to get the scale, then you need some additional information. Either you need to have an object of a known size in the scene, or you need some other sensor that tells you what the translation between the cameras is (e.g. GPS, odometer, or IMU). Here is an example where you get scale from a sphere of a known radius that happens to be in the scene.

  • $\begingroup$ Given the additional information (altitude, FOV, etc...) how is the data to be corrected with it? $\endgroup$
    – user17348
    Sep 22, 2015 at 16:11
  • $\begingroup$ You need to know the actual distance between the cameras, or the distance between two 3D points in the scene, that you can locate in your point cloud. Altitude will work, if you can find the ground plane and calculate the perpendicular distance between the ground plane and the camera. This assumes that the altitude is reasonably accurate, and that it represents the distance between the camera and the ground, and not between the camera and the sea level. $\endgroup$
    – Dima
    Sep 22, 2015 at 16:56
  • $\begingroup$ Given the altitude, how do you exactly correct the data to scale it? Just multiply the translation by the distance per pixel in every image instance (which is obtained using eg. the altitude)? $\endgroup$
    – user17348
    Sep 22, 2015 at 17:07
  • $\begingroup$ Let's say you have two views. You got R and t, and you have done the 3D reconstruction to get the point cloud. t is a unit vector, so the distance between the cameras is 1, and that is the unit of your coordinate system. Let's call this unit Tnorm. In your point cloud you find the ground plane. You compute the distance between camera 1 and the ground plane in your point cloud in Tnorms. You also have the same distance (the altitude) in meters. You divide the altitude in meters by the altitude in Tnorms, to get the scale factor f. Then you multiply all your points by f. $\endgroup$
    – Dima
    Sep 22, 2015 at 17:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy