How to calculate true lengths from perspective projection?

Suppose that I have a single point perspective drawing like this.

and suppose also that I know some of the real horizontal distances and distances along lines converging to vanishing point. E.g if i know the real length and breadth of a slab of pavement. Is it possible to derive other real distances e.g the width of the road and the length of a house?


Solution 1:

You can use the cross ratio for this purpose. If $A,B,C,D$ are collinear and $A$ is the vanishing point of that line, then the cross ratio $(A,B;C,D)$ will give you $\frac{\overline{BD}}{\overline{BC}}$, i.e. a ratio of real world lengths. So let $B,C$ be two corners of a slab, and let $A$ be the intersection of that line with the vanishing line, then you can measure the position of any point $D$ on that line.

Using homogeneous coordinates to handle infinite values, one can verify this property for a non-deformed situation, and one can also show that the cross ratio is invariant under projective transformations, hence it must be correct in that image as well.

If the vanishing point of a given line is at infinity, like for the horizontal lines in your picture, then they are only subject to an affine transformation, so ratios of lengths on these lines are preserved by the perspective projection.

If you want to measure distance between points which are not located on such a slab-edge line, things become a bit more complicated. Right now I'd suggest you think of the slab directions as coordinate directions. So you have one coordinate direction which is towards the vanishing point at the end of the street, and another coordinate direction orthogonal to that which is horizontal and therefore only subject to affine transformations. You may choose one slab corner as the origin of your coordinate system. Then any point in the ground plane may be projected onto your coordinate axes, by drawing one line connecting it to the end of the road and one line horizontal. This gives you two points which represent the $x$ and $y$ coordinates of the point in question, and which you can measure as described above. You can establish coordinates for all points in this fashion, then use the Pythagorean theorem to compute lengths from that.

Annotated drawing

Of course, all of this depends on an exact drawing. Which doesn't seem to be the case in your drawing: although points $B$ and $D$ are only $4$ slabs apart, the cross ratio measures more than $6$. So either the drawing is inaccurate, or the slabs have different sizes. But if you pay attention, you might notice that even to the trained eye the slabs in the distance look longer than those near by.